随笔-124  评论-194  文章-0  trackbacks-0
 

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 我爱佳娃 阅读(3316) | 评论 (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 我爱佳娃 阅读(10922) | 评论 (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 我爱佳娃 阅读(462) | 评论 (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 
[CMP]libpng-1.2.10.tar.gz      04-May-2006 15:18  813K 
[CMP]libart_lgpl-2.3.17.tar.gz 04-May-2006 15:18  386K 
[CMP]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 我爱佳娃 阅读(12085) | 评论 (1)编辑 收藏
作为作曲,那四年不敢说天天捧着《红楼梦》读,但它确实每时每刻都折磨着我。我想用全部的心血和努力竖一道高墙,让后人们听音乐时感受跨越之艰难,但我相信将来肯定有人超越我。《红楼梦》重拍是很难的,不可擅动,不容亵渎,要有客观虔诚的态度,甚至要付出曹雪芹先生那样的专注和汗水。我不会再重写红楼梦的歌曲了,因为在当初写时我就已经倾尽所有,不是不想写,是无法再写。《红楼梦》音乐不是我凭空想象的,而是在书中苦寻而得,在我心里,曹雪芹如果是作曲家也会这么写。所以我不会参与新版《红楼梦》的音乐制作。

--《红楼梦》作曲王立平语
posted @ 2006-12-04 16:35 我爱佳娃 阅读(2109) | 评论 (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 (-"certs") {
    
if (-"../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);
ifref($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 (-"certs") {
    
if (-"../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";
      
      
ifref($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 我爱佳娃 阅读(2621) | 评论 (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 我爱佳娃 阅读(11829) | 评论 (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 我爱佳娃 阅读(15032) | 评论 (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/(仅服务端)

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

/etc/sysconfig/authconfig

USEDB = no
USEHESIOD
= no
USELDAP
= yes
USENIS
= no
USEKERBEROS
= no
USELDAPAUTH
= yes
USEMD5
= yes
USESHADOW
= yes
USESMBAUTH
= no


/etc/nsswitch.conf


/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 我爱佳娃 阅读(7362) | 评论 (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 我爱佳娃 阅读(2784) | 评论 (2)编辑 收藏
仅列出标题
共13页: First 上一页 5 6 7 8 9 10 11 12 13 下一页