Dev-C++下基本數據類型學習小結
環境: Dev-C++ 4.9.6.0 (gcc/mingw32), 使用-Wall編譯選項
基本類型包括字節型(char)、整型(int)和浮點型(float/double)。
定義基本類型變量時,可以使用符號屬性signed、unsigned(對于char、int),和長度屬性short、long(對
于int、double)對變量的取值區間和精度進行說明。
下面列舉了Dev-C++下基本類型所占位數和取值范圍:
符號屬性???? 長度屬性???? 基本型???? 所占位數???? 取值范圍?????? 輸入符舉例????? 輸出符舉例
--??????????? --????????? char???????? 8???????? -2^7 ~ 2^7-1??????? %c????????? %c、%d、%u
signed??????? --????????? char???????? 8???????? -2^7 ~ 2^7-1??????? %c????????? %c、%d、%u
unsigned????? --????????? char???????? 8???????? 0 ~ 2^8-1?????????? %c????????? %c、%d、%u
[signed]????? short?????? [int]??????? 16??????? -2^15 ~ 2^15-1????????????? %hd
unsigned????? short?????? [int]??????? 16??????? 0 ~ 2^16-1???????????? %hu、%ho、%hx
[signed]????? --?????????? int???????? 32??????? -2^31 ~ 2^31-1????????????? %d
unsigned????? --????????? [int]??????? 32??????? 0 ~ 2^32-1????????????? %u、%o、%x
[signed]????? long??????? [int]??????? 32??????? -2^31 ~ 2^31-1????????????? %ld
unsigned????? long??????? [int]??????? 32??????? 0 ~ 2^32-1???????????? %lu、%lo、%lx
[signed]????? long long?? [int]??????? 64??????? -2^63 ~ 2^63-1???????????? %I64d
unsigned????? long long?? [int]??????? 64??????? 0 ~ 2^64-1????????? %I64u、%I64o、%I64x
--??????????? --????????? float??????? 32?????? +/- 3.40282e+038???????? %f、%e、%g
--??????????? --????????? double?????? 64?????? +/- 1.79769e+308? %lf、%le、%lg?? %f、%e、%g
--??????????? long??????? double?????? 96?????? +/- 1.79769e+308??????? %Lf、%Le、%Lg
幾點說明:
1. 注意! 表中的每一行,代表一種基本類型。“[]”代表可省略。
?? 例如:char、signed char、unsigned char是三種互不相同的類型;
?? int、short、long也是三種互不相同的類型。
?? 可以使用C++的函數重載特性進行驗證,如:
?? void Func(char ch) {}
?? void Func(signed char ch) {}
?? void Func(unsigned char ch) {}
?? 是三個不同的函數。
2. char/signed char/unsigned char型數據長度為1字節;
?? char為有符號型,但與signed char是不同的類型。
?? 注意! 并不是所有編譯器都這樣處理,char型數據長度不一定為1字節,char也不一定為有符號型。
3. 將char/signed char轉換為int時,會對最高符號位1進行擴展,從而造成運算問題。
?? 所以,如果要處理的數據中存在字節值大于127的情況,使用unsigned char較為妥當。
?? 程序中若涉及位運算,也應該使用unsigned型變量。
4. char/signed char/unsigned char輸出時,使用格式符%c(按字符方式);
?? 或使用%d、%u、%x/%X、%o,按整數方式輸出;
?? 輸入時,應使用%c,若使用整數方式,Dev-C++會給出警告,不建議這樣使用。
5. int的長度,是16位還是32位,與編譯器字長有關。
?? 16位編譯器(如TC使用的編譯器)下,int為16位;32位編譯器(如VC使用的編譯器cl.exe)下,int為32
位。
6. 整型數據可以使用%d(有符號10進制)、%o(無符號8進制)或%x/%X(無符號16進制)方式輸入輸出。
?? 而格式符%u,表示unsigned,即無符號10進制方式。
7. 整型前綴h表示short,l表示long。
?? 輸入輸出short/unsigned short時,不建議直接使用int的格式符%d/%u等,要加前綴h。
?? 這個習慣性錯誤,來源于TC。TC下,int的長度和默認符號屬性,都與short一致,
?? 于是就把這兩種類型當成是相同的,都用int方式進行輸入輸出。
8. 關于long long類型的輸入輸出:
?? "%lld"和"%llu"是linux下gcc/g++用于long long int類型(64 bits)輸入輸出的格式符。
?? 而"%I64d"和"%I64u"則是Microsoft VC++庫里用于輸入輸出__int64類型的格式說明。
?? Dev-C++使用的編譯器是Mingw32,Mingw32是x86-win32 gcc子項目之一,編譯器核心還是linux下的gcc。
?? 進行函數參數類型檢查的是在編譯階段,gcc編譯器對格式字符串進行檢查,顯然它不認得"%I64d",
?? 所以將給出警告“unknown conversion type character `I' in format”。對于"%lld"和"%llu",gcc理
所當然地接受了。
?? Mingw32在編譯期間使用gcc的規則檢查語法,在連接和運行時使用的卻是Microsoft庫。
?? 這個庫里的printf和scanf函數當然不認識linux gcc下"%lld"和"%llu",但對"%I64d"和"%I64u",它則是
樂意接受,并能正常工作的。
9. 浮點型數據輸入時可使用%f、%e/%E或%g/%G,scanf會根據輸入數據形式,自動處理。
?? 輸出時可使用%f(普通方式)、%e/%E(指數方式)或%g/%G(自動選擇)。
10. 浮點參數壓棧的規則:float(4 字節)類型擴展成double(8 字節)入棧。
??? 所以在輸入時,需要區分float(%f)與double(%lf),而在輸出時,用%f即可。
??? printf函數將按照double型的規則對壓入堆棧的float(已擴展成double)和double型數據進行輸出。
??? 如果在輸出時指定%lf格式符,gcc/mingw32編譯器將給出一個警告。
11. Dev-C++(gcc/mingw32)可以選擇float的長度,是否與double一致。
12. 前綴L表示long(double)。
??? 雖然long double比double長4個字節,但是表示的數值范圍卻是一樣的。
??? long double類型的長度、精度及表示范圍與所使用的編譯器、操作系統等有關。
posted @
2007-01-23 14:29 我愛佳娃 閱讀(3321) |
評論 (2) |
編輯 收藏
看了幾篇中英文的AJAX庫/框架比較文章,為方便選擇使用,特歸納如下:
首先,要在兩個類別中選擇,一個是編譯類,一個是非編譯類別。
Echo2/GWT是將JAVA代碼編譯成JAVASCRIPT,乍看很方便,不用掌握JS也能做出炫目界面。但這只適于不會或者不想了解JS的情況,對于還是想完全控制和定制界面的項目就不適合。
另外,有一種觀點認為JAVA->JS轉換是一種低級語言向高級語言轉換,本身沒有意義。有點像去學匯編,然后再找個工具把匯編語言代碼轉換成C代碼來用。我雖然沒完全想通這個觀點,不過,我一直用C/C++,這幾年才逐漸發現JAVA確實是一種進化。沒準別人說的是對的呢?
在Echo2和GWT中,GWT大部分工作是在客戶端,盡量少跟SERVER打交道,適合大型網站運用;ECHO2信奉“用到才加載”的信條,所以會有大量向SERVER的訪問,適合企業應用。另外,個人覺得ECHO2是個更全面的的一站式框架,界面也非常炫。但它的開發工具要收費。
再談非編譯類別,它們包括DOJO、PROTOTYPE、JQEURY,下面一一介紹:
先說PROTOTYPE,它比較輕量極,能讓你的代碼更加簡化。最經典莫過于“美圓函數”:
document.getElementById(’elementid’) 變成$(’elementid’)
它加強了JS語言的可開發性,降低了學習JS的門檻。
DOJO最吸引人的是它的事件系統和豐富的可定制組件。它可以用形如下面的語句為各種HTML元素加入事件:
dojo.event.connect(someNode, "onclick", doStuff);
正由于DOJO提供了強大功能,它分成了許多包,可以分別包含使用。
JQUERY也提供了美圓函數,它的插件系統也提供象DOJO的組件,但它沒有PROTOTYPE那樣簡潔,也沒有DOJO這么多的組件供使用,但它兼收兩家優點,并且個頭不大,文檔也算完整,所以說它介乎于前述兩者之間。
所以,如果你需要非常完整的工具組件請用DOJO,如果你想優化你的JS代碼,提高書寫技巧請用PROTOTYPE,如果你想兩者兼顧就用JQUERY。
posted @
2007-01-05 17:24 我愛佳娃 閱讀(10934) |
評論 (6) |
編輯 收藏
?
???? 在實際網絡管理過程中,網絡管理應具有的功能非常廣泛,包括了很多方面。在()SI網絡管理標準中定義了網絡管理的5大功能:配置管理、性能管理、故障管理、安全管理和計費管理,這5大功能是網絡管理最基本的功能。事實上,網絡管理還應該包括其他一些功能,比如網絡規劃、網絡操作人員的管理等。不過除了基本的網絡管理5。大功能,其他的網絡管理功能實現都與具體的網絡實際條件有關,因此我們只需要關注OSI網絡管理標準中的5大功能,其中:
???? (1)配置管理:自動發現網絡拓撲結構,構造和維護網絡系統的配置。監測網絡被管對象的狀態,完成網絡關鍵設備配置的語法檢查,配置自動生成和自動配置備份系統,對于配置的一致性進行嚴格的檢驗。
????(2)故障管理;過濾、歸并網絡事件,有效地發現、定位網絡故障,給出排錯建議與排錯工具,形成整套的故障發現、告警與處理機制。
????(3)性能管理:采集、分析網絡對象的性能數據,監測網絡對象的性能,對網絡線路質量進行分析。同時,統計網絡運行狀態信息,對網絡的使用發展作出評測、估計,為網絡進一步規劃與調整提供依據。
????(4)安全管理:結合使用用戶認證、訪問控制、數據傳輸、存儲的保密與完整性機制,以保障網絡管理系統本身的安全。維護系統日志,使系統的使用和網絡對象的修改有據可查。控制對網絡資源的訪問。
????5)計費管理:對網際互聯設備按IP地址的雙向流量統計,產生多種信息統計報告及流量對比,并提供網絡計費工具,以便用戶根據自定義的要求實施網絡計費。
????下面我們將針對5大功能中每個部分的功能進行具體的描述。
1.配置管理
????(1)配置信息的自動獲取:在一個大型網絡中,需要管理的設備是比較多的,如果每個設備的配置信息都完全依靠管理人員的手工輸入,工作量是相當大的,而且還存在出錯的可能性。對于不熟悉網絡結構的人員來說,這項工作甚至無法完成‘因此,一個先進的網絡管理系統應該具有配置信息自動獲取功能。即使在管理人員不是很熟悉網絡結構和配置狀況的情況下,也能通過有關的技術手段來完成對網絡的配置和管理。在網絡設備的配置信息中,根據獲取手段大致可以分為三類:一類是網絡管理協議標準的MIB中定義的配置信息(包括SNMP;和CMIP協議);二類是不在網絡管理協議標準中有定義,但是對設備運行比較重要的配置信息;三類就是用于管理的一些輔助信息。
????(2)自動配置、自動備份及相關技術:配置信息自動獲取功能相當于從網絡設備中“讀”信息,相應的,在網絡管理應用中還有大量“寫”信息的需求。同樣根據設置手段對網絡配置信息進行分類:一類是可以通過網絡管理協議標準中定義的方法(如SNMP中的set服務)進行設置的配置信息;二類是可以通過自動登錄到設備進行配置的信息;三類就是需要修改的管理性配置信息。
???? (3)配置一致性檢查:在一個大型網絡中,由于網絡設備眾多,而且由于管理的原因,這些設備很可能不是由同一個管理人員進行配置的。實際上‘即使是同一個管理員對設備進行的配置,也會由于各種原因導致配置一致性問題。因此,對整個網絡的配置情況進行一致性檢查是必需的。在網絡的配置中,對網絡正常運行影響最大的主要是路由器端口配置和路由信息配置,因此,要進行、致性檢查的也主要是這兩類信息。
???? (4)用戶操作記錄功能:配置系統的安全性是整個網絡管理系統安全的核心,因此,必須對用戶進行的每一配置操作進行記錄。在配置管理中,需要對用戶操作進行記錄,并保存下來。管理人員可以隨時查看特定用戶在特定時問內進行的特定配置操作。
2.性能管理
????(1)性能監控:由用戶定義被管對象及其屬性。被管對象類型包括線路和路由器;被管對象屬性包括流量、延遲、丟包率、CPU利用率、溫度、內存余量。對于每個被管對象,定時采集性能數據,自動生成性能報告。
???? (2)閾值控制:可對每一個被管對象的每一條屬性設置閾值,對于特定被管對象的特定屬性,可以針對不同的時間段和性能指標進行閾值設置。可通過設置閾值檢查開關控制閡值檢查和告警,提供相應的閾值管理和溢出告警機制。
???? (3)性能分橋:對歷史數據進行分析,統計和整理,計算性能指標,對性能狀況作出判斷,為網絡規劃提供參考。
???? (4)可視化的性能報告:對數據進行掃描和處理,生成性能趨勢曲線,以直觀的圖形反映性能分析的結果。
???? (5)實時性能監控:提供了一系列實時數據采集;分析和可視化工具,用以對流量、負載、丟包、溫度、內存、延遲等網絡設備和線路的性能指標進行實時檢測,可任意設置數據采集間隔。
????(6)網絡對象性能查詢:可通過列表或按關鍵字檢索被管網絡對象及其屬性的性能記錄。
3.故障管理
???? (1)故障監測:主動探測或被動接收網絡上的各種事件信息,并識別出其中與網絡和系統故障相關的內容,對其中的關鍵部分保持跟蹤,生成網絡故障事件記錄。
???? (2)故障報警:接收故障監測模塊傳來的報警信息,根據報警策略驅動不同的報警程序,以報警窗口/振鈴(通知一線網絡管理人員)或電子郵件(通知決策管理人員)發出網絡嚴重故障警報。
???? (3)故障信息管理:依靠對事件記錄的分析,定義網絡故障并生成故障卡片,記錄排除故障的步驟和與故障相關的值班員日志,構造排錯行動記錄,將事件-故障-日志構成邏輯上相互關聯的整體,以反映故障產生、變化、消除的整個過程的各個方面。
???? (4)排錯支持工具:向管理人員提供一系列的實時檢測工具,對被管設備的狀況進行測試并記錄下測試結果以供技術人員分析和排錯;根據已有的徘錯經驗和管理員對故障狀態的描述給出對徘錯行動的提示。
???? (5)檢索/分析故障信息:瀏閱并且以關鍵字檢索查詢故障管理系統中所有的數據庫記錄,定期收集故障記錄數據,在此基礎上給出被管網絡系統、被管線路設備的可靠性參數。
4.安全管理
???? 安全管理的功能分為兩部分,首先是網絡管理本身的安全,其次是被管網絡對象的安全。
????網絡管理過程中,存儲和傳輸的管理和控制信息對網絡的運行和管理至關重要,一旦泄密、被篡改和偽造,將給網絡造成災難性的破壞。網絡管理本身的安全由以下機制來保證:
???? (1)管理員身份認證,采用基于公開密鑰的證書認證機制;為提高系統效率,對于信任域內(如局域網)的用戶,可以使用簡單口令認證。
???? (2)管理信息存儲和傳輸的加密與完整性,Web瀏覽器和網絡管理服務器之間采用安全套接字層(SSL)傳輸協議,對管理信息加密傳輸并保證其完整性;內部存儲的機密信息,如登錄口令等,也是經過加密的。
???? (3)網絡管理用戶分組管理與訪問控制,網絡管理系統的用戶(即管理員)按任務的不同分成若干用戶組,不同的用戶組中有不同的權限范圍,對用戶的操作由訪問控制檢查,保證用戶不能越權使用網絡管理系統。
???? (4)系統日志分析,記錄用戶所有的操作,使系統的操作和對網絡對象的修改有據可查,同時也有助于故障的跟蹤與恢復。
???? 網絡對象的安全管理有以下功能:
???? (1)網絡資源的訪問控制,通過管理路由器的訪問控制鏈表,完成防火墻的管理功能,即從網絡層(1P)和傳輸層(TCP)控制對網絡資源的訪問,保護網絡內部的設備和應用服務,防止外來的攻擊。
???? (2)告警事件分析,接收網絡對象所發出的告警事件,分析員安全相關的信息(如路由器登錄信息、SNMP認證失敗信息),實時地向管理員告警,并提供歷史安全事件的檢索與分析機制,及時地發現正在進行的攻擊或可疑的攻擊跡象。
???? (3)主機系統的安全漏洞檢測,實時的監測主機系統的重要服務(如WWW,DNS等)的狀態,提供安全監測工具,以搜索系統可能存在的安全漏洞或安全隱患,并給出彌補的措施。
???? 總之,網絡管理通過網關(即邊界路由器)控制外來用戶對網絡資源的訪問,以防止外來的攻擊;通過告警事件的分析處理,以發現正在進行的可能的攻擊;通過安全漏洞檢擒來發現存在的安全隱患,以防患于未然。
5.計費管理
???? (1)計費數據采集:計費數據采集是整個計費系統的基礎,但計費數據采集往往受到采集設備硬件與軟件的制約,而且也與進行計費的網絡資源有關。
???? (2)數據管理與數據維護:計費管理人工交互性很強,雖然有很多數據維護系統自動完成,但仍然需要人為管理,包括交納費用的輸入、聯網單位信息維護,以及賬單樣式決定等。
???? (3)計費政策制定;由于計費政策經常靈活變化,因此實現用戶自由制定輸入計費政策尤其重要。這樣需要一個制定計費政策的友好人機界面和完善的實現計費政策的數據模型。
???? (4)政策比較與決策支持:計費管理應該提供多套計費政策的數據比較,為政策制訂提供決策依據。
???? (5)數據分析與費用計算:利用采集的網絡資源使用數據,聯網用戶的詳細信息以及計費政策計算網絡用戶資源的使用情況,并計算出應交納的費用。
???? (6)數據查詢:提供給每個網絡用戶關于自身使用網絡資源情況的詳細信息,網絡用戶根據這些信息可以計算、核對自己的收費情況。
|
posted @
2006-12-25 10:41 我愛佳娃 閱讀(479) |
評論 (0) |
編輯 收藏
下載
進入
http://oss.oetiker.ch/rrdtool/pub/
下載最新的RRDTool
再進入
http://oss.oetiker.ch/rrdtool/pub/libs/
下載所需要庫:
freetype-2.1.10.tar.bz2 04-May-2006 15:18 1.0M
libpng-1.2.10.tar.gz 04-May-2006 15:18 813K
libart_lgpl-2.3.17.tar.gz 04-May-2006 15:18 386K
zlib-1.2.3.tar.gz 18-Jul-2005 15:38 485K
設置目錄
設置安裝目錄及編譯目錄:
BUILD_DIR=/tmp/rrdbuild
INSTALL_DIR=/usr/local/rrdtool-1.2.15
mkdir -p $BUILD_DIR
cd $BUILD_DIR
把下載的所有庫放入這個目錄
編譯Zlib
tar zxf zlib-1.2.3.tar.gz
cd zlib-1.2.3
env CFLAGS="-O3 -fPIC" ./configure --prefix=$BUILD_DIR/lb
make
make install
編譯LibPng
tar zxvf libpng-1.2.10.tar.gz
cd libpng-1.2.10
env CPPFLAGS="-I$BUILD_DIR/lb/include" LDFLAGS="-L$BUILD_DIR/lb/lib" CFLAGS="-O3 -fPIC" \
./configure --disable-shared --prefix=$BUILD_DIR/lb
make
make install
編譯FreeType
tar jxvf freetype-2.1.10.tar.bz2
cd freetype-2.1.10
env CPPFLAGS="-I$BUILD_DIR/lb/include" LDFLAGS="-L$BUILD_DIR/lb/lib" CFLAGS="-O3 -fPIC" \
./configure --disable-shared --prefix=$BUILD_DIR/lb
make
make install
注意:此處解壓是帶"j"參數,因為是bz2包;其它是帶"z"參數
編譯libart_lgpl
tar zxvf libart_lgpl-2.3.17.tar.gz
cd libart_lgpl-2.3.17
env CFLAGS="-O3 -fPIC" ./configure --disable-shared --prefix=$BUILD_DIR/lb
make
make install
編譯RRDTool
IR=-I$BUILD_DIR/lb/include
CPPFLAGS="$IR $IR/libart-2.0 $IR/freetype2 $IR/libpng"
LDFLAGS="-L$BUILD_DIR/lb/lib"
CFLAGS=-O3
export CPPFLAGS LDFLAGS CFLAGS
./configure --prefix=$INSTALL_DIR --disable-python --disable-tcl
make clean
make
make install
最后,可以將BIN目錄加入PATH:
export PATH=/usr/local/rrdtool-1.2.15/bin:$PATH
使用要點
建庫
rrdtool create test.rrd \
--start 920804400 \
DS:speed:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:24 \
RRA:AVERAGE:0.5:6:10
DS是數據源,默認是5分鐘采一次,6:10表示,每隔5分鐘采一次,共采6次計算一次平均值(即半小時),并留10次這樣的平均值(保留5小時數據)
加入數據
rrdtool update test.rrd 920808300:12420
即以time:value對的方式向它添加
出圖
rrdtool graph speed.png \
--start 920804400 --end 920808000 \
DEF:myspeed=test.rrd:speed:AVERAGE \
LINE2:myspeed#FF0000
LINE2表示用2象素的線來畫,FF0000是紅色
DEF是定義一個變量
計算后出圖
rrdtool graph speed3.png \
--start 920804400 --end 920808000 \
--vertical-label km/h \
DEF:myspeed=test.rrd:speed:AVERAGE \
"CDEF:kmh=myspeed,3600,*" \
CDEF:fast=kmh,100,GT,kmh,0,IF \
CDEF:good=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good speed" \
AREA:fast#FF0000:"Too fast"
CDEF是計算變量
kmh=myspeed,3600,*表示,kmh是myspeed*3600,引號是為防止*被誤解
kmh,100,GT,kmh,IF表示,((( kmh,100 ) GT ), 0, kmh) IF,也即判斷是kmh大于100取0值,否則取值kmh
HRULE是畫一條警戒線
DS種類
COUNTER - 持續增長值,RRD會前后相減再除時間計算平均值
GAUGE - 測量值,RRD不做處理,直接存
DERIVE - 變化值可以為負,其它與COUNTER一致
ABSOLUTE - 也是不改變其值,直接存(與GAUGE有何區別呢?)
最大值的WRAP
當到達最大值時,COUNTER會被RESET,導致前后兩值相減為負,這不符合COUNTER的定義,所以它會嘗試使用32位的最大值與這個負值相加來得到正常的正值,如果還是負,它會嘗試用64位的最大值來使它變正。大部分情況可以處理。
以上內容主要參考如下網頁:
http://oss.oetiker.ch/rrdtool/doc/rrdbuild.en.html
http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html
posted @
2006-12-06 18:45 我愛佳娃 閱讀(12099) |
評論 (1) |
編輯 收藏
作為作曲,那四年不敢說天天捧著《紅樓夢》讀,但它確實每時每刻都折磨著我。我想用全部的心血和努力豎一道高墻,讓后人們聽音樂時感受跨越之艱難,但我相信將來肯定有人超越我。《紅樓夢》重拍是很難的,不可擅動,不容褻瀆,要有客觀虔誠的態度,甚至要付出曹雪芹先生那樣的專注和汗水。我不會再重寫紅樓夢的歌曲了,因為在當初寫時我就已經傾盡所有,不是不想寫,是無法再寫。《紅樓夢》音樂不是我憑空想象的,而是在書中苦尋而得,在我心里,曹雪芹如果是作曲家也會這么寫。所以我不會參與新版《紅樓夢》的音樂制作。
--《紅樓夢》作曲王立平語
posted @
2006-12-04 16:35 我愛佳娃 閱讀(2134) |
評論 (11) |
編輯 收藏
用
用OpenSSL與JAVA(JSSE)通信一文中所生成的CA證書及keystore就可以在JAVA和OpenSSL之間通信了,下面以Perl代碼為例:(Perl實際使用了OpenSSL)
下面的CLIENT端可以與前文提到的JAVA服務端通信:
#use?strict;
use?IO::Socket::SSL(debug4);

my?($v_mode,?$sock,?$buf);

if($ARGV[0]?eq?"DEBUG")?{?$IO::Socket::SSL::DEBUG?=?1;?}

#?Check?to?make?sure?that?we?were?not?accidentally?run?in?the?wrong
#?directory:
unless?(-d?"certs")?{
????if?(-d?"../certs")?{
????chdir?"..";
????}?else?{
#????die?"Please?run?this?example?from?the?IO::Socket::SSL?distribution?directory!\n";
????}
}

if(!($sock?=?IO::Socket::SSL->new(?PeerAddr?=>?'172.19.149.52',
???????????????????PeerPort?=>?'5555',
???????????????????Proto????=>?'tcp',
???????????????????SSL_verify_mode?=>?0x01,
???????????????????SSL_ca_file?=>?'mycerts/cacert.pem',
?????????????????)))?{
????warn?"unable?to?create?socket:?",?&IO::Socket::SSL::errstr,?"\n";
????exit(0);
}?else?{
????warn?"connect?($sock).\n"?if?($IO::Socket::SSL::DEBUG);
}

#?check?server?cert.
my?($subject_name,?$issuer_name,?$cipher);
if(?ref($sock)?eq?"IO::Socket::SSL")?{
????$subject_name?=?$sock->peer_certificate("subject");
????$issuer_name?=?$sock->peer_certificate("issuer");
????$cipher?=?$sock->get_cipher();
}
warn?"cipher:?$cipher.\n",?"server?cert:\n",?
????"\t?'$subject_name'?\n\t?'$issuer_name'.\n\n";

print?$sock?"Knock,?knock.\n";

my?($buf)?=?$sock->getlines;

$sock->close();

print?"read:?'$buf'.\n";

另外,也給出一個PERL的SVR端示例:
#use?strict;
use?IO::Socket::SSL(debug4);


my?($sock,?$s,?$v_mode);

if($ARGV[0]?eq?"DEBUG")?{?$IO::Socket::SSL::DEBUG?=?1;?}

#?Check?to?make?sure?that?we?were?not?accidentally?run?in?the?wrong
#?directory:
unless?(-d?"certs")?{
????if?(-d?"../certs")?{
????chdir?"..";
????}?else?{
#????die?"Please?run?this?example?from?the?IO::Socket::SSL?distribution?directory!\n";
????}
}

if(!($sock?=?IO::Socket::SSL->new(?Listen?=>?5,
???????????????????LocalAddr?=>?'10.56.28.35',
???????????????????LocalPort?=>?9000,
???????????????????Proto?????=>?'tcp',
???????????????????Reuse?????=>?1,
???????????????????SSL_use_cert?=>?1,
???????????????????SSL_verify_mode?=>?0x00,
???????????????????SSL_cert_file?=>?'mycerts/cert.pem',
???????????????????SSL_key_file?=>?'mycerts/key.pem'???????????????????
?????????????????))?)?{
????warn?"unable?to?create?socket:?",?&IO::Socket::SSL::errstr,?"\n";
????exit(0);
}
warn?"socket?created:?$sock.\n";

while?(1)?{
??warn?"waiting?for?next?connection.\n";
??
??while(($s?=?$sock->accept()))?{
??????my?($peer_cert,?$subject_name,?$issuer_name,?$date,?$str);
??????
??????if(?!?$s?)?{
??????warn?"error:?",?$sock->errstr,?"\n";
??????next;
??????}
??????
??????warn?"connection?opened?($s).\n";
??????
??????if(?ref($sock)?eq?"IO::Socket::SSL")?{
??????$subject_name?=?$s->peer_certificate("subject");
??????$issuer_name?=?$s->peer_certificate("issuer");
??????}
??????
??????warn?"\t?subject:?'$subject_name'.\n";
??????warn?"\t?issuer:?'$issuer_name'.\n";
??
??????my?$date?=?localtime();
??????print?$s?"my?date?command?says?it's:?'$date'";
??????close($s);
??????warn?"\t?connection?closed.\n";
??}
}


$sock->close();

warn?"loop?exited.\n";在PERL中寫SSL的SOCKET,要注意:
SVR端中:
?????? SSL_use_cert => 1,
?????? SSL_verify_mode => 0x00,
?????? SSL_cert_file => 'mycerts/cert.pem',
?????? SSL_key_file => 'mycerts/key.pem'
CLI端是:
?????? SSL_verify_mode => 0x01,
?????? SSL_ca_file => 'mycerts/cacert.pem',
mode是0表示,不認證對端,是1表示要認證對方。
posted @
2006-12-04 15:20 我愛佳娃 閱讀(2631) |
評論 (2) |
編輯 收藏
摘要: 概念
JAVA使用keystore文件來存儲所有KEY,keystore文件可以存放多個KEY,訪問它需要密碼。下面我介紹下如何將用OpenSSL做自簽名的證書一文中介紹的OpenSSL產生的KEY與JAVA的KEY轉換后使用,從而達到JAVA與OpenSSL通信的目的。用OpenSSL生成CA根證書,即(P1,V1)此步驟參見用OpenSSL做自簽名的證書一文在JAVA環境下生成自己的...
閱讀全文
posted @
2006-12-03 12:36 我愛佳娃 閱讀(11851) |
評論 (7) |
編輯 收藏
這里抄錄
LDAP+OpenSSL集中認證配置一文的一部分:
公私鑰:公鑰可以唯一解密私鑰加密過的數據,反之亦然。以下用P指代公鑰,V指代私鑰。
SSL過程:需要兩對公私鑰(P1,V1),(P2,V2),假設通信雙方是A和B,B是服務器,A要確認和它通信的是B:
A->B: hello
B->A: 用V2加密過的P1(即用戶證書,A就用P2解密出P1)
A->B: ok
B->A: 用V1加密的一段信息
A->B: 用P1加密一個自動生成的K(用之前的P1解密成功這段信息則認為B是可信的了)
B->A: 用K加密的數據(之后兩對密鑰功能結束,由K來加解密數據)
這里,P2就是第3方的CA證書,由于非對稱加密很慢,所以公私鑰只是用來保證K的傳送安全,之后通信是用K的對稱加密算法來保證。
為什么通過以上過程A就能夠確定肯定是B,而不是某個C在假裝B了呢?因為這個過程中,B用V1加密過一段信息發給A,A也成功解開了。我們開頭談到公鑰(P1)只可以唯一解密私鑰(V1)加密過的信息,這樣A就可以完全相信B是擁有V1的,而V1是嚴格保密,只被服務提供公司擁有,所以保證了通信的服務方正確性。
這里(P2,V2)就是certificate authority (CA)用來給客戶簽名用的公私鑰。
(P1,V1)是客戶自己的公私鑰,提交給CA,CA所做的事情就是用(P2,V2)來給客戶的(P1,V1)簽名,簡單吧?
V2是CA公司要保密的,而P2就是公用CA證書。用V2加密過(簽名過)的P1,稱為用戶證書,一般被安裝在服務器端。
下面我們OpenSSL來做這一整件事情。
先生成CA的公私鑰(Root Certificate )
準備工作
mkdir CA
cd CA
mkdir newcerts private
echo '01' > serial
touch index.txt
生成配置文件。由于openssl命令行參數太多,所以就用文件來組織各種選項。
其中,req_distinguished_name 節表示需要提示用戶輸入的信息。
v3_ca是有關CA公私鑰生成的,v3_req是有關用戶證書生成的。
ca_default是用CA公私鑰簽名的時候,用戶證書的默認信息。
vi ./openssl.cnf
dir = .

[ req ]
default_bits = 1024 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Variable name Prompt string
#---------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64

# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------------ ------------------------------
0.organizationName_default = EB Company
localityName_default = Shen Zhen
stateOrProvinceName_default = Guan Dong
countryName_default = CN

[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash


[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match

[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
生成CA公私鑰:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
會提示輸入密碼,當用它給用戶證書簽名時需要輸入,以避免其它人用它隨意產生用戶證書。
-days表示有效期,因為它是根證書,所以時間一定要很長,否則由它生成的用戶證書容易過期。
這時就生成了:
P1
cacert.pem
V1
private/cakey.pem
查看信息用:
openssl x509 -in cacert.pem -noout -text
生成P2,V2,即Certificate Signing Request (CSR)
執行:
openssl req -new -nodes -out req.pem -config ./openssl.cnf
這樣就生成了:
P2
req.pem
V2
key.pem
用此命令查看:
openssl req -in req.pem -text -verify -noout
用CA的私鑰V1為P2簽名,即生成用戶證書
執行:
openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
生成用戶證書:
cert.pem
此時,會拷貝一份到newcerts目錄下。并會更新數據庫文件:index.txt以及serail文件
用命令查看:
openssl x509 -in cert.pem -noout -text -purpose | more
如果要去除可讀信息部分,執行:
mv cert.pem tmp.pem
openssl x509 -in tmp.pem -out cert.pem
安裝證書
key.pem(V2)和cert.pem(用V1加密過的P2)安裝到服務端
有的服務器需要把這兩個文件連為一個,可以執行:
cat key.pem cert.pem >key-cert.pem
cacert.pem安裝到客戶端
Apache的配置:
File Comment
/home/httpd/html Apache DocumentRoot
/home/httpd/ssl SSL-related files
/home/httpd/ssl/cert.pem Site certificate
/home/httpd/ssl/key.pem Site private key
Stunnel的配置
stunnel -p /etc/ssl/certs/key-cert.pem
編輯于08.4.26,另有兩個例子:
用OpenSSL與JAVA(JSSE)通信
Perl與Java的SSL通信示例
posted @
2006-12-01 15:20 我愛佳娃 閱讀(15065) |
評論 (14) |
編輯 收藏
基本概念
LDAP是以樹方式組織的數據庫。每個節點可以有什么值是通過類來定義。
LINUX或者其它應用的認證就是來BIND LDAP樹上的節點,如果能夠BIND,就算認證成功。
要改變LINUX認證方式,需要讓名字服務NSCD能夠到LDAP查找用戶,這需要nss_ldap.so。
得到用戶后,再到LDAP去認證,這需要pam_ldap.so實現。
公私鑰:公鑰可以唯一解密私鑰加密過的數據,反之亦然。
SSL過程:需要兩對公私鑰(P1,V1),(P2,V2),假設通信雙方是A和B,B是服務器,A要確認和它通信的是B:
A->B: hello
B->A: 用V2加密過的P1(即用戶證書,A就用P2解密出P1)
A->B: ok
B->A: 用V1加密的一段信息
A->B: 用P1加密一個自動生成的K(用之前的P1解密成功這段信息則認為B是可信的了)
B->A: 用K加密的數據(之后兩對密鑰功能結束,由K來加解密數據)
這里,P2就是第3方的CA證書,由于非對稱加密很慢,所以公私鑰只是用來保證K的傳送安全,之后通信是用K的對稱加密算法來保證。
需要安裝的組件
Berkeley DB 4.2.52 or later - http://www.sleepycat.com/(僅服務端)
NSS_LDAP 2.2.X or PAM_LDAP 1.6.X or later – http://www.padl.com/(僅客戶端)
OpenSSL 0.9.7e or later – http://www.openssl.org/
OpenLDAP 2.3.XX or later - http://www.openldap.org/(僅服務端)
#?cd?openldap-
2.3
.XX
#?./configure?--prefix
=
/usr?--sysconfdir
=
/etc?--libexecdir
=
/usr/sbin?--mandir
=
/usr/share/man?--enable-bdb?--enable-crypt?--with-tls?--without-cyrus-sasl?--enable-ldbm
#?make?depend
#?make?clean
#?make
#?make?install
OpenSSH: http://www.openssh.org/
#?cd?/var/tmp
#?tar?xvf?openssh-
3
.X.XpX.tar
#?cd?openssh-
3
.X.XpX
#?./configure?--prefix
=
/usr?--with-pam?--sysconfdir
=
/etc/ssh?--with-ssl-dir
=
/usr
需要修改的文件
服務器端:
/etc/openldap/slapd.conf
include???/etc/openldap/schema/core.schema
include???/etc/openldap/schema/cosine.schema
include???/etc/openldap/schema/inetorgperson.schema
include???/etc/openldap/schema/nis.schema


loglevel?-
1
access?to?attrs
=
shadowLastChange
,
userPassword
??????by?self?write
??????by?*?auth

access?to?*
??????by?*?read

TLSCipherSuite??HIGH:MEDIUM:+SSLv2
TLSCACertificateFile?/etc/openldap/cacert.pem
TLSCertificateFile?/etc/openldap/slapd-cert-ldap1.pem
TLSCertificateKeyFile?/etc/openldap/slapd-key-ldap1.pem

TLSVerifyClient?never?

database????bdb
suffix????????
"
dc=example,dc=com
"
rootdn????????
"
cn=Manager,dc=example,dc=com
"
rootpw????????secret
directory???????????????/var/lib/ldap
index????objectClass????eq
客戶端:
/etc/ldap.conf
host?ldap1.example.com
base?dc
=
example
,
dc
=
com
ssl?start_tls
tls_cacertfile?/tmp/cacert.pem
??????/etc/pam.d/system-auth
auth????????required??????/lib/security/$ISA/pam_env.so
auth????????sufficient????/lib/security/$ISA/pam_unix.so?likeauth?nullok
auth????????sufficient????/lib/security/$ISA/pam_ldap.so?use_first_pass
auth????????required??????/lib/security/$ISA/pam_deny.so

account?????sufficient?/lib/security/$ISA/pam_ldap.so
account?????required??????/lib/security/$ISA/pam_unix.so?broken_shadow

password????required??????/lib/security/$ISA/pam_cracklib.so?retry
=
3
?type
=
password????sufficient????/lib/security/$ISA/pam_unix.so?nullok?use_authtok?md5?shadow
password????required??????/lib/security/$ISA/pam_deny.so

session?????required??????/lib/security/$ISA/pam_limits.so
session?????required??????/lib/security/$ISA/pam_unix.so
/etc/sysconfig/authconfig
USEDB
=
no
USEHESIOD
=
no
USELDAP
=
yes
USENIS
=
no
USEKERBEROS
=
no
USELDAPAUTH
=
yes
USEMD5
=
yes
USESHADOW
=
yes
USESMBAUTH
=
no
/etc/nsswitch.conf
passwd:?????files?ldap
shadow:?????files
group:??????files?ldap

hosts:??????files?dns

bootparams:?nisplus?
[
NOTFOUND=return
]
?files

ethers:?????files
netmasks:???files
networks:???files
protocols:??files?ldap
rpc:????????files
services:???files?ldap

netgroup:???files?ldap

publickey:??nisplus

automount:??files?ldap
aliases:????files?nisplus
/etc/hosts
127.0.0.1
???????MD_Mother_HDA?localhost
10.56.28.33
?????ldap1.example.com
/etc/ssh/sshd_config
PasswordAuthentication?yes

ChallengeResponseAuthentication?yes

UsePAM?yes

Subsystem???????sftp????/usr/libexec/sftp-server
需要重啟的服務
service nscd restart???????
service sshd restart
另外,這個文件是LDAP命令使用的,不是系統認證所需:
/etc/openldap/ldap.conf
開始的時候可以不要SSL認證,只需要注釋掉ldap.conf中start_tls一句即可。另外,SSL要求驗證服務器,所以一定要在/etc/hosts文件里加入服務器完整名字,并與SSL證書中一致。
posted @
2006-11-28 15:56 我愛佳娃 閱讀(7382) |
評論 (5) |
編輯 收藏
數碼相機可沖印照片尺寸對照表
要達到滿意的數碼擴印效果:
照片規格(英寸)???? (厘米)?????? (像素)????? ?數碼相機類型
???1寸?????????? 2.5*3.5cm?????? 413*295
?? 身份證大頭照? 3.3*2.2???????? 390*260
?? 2寸?????????? 3.5*5.3cm????? ?626*413
?? 小2寸(護照) 4.8*3.3cm?????? 567*390
5 寸 5x3.5??? 12.7*8.9??????? 1200x840以上? 100萬像素
6 寸 6x4????? 15.2*10.2?????? 1440x960以上? 130萬像素
7 寸 7x5????? 17.8*12.7?????? 1680x1200以上 200萬像素
8 寸 8x6????? 20.3*15.2???????1920x1440以上 300萬像素
10寸 10x8????? 25.4*20.3???????2400x1920以上 400萬像素
12寸 12x10???? 30.5*20.3?????? 2500x2000以上 500萬像素
15寸 15x10???? 38.1*25.4????? ?3000x2000???? 600萬像素
另外,數碼的片子別管像素是幾百萬,只看長邊的像素數,1200出5寸
1400出6寸,1700出7寸,類推。。。
1寸(是指英寸)=2.54cm
我們說的x寸是指照片的長邊,如5寸就是照片長2.54x5=12.7cm
12寸就是2.54x12=30.5cm ,
8x12就是長邊2.54x12=30.5cm ,短邊2.54x8=20.3cm
3R指紙,3R為89MM,5R為127MM
通常3R指3*5 就是5寸 5R指5*7 就是7寸
R的意思是長方型(英文是Rectangle),都以最短邊耒算.
像135機拍的相片大都洗成3R,4R或5R以上,如果120機的6X7底洗成 3R相片,那它就沒"3寸 X 5寸"了,它按照比例出片是"3寸 x 3.5寸"了,這也算是3R相片,還有3寸一定要足夠.
又像120哈蘇6X6底出的相片,因它的底片是正四方型,如果要出正四方的相片,如"3寸 X 3寸", "5寸 X 5寸",在這種情行我們不叫3R,而是3S或5S,S代表正四方型(英文是Square).
數碼相機拍攝的照片一般是4:3的比例(與我們的顯示器的比例一致),而擴印的照片的比例一般是3:2左右的(與膠卷負片的長寬比例一致),所以,講數碼相機的照片擴印出來一般要把照片的比例剪裁成3:2左右的,這樣擴印出來的照片才是正好充滿整張相紙。如果,您的照片不希望剪裁,或者是拍攝的內容太滿,沒有剪裁的余地,就只好在擴印的時候左右兩邊留一點白邊了。
比如:您的照片是1600*1200的即比例是4:3的
而6寸照片是15.2*10.2的即比例是3:2的
如果您的照片不剪裁,4:3比例的照片放在3:2的相紙上面
只能照片的兩邊各留一點白邊了,就像兩邊加了白框(上下不加)
如果不想留白邊,可以把照片的上面或下面剪裁掉一些,
使照片成為1600*1074的 (1600/15.2*10.2=1074),這樣就是3:2了,
正好放滿整張6寸相紙了。
8寸照片的規格是6*8(15.2*20.3cm)比例是4:3的,擴印大多數數碼照片是正好不用剪裁的。
常用照片尺寸
照片規格(英寸) (厘米) (像素) 數碼相機類型
1寸 2.5*3.5cm 413*295
身份證大頭照 3.3*2.2 390*260
2寸 3.5*5.3cm 626*413
小2寸(護照) 4.8*3.3cm 567*390
5 寸 5x3.5 12.7*8.9 1200x840以上 100萬像素
6 寸 6x4 15.2*10.2 1440x960以上 130萬像素
7 寸 7x5 17.8*12.7 1680x1200以上 200萬像素
8 寸 8x6 20.3*15.2 1920x1440以上 300萬像素
10寸 10x8 25.4*20.3 2400x1920以上 400萬像素
12寸 12x10 30.5*20.3 2500x2000以上 500萬像素
15寸 15x10 38.1*25.4 3000x2000 600萬像素
常見證件照對應尺寸
1英寸25mm×35mm
2英寸35mm×49mm
3英寸35mm×52mm
港澳通行證33mm×48mm
赴美簽證50mm×50mm
日本簽證45mm×45mm
大二寸35mm×45mm
護照33mm×48mm
畢業生照33mm×48mm
身份證22mm×32mm
駕照21mm×26mm
車照60mm×91mm
名片
橫版:90*55mm<方角> 85*54mm<圓角> 豎版:50*90mm<方角> 54*85mm<圓角> 方版:90*90mm 90*95mm
IC卡
85x54MM
三折頁廣告
標準尺寸: (A4)210mm x 285mm
普通宣傳冊
標準尺寸: (A4)210mm x 285mm
文件封套
標準尺寸:220mm x 305mm
招貼畫
標準尺寸:540mm x 380mm
掛旗
標準尺寸:8開 376mm x 265mm 4開 540mm x 380mm
手提袋
標準尺寸:400mm x 285mm x 80mm
信紙 便條
標準尺寸:185mm x 260mm 210mm x 285mm
正度紙張:
787×1092mm 開數(正度) 尺寸 單位(mm) 全開 781×1086 2開 530×760 3開 362×781 4開 390×543 6開 362×390 8開 271×390 16開 195×271 注:成品尺寸=紙張尺寸-修邊尺寸
大度紙張:
850*1168mm 開數(正度) 尺寸 單位(mm) 全開 844×1162 2開 581×844 3開 387×844 4開 422×581 6開 387×422 8開 290×422 注:成品尺寸=紙張尺寸-修邊尺寸
常見開本尺寸
(單位:mm) 開本尺寸:787 x 1092 對開:736 x 520 4開:520 x 368 8開:368 x 260 16開:260 x 184 32開:184 x 130 開本尺寸(大度):850 x 1168 對開:570 x 840 4開:420 x 570 8開:285 x 420 16開:210 x 285 32開:203 x 140
有關新聞紙資料
新聞紙尺寸有:547mm×392mm、545mm×370mm常見新聞紙又有以下幾種規格平板紙規格:787×1092毫米,850x ll68毫米, 880x l230毫米。卷筒紙規格:寬度787毫米,1092毫米, 1575毫米;長度約6000~8000米。
CD一般設計大小
1、內頁:123*1262、底封:157*1243、碟面:外圈_118、內圈_36或是25要達到滿意的數碼擴印效果:照片規格(英寸) (厘米) (像素) 數碼相機類型1寸 2.5*3.5cm 413*295 身份證大頭照 3.3*2.2 390*2602寸 3.5*5.3cm 626*413小2寸(護照) 4.8*3.3cm 567*390 5 寸 5x3.5 12.7*8.9 1200x840以上 100萬像素6 寸 6x4 15.2*10.2 1440x960以上 130萬像素7寸 7x5 17.8*12.7 1680x1200以上 200萬像素8寸 8x6 20.3*15.2 1920x1440以上 300萬像素10寸 10x8 25.4*20.3 2400x1920以上 400萬像素12寸 12x10 30.5*20.3 2500x2000以上 500萬像素 15寸 15x10 38.1*25.4 3000x2000 600萬像素
?
posted @
2006-11-26 17:27 我愛佳娃 閱讀(2803) |
評論 (2) |
編輯 收藏