linux服务之openldap
http://www.openldap.org/
http://blog.csdn.net/chinalinuxzend/article/details/1870656 OpenLDAP学习笔记
http://www.ttlsa.com/linux/openldap-openssh-lpk-sudo-tls-auth/ LINUX下基于LDAP集中系统用户认证系统
http://directory.apache.org/api/ apache dierctory
http://blog.csdn.net/zmxj/article/details/369456 ldap目录树的结构
在安装配置任何一个服务器时,尽量养成一个好习惯,就是在命令行下使用bash内置的目录栈命令,因为要固定的用那么几个命令,目录栈此时正好用上。
svn,httpd,openldap服务器配置目录与数据目录比较
[root@host02 ~]# cd /mnt/sharerepo/
[root@host02 sharerepo]# ls
aa.log client conf server terminal wuliu
[root@host02 server]# ls
conf db format hooks locks README.txt
[root@host02 db]# ll
total 672
-rw-rw-rw-+ 1 96 96 2 Nov 11 01:39 current
-r--r--r--+ 1 96 96 22 Oct 28 13:53 format
-rw-rw-rw-+ 1 96 96 1920 Oct 28 13:53 fsfs.conf
-rw-rw-rw-+ 1 96 96 5 Oct 28 13:53 fs-type
-rw-rw-rw-+ 1 96 96 2 Oct 28 13:53 min-unpacked-rev
-rw-r--r--+ 1 96 96 636928 Nov 11 01:39 rep-cache.db
drwxrwsrwx+ 3 96 96 4096 Oct 28 13:53 revprops
drwxrwsrwx+ 3 96 96 4096 Oct 28 13:53 revs
drwxrwsrwx+ 2 96 96 4096 Nov 11 01:39 transactions
-rw-rw-rw-+ 1 96 96 2 Nov 10 23:18 txn-current
-rw-rw-rw-+ 1 96 96 0 Oct 28 13:53 txn-current-lock
drwxrwsrwx+ 2 96 96 4096 Nov 11 01:39 txn-protorevs
-rw-rw-rw-+ 1 96 96 37 Oct 28 13:53 uuid
-rw-rw-rw-+ 1 96 96 0 Oct 28 13:53 write-lock svn的配置目录
/mnt/sharerepo/server/conf
svn的数据目录
/mnt/sharerepo/server/db httpd的配置目录
/etc/httpd/conf/
httpd的数据目录
/var/www/html/ openldap的配置目录
10:24:28 43 /usr/local/etc/openldap:#ll
total 40
-rw-r--r--. 1 root root 618 Nov 13 10:06 1.ldif
-rw-------. 1 root root 845 Nov 2 17:22 DB_CONFIG.example
-rw-r--r--. 1 root root 245 Nov 2 17:22 ldap.conf
-rw-r--r--. 1 root root 245 Nov 2 17:22 ldap.conf.default
drwxr-xr-x. 2 root root 4096 Nov 2 17:22 schema
-rw-------. 1 root root 1956 Nov 5 17:34 slapd.conf
-rw-------. 1 root root 2129 Nov 2 17:22 slapd.conf.default
drwxr-xr-x. 2 root root 4096 Nov 13 10:02 slapd.d
-rw-------. 1 root root 2626 Nov 5 17:17 slapd.ldif
-rw-------. 1 root root 2651 Nov 2 17:22 slapd.ldif.default openldap的数据目录
10:23:35 41 /usr/local/var/openldap-data:#ll
total 1016
-rw-r--r--. 1 root root 4096 Nov 5 17:34 alock
-rw-------. 1 root root 24576 Nov 5 17:34 __db.001
-rw-------. 1 root root 188416 Nov 5 17:34 __db.002
-rw-------. 1 root root 270336 Nov 5 17:34 __db.003
-rw-------. 1 root root 98304 Nov 5 17:34 __db.004
-rw-------. 1 root root 753664 Nov 5 17:34 __db.005
-rw-------. 1 root root 32768 Nov 5 17:34 __db.006
-rw-------. 1 root root 845 Nov 2 17:22 DB_CONFIG.example
-rw-------. 1 root root 8192 Nov 5 15:14 dn2id.bdb
-rw-------. 1 root root 32768 Nov 5 15:14 id2entry.bdb
-rw-------. 1 root root 10485760 Nov 5 17:15 log.0000000001
-rw-------. 1 root root 8192 Nov 5 15:14 objectClass.bdb
yum install openldap-servers
yum install openldap-clients
/usr/sbin/slapacl
/usr/sbin/slapadd
/usr/sbin/slapauth
/usr/sbin/slapcat
/usr/sbin/slapd
/usr/sbin/slapdn
/usr/sbin/slapindex
/usr/sbin/slappasswd
/usr/sbin/slapschema
/usr/sbin/slaptest
LDAP:Lightweight Directory Access Protocol 轻量级目录访问协议
LDAP协议基于X.500标准, 与X.500不同,LDAP支持TCP/IP, 是跨平台的和标准的协议
LDAP标准实际上是在X.500标准基础上产生的一个简化版本
AD是Active Directory的缩写,AD应该是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,
只是AD顺便还提供了用户接口,也可以利用Active Directory当做LDAP服务器存放一些自己的东西而已。比如LDAP是关系型数据库,微软自己在库中建立了几个表,每个表都定义好了字段。显然这些表和字段都是根据微软自己的需求定制的,而不是LDAP协议的规定。然后微软将LDAP做了一些封装接口,用户可以利用这些接口写程序操作LDAP,使得Active Directory也成了一个LDAP服务器。
总之:Active Directory = LDAP服务器+LDAP应用(Windows域控)。Active Directory先实现一个LDAP服务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用(域控)
7.1.2
目录服务标准:X.500和LDAP
目录服务的两个国际标准是X.500和LDAP。X.500包括了从X.501到X.509等一系列目录数据服务,已经被作为提供全球范围的目录服务的一种国际标准。
而LDAP是基于TCP/IP协议的目录访问协议,是Internet上目录服务的通用访问协议。
X.500是国际电联定义的目录标准,它包括了一系列完整的目录数据服务。用于X.500客户机与服务器通信的协议是DAP(Directory Access Protocol)。X.500为网络用户提供分布式目录服务。
它定义一个机构如何在一个企业的全局范围内共享名字和与它们相关的对象。X.500规定总体命名方式,全球统一的名字空间,一个完整的X.500系统称为一个目录。这个目录是一个数据库,称为目录信息数据库(DIB)。X.500是层次性的,所有对象被组织成树形结构,模仿一个机构的组织形式。X.500目录服务还能够实现身份认证、访问控制。它被公认为是实现一个目录服务的最好途径,但是它的实现需要很大投资,效率不高,在实际应用中存在着不少障碍。DAP对相关层协议环境要求过多,在许多小系统上无法使用,也不适应TCP/IP协议体系。
鉴于此,出现了DAP的简化版LDAP。
LDAP(Lightweight Directory Access Protocol)的目的很明确,就是要简化X.500目录的复杂度以降低开发成本,同时适应Internet的需要。LDAP已经成为目录服务的标准,它比X.500 DAP协议更为简单实用,而且可以根据需要定制,因而实际应用也更为广泛。与X.500不同,LDAP支持TCP/IP协议,这对访问Internet是必需的。X.500采用公钥基础结构(PKI)作为主要的认证方式,而LDAP最初并不考虑安全问题,目前已增加安全机制。为保证数据访问安全,可使用LDAP的ACL(访问控制列表)来控制对数据读和写的权限。
LDAP目前有两个版本:第2版LDAP v2和第3版LDAP v3。基于LDAP v3的服务器可以让普通用户使用支持LDAP功能的Web浏览器,进行有关电子邮件用户的查询,可以查询的用户属性包括姓名、电话号码、电子邮件地址和地址信息等;系统管理员可以通过LDAP客户程序远程进行目录管理操作,如添加、删除和修改用户账户信息等;可以请求服务器执行扩展操作。
内部细节并不重要,因为这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前。
LDAP 信息被组织成属性和值的组合,称为 条目(entry)。条目可能会具有必须的属性或可选属性。一个条目的属性必须要遵循 /etc/openldap/schema/ 模式文件中定义的规则。规则包含在条目的 objectclass 属性中。看一下下面的关系,我们可以看出 posixAccount objectclass 中包含了密码文件条目的信息(posixAccount userPassword 是文件条目的 base64 编码)。
在LDAP中信息以树状方式组织,在树状信息中的基本数据单元是条目,而每个条目由属性构成,属性中存储有属性值
(1)O:Organization 组织
根的表示方法(参考LDAP Server)
a. 组织名称(x.500)
假设组织名称为zhangyang
o=zhangyang
b. 域名
假设组织域名为zhangyang.com
o=zhangyang.com或dc=zhangyang, dc=com
(2)OU: Organization Unit 组织单元
(3)Entry: 条目,记录, 由DN唯一标识
(4)DN: Distinguished Name,每个叶子结点到根的路径就是DN
如: cn=test, ou=ou1, o=zhangyang.com
(5)RDN: Relative Distinguished Name,叶子结点本身的名字是RDN
如:test就是RDN
(6)Base DN: 基准DN,指定LDAP search的起始DN,即从哪个DN下开始搜索
搜索组织单元为ou1,则base DN为 ou=ou1,o=O
ou=ou1,o=zhangyang.com 或 ou=ou1,dc=zhangyang, dc=com
(7)AttributeType:属性类型,
(8)ObjectClass: 对象类,由多个attributetype(属性类型)组成, 每个条目(Entry)必须属于某个或多个对象类(Object Class)
(9)schema文件: 定义对象类、属性类型、语法和匹配规则, 有系统schema,用户也可自定义schema文件
(10) LDIF:LDAP Interchange Format, 是指存储LDAP配置信息及目录内容的标准文本文件格式。LDIF文件常用来向目录导入或更改记录信息,
基本格式:AttributeName: value
属性名 冒号 空格 属性值
如
dn: dc=zy,dc=net
objectclass: dcObject
objectclass: organization
dc: zy
o: zhangyang
(11)监听端口
TCP/IP port: 389
SSL port: 636
三、Search filter:
每个表达式都放在括号内,多个表达式用与(&),或(|),非(!)等连结
& (&(filter1)(filter2)...(filtern)) filter1,filter2,...,filtern同时满足
| (|(filter1)(filter2)...(filtern)) filter1,filter2,...,filtern至少有一个满足
! (!(filter)) 非filter
filter支持通配符(wildcard)*
*表示零或多个字符
如(objectclass=*),指列出所有类型的记录(不过分类)
四、LDAP客户端和LDAP服务器端交互过程
1. 绑定。LDAP客户端与LDAP服务器建立连接。可匿名绑定,也可以用户名+密码形式绑定(具体参考LDAP Server, AD不支持匿名查询)。
2. LDAP客户端向LDAP服务器发出查询、添加、修改、删除entry等操作。
3. 解除绑定。LDAP客户端与LDAP服务器断开连接。
五、 LDAP软件
常见的LDAP服务器:Microsoft Active Directory, IBM Domino, openldap
常见的LDAP客户端: JXplorer
DNS树
UNIX文件的目录树
ldap的DIT
超级用户与密码由slapd.conf下面指定
rootdn "cn=Manager,dc=fgy,dc=com"
rootpw secret
curl -O ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.42.tgz
tar zxvf openldap-2.4.42.tgz
cd openldap-2.4.42
./configure
yum install db4-devel
make depend
make
make test
make install
cd /usr/local/etc/openldap
vi slapd.conf
cd /usr/local/var/openldap-data
/usr/local/libexec/slapd
默认安装完成之后,就可以启动,然后尽量通过工具去操作slapadd,slaptest等
两种配置方式老的slapd.conf,与新的slapd-config方式。 mkdir slapd.d
两种方式,
1.复制一个现成的,然后添加
cp slapd.ldif slapd.d/1.ldif
grep -v "^#" 1.ldif >2.ldif
slapadd -F /usr/local/etc/openldap/slapd.d -n 0 -l 2.ldif
优先顺序是先检查slapd.d目录中有无slapd-config方式的文件,如无,会找slapd.conf文件来启动,并生成bdb格式的文件,如下
[root@localhost slapd.d]# ll /usr/local/var/openldap-data/
total 980
-rw-r--r--. 1 root root 2048 Nov 14 09:46 alock
-rw-------. 1 root root 24576 Nov 14 09:46 __db.001
-rw-------. 1 root root 188416 Nov 14 09:46 __db.002
-rw-------. 1 root root 270336 Nov 14 09:46 __db.003
-rw-------. 1 root root 98304 Nov 14 09:46 __db.004
-rw-------. 1 root root 753664 Nov 14 09:46 __db.005
-rw-------. 1 root root 32768 Nov 14 09:46 __db.006
-rw-------. 1 root root 8192 Nov 14 09:46 dn2id.bdb
-rw-------. 1 root root 32768 Nov 14 09:46 id2entry.bdb
-rw-------. 1 root root 10485760 Nov 14 09:46 log.0000000001
在服务未启动之前就添加或转换,这样当服务启动后,会在此ldif所定义的目录中生成以下文件
[root@localhost slapd.d]# ll /usr/local/var/openldap-data/
total 16
-rw-------. 1 root root 12288 Nov 14 10:08 data.mdb
-rw-------. 1 root root 8192 Nov 14 10:08 lock.mdb 2.将现成的进行转换
slaptest -f /usr/local/etc/openldap/slapd.conf -F /usr/local/etc/openldap/slapd.d kill -INT `cat /usr/local/var/run/slapd.pid`
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
ldapsearch -x -b 'dc=fgy,dc=com' '(objectclass=*)'
ldapsearch -x -D cn=config -w VerySecret -b cn=config
ldapsearch -x -D cn=config -w secret -b cn=config
ldapadd -x -D "cn=Manager,dc=fgy,dc=com" -W -f a.ldif
ldapadd -x -D "cn=wo,dc=fgy1,dc=com" -W -f b.ldif
ldapwhoami
slaptest -f slapd.conf -F slapd.d
slapindex -b 'dc=fgy,dc=com'
slappasswd -s wo 10:39:45 16 ~/packages/openldap-2.4.42:#slaptest -u -f /usr/local/etc/openldap/slapd.conf
config file testing succeeded 15:08:25 62 /usr/local/etc/openldap/schema:#/usr/local/libexec/slapd -d ?
Installed log subsystems: Any (-1, 0xffffffff)
Trace (1, 0x1)
Packets (2, 0x2)
Args (4, 0x4)
Conns (8, 0x8)
BER (16, 0x10)
Filter (32, 0x20)
Config (64, 0x40)
ACL (128, 0x80)
Stats (256, 0x100)
Stats2 (512, 0x200)
Shell (1024, 0x400)
Parse (2048, 0x800)
Sync (16384, 0x4000)
None (32768, 0x8000) NOTE: custom log subsystems may be later installed by specific code
控制台查看日志
14:01:20 122 /usr/local/etc/openldap:#/usr/local/libexec/slapd -d 256
56457cb5 @(#) $OpenLDAP: slapd 2.4.42 (Nov 2 2015 17:08:40) $
root@localhost.localdomain:/root/packages/openldap-2.4.42/servers/slapd
56457cb5 bdb_db_open: warning - no DB_CONFIG file found in directory /usr/local/var/openldap-data: (2).
Expect poor performance for suffix "dc=fgy,dc=com".
56457cb5 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
56457cb5 bdb_db_open: warning - no DB_CONFIG file found in directory /usr/local/var/open: (2).
Expect poor performance for suffix "dc=fgy1,dc=com".
56457cb5 bdb_db_open: warning - no DB_CONFIG file found in directory /usr/local/var/myhome: (2).
Expect poor performance for suffix "dc=myhome,dc=com".
56457cb5 slapd starting 15:08:48 63 /usr/local/etc/openldap/schema:#ps -ef|grep slapd
root 6932 1 0 Nov02 ? 00:00:00 /usr/local/libexec/slapd
root 25258 19416 0 15:09 pts/0 00:00:00 grep slapd 停止服务
15:14:01 76 /usr/local/etc/openldap:#kill -INT `cat /usr/local/var/run/slapd.pid`
15:14:21 77 /usr/local/etc/openldap:#ps -ef|grep slapd
root 25383 19416 0 15:14 pts/0 00:00:00 grep slapd 启动服务
15:14:27 78 /usr/local/etc/openldap:#/usr/local/libexec/slapd
15:14:52 79 /usr/local/etc/openldap:#ps -ef|grep slapd
root 25385 1 0 15:14 ? 00:00:00 /usr/local/libexec/slapd
root 25388 19416 0 15:14 pts/0 00:00:00 grep slapd 15:23:19 85 /usr/local/etc/openldap:#man slapd.conf
15:23:19 85 /usr/local/etc/openldap:#man slapd.backends 15:33:29 91 /usr/local/etc/openldap:#man slapd-bdb
15:40:51 92 /usr/local/etc/openldap:#man slapd-mdb 10:32:01 11 ~/packages/openldap-2.4.42:#slappasswd
New password:
Re-enter new password:
{SSHA}J/PnUzwhAju1gn6hqUzktwhZKOHpEzuU 15:50:34 102 /usr/local/etc/openldap:#slappasswd -s wo
{SSHA}FxVQwKTQrn0vwIJ2KUmPwy2aJkk0wl+F 16:08:11 14 ~:#cat b.ldif
dn: dc=fgy1,dc=com
objectclass: dcObject
objectclass: organization
o: woei
dc: fgy1 dn: cn=wo,dc=fgy1,dc=com
objectclass: organizationalRole
cn: wo
下面这个密码是fgy1.com的密码,每个suffix的密码由rootpw指定
16:08:15 15 ~:#ldapadd -x -D "cn=wo,dc=fgy1,dc=com" -W -f b.ldif
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
16:08:44 16 ~:#ldapadd -x -D "cn=wo,dc=fgy1,dc=com" -W -f b.ldif
Enter LDAP Password:
adding new entry "dc=fgy1,dc=com" adding new entry "cn=wo,dc=fgy1,dc=com" vi /usr/local/etc/openldap/slapd.conf
加入下面部分,定义了两个数据库,目录要在启动服务之前先建立,权限一般700,否则不能启动服务 database bdb
suffix "dc=fgy,dc=com"
rootdn "cn=Manager,dc=fgy,dc=com"
rootpw secret
directory /usr/local/var/openldap-data
index objectClass eq database bdb
suffix "dc=fgy1,dc=com"
rootdn "cn=wo,dc=fgy1,dc=com"
rootpw {SSHA}FxVQwKTQrn0vwIJ2KUmPwy2aJkk0wl+F
directory /usr/local/var/open
index objectClass eq
添加项(entry)的过程是:不管是slapd.conf,还是slapd-config方式,
slapd.conf方式
先添加这些内容
database bdb
suffix "dc=fgy,dc=com"
rootdn "cn=Manager,dc=fgy,dc=com"
rootpw secret
directory /usr/local/var/openldap-data
index objectClass eq 再书写一个a.ldif,其实是书写两个entry,就是suffix与rootdn
dn: dc=fgy,dc=com
objectclass: dcObject
objectclass: organization
o: example company
dc: fgy dn: cn=Manager,dc=fgy,dc=com
objectclass: organizationalRole
cn: Manager 然后再导入,然后再添加其它的entry
ldapadd -x -D "cn=Manager,dc=fgy1,dc=com" -W -f a.ldif
slapd-config方式
先书写一个2.ldif,
再初始化slapadd -F /usr/local/etc/openldap/slapd.d -n 0 -l 2.ldif,再启动服务
如下:
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /usr/local/var/run/slapd.args
olcPidFile: /usr/local/var/run/slapd.pid dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema include: file:///usr/local/etc/openldap/schema/core.ldif dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcSuffix: dc=flt,dc=com
olcRootDN: cn=wo,dc=flt,dc=com
olcRootPW: secret
olcDbDirectory: /usr/local/var/open2
olcDbIndex: objectClass eq 然后再添加entry,olcsuffix与olcrootdn是必添加项,与sldap.conf方式一样,每一项完成之后,要空格。
15:05:46 26 /usr/local/etc/openldap/slapd.d:#ldapadd -x -D "cn=wo,dc=flt,dc=com" -W
Enter LDAP Password:
dn:dc=flt,dc=com
objectclass:dcObject
objectclass:organization
o:fltdz
dc:flt adding new entry "dc=flt,dc=com" dn:cn=wo,dc=flt,dc=com
objectclass:organizationalRole
cn:wo adding new entry "cn=wo,dc=flt,dc=com" dn:cn=Barbara Jensen,dc=flt,dc=com
objectClass:person
cn:Barbara Jensen
cn:Babs Jensen
sn:Jensen adding new entry "cn=Barbara Jensen,dc=flt,dc=com" dn:cn=wxy,ou=members,dc=flt,dc=com
cn:wxy
sn:WXY
objectclass:person adding new entry "cn=wxy,ou=members,dc=flt,dc=com"
linux服务之openldap的更多相关文章
- 第11章 Linux服务管理
1. 服务分类 (1)Linux的服务 ①Linux中绝大多数的服务都是独立的,直接运行于内存中.当用户访问时,该服务直接响应用户,其好处是服务访问响应速度快.但不利之处是系统中服务越多,消耗的资源越 ...
- 在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service
在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service 1.在 /etc/rc.d/init.d/ 目录下创建一个名字和服务名完全相同的 shell 脚本文件 joyup ...
- linux笔记:linux服务管理
linux服务的分类: 启动和自启动: 查询已经安装的服务: RPM包的默认安装路径: 独立服务的启动: 独立服务的自启动: 基于xinetd的服务的管理: xinetd服务的自启动: 源码包安装服务 ...
- Linux学习笔记(19) Linux服务管理
1. 服务的分类 Linux服务可分为RPM包默认安装的服务和源码包安装的服务.前者可细分为独立的服务(直接作用于内存中)和基于xinetd服务.xinetd本身是独立的服务,其唯一的功能是管理其他服 ...
- [Linux]服务管理:rpm包, 源码包
--------------------------------------------------------------------------------------------------- ...
- linux服务器之LVS、Nginx和HAProxy负载均衡器对比
linux服务器之LVS.Nginx和HAProxy负载均衡器对比. LVS特点: 1.抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生: 2.稳定性.可靠性好,自身 ...
- 《如何将windows上的软件包或文件上传到linux服务上》
昨天晚上朋友让我帮他简单的搭建个环境,他公司让他做款软件测试温度的,他自己搞的是嵌入式,在公司担任的是软件工程师,应届毕业生.也可能他们搞嵌入式的对这个linux系统不太熟,不会把windows上的软 ...
- linux服务端的网络编程
常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少 ...
- Linux服务的管理
1.Linux服务的介绍 系统服务 --某些服务的服务的对象是Linux系统本身,或者Linux系统系统用户,这类服务我们称为系统服务(System Service) 网络服务 --提供给网络中的其他 ...
随机推荐
- apk在IIS中的MIME设置
支持下载的话: 扩展名中填写“.apk”, MIME类型中填写apk的MIME类型“ application/vnd.android.package-archive ”
- 【Tsinghua OJ】范围查询(Range)问题
[问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...
- Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三) 在附录文章4,5的基础上改造MainActivity.java和MyJob.ja ...
- Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
在安装Ecshop的时候,遇到两个问题: 1.Strict Standards: Non-static method cls_image::gd_version() should not be cal ...
- LeetCode Binary Tree Paths(简单题)
题意: 给出一个二叉树,输出根到所有叶子节点的路径. 思路: 直接DFS一次,只需要判断是否到达了叶子,是就收集答案. /** * Definition for a binary tree node. ...
- Ensemble Approaches分类技术
所谓ensemble learning,简单来说,是指综合多种基础模型或弱分类器来完成最终的决策的机器学习方法. Bagging和Boosting(之前所提到的Adaboost)都属于这类方法. Co ...
- (实用篇)PHP实现队列及队列原理
队列是一种线性表,按照先进先出的原则进行的: PHP实现队列:第一个元素作为队头,最后一个元素作为队尾 <?php /** * 队列就是这么简单 * * @link */ $array = ar ...
- .NET 里 静态方法的并发处理
静态方法在程序运行时 就已经实例化好了 不管多少用户并发 都一样处理,不需要排队等待,实例代码: namespace DotNet.Example { using DotNet.BaseManager ...
- Java-->用递归方法复制目录、子目录以及文件(文件用到IO流)
package com.dragon.java.newcopyfile; import java.io.File; import java.io.FileInputStream; import jav ...
- linux死锁检测的一种思路
前言: 上一篇博文讲述了pstack的使用和原理. 和jstack一样, pstack能获取进程的线程堆栈快照, 方便检验和性能评估. 但jstack功能更加的强大, 它能对潜在的死锁予以提示, 而p ...