编译安装php5.2

./configure –prefix=/usr/local/php –with-apxs2=/usr/sbin/apxs  –with-config-file-path=/usr/local/lib –enable-track-vars –with-xml –with-mysql –with-zlib –with-gd

make

make install

 

重新安装最好先停httpd,再make clean

发表在 linux | 留下评论

linux定时备份mysql数据库

利用crontab,系统每天定时备份mysql数据库

【内容提要】利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。

 

利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。

1、创建保存备份文件的路径/mysqldata

#mkdir /mysqldata

2、创建/usr/sbin/bakmysql文件

#vi /usr/sbin/bakmysql

输入

rq=` date +%Y%m%d `

tar zcvf /mysqldata/mysql$rq.tar.gz /var/lib/mysql

或者写成

rq=` date +%Y%m%d `

mysqldump –all-databases -u root -p密码 > /mysqldata/mysql$rq.sql

/var/lib/mysql是你数据库文件的目录,部分用户是/usr/local/mysql/data,每个人可能不同

/mysqldata/表示保存备份文件的目录,这个每个人也可以根据自己的要求来做。

3、修改文件属性,使其可执行

# chmod +x /usr/sbin/bakmysql

4、修改/etc/crontab

#vi /etc/crontab

在下面添加

01 3 * * * root /usr/sbin/bakmysql

表示每天3点钟执行备份

5、重新启动crond

# /etc/rc.d/init.d/crond restart

完成。

这样每天你在/mysqldata可以看到这样的文件

mysql20040619.tar.gz

你直接下载就可以了。

 

 

 

基本格式 :

*  *  *  *  *  command

分 时 日 月 周 命令

第1列表示分钟1~59 每分钟用*或者 */1表示

第2列表示小时1~23(0表示0点)

第3列表示日期1~31

第4列表示月份1~12

第5列标识号星期0~6(0表示星期天)

第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart

每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一号的4点重启apache

 

发表在 linux | 标签为 , , | 留下评论

安卓书坊

安卓书坊

 

发表在 android | 标签为 , | 留下评论

CentOS 6.0 系统 LAMP(Apache+MySQL+PHP) 安装步骤

先来解释一下,什么是 LAMP。正如标题所言,LAMP 实际上就是 Linux、Apache、MySQL、PHP 四个名称的缩写,当然最后一个 “P” 还有其他说法是 Perl 或者 Python。不用多说了,本文讲解的就是 Linux、Apache、MySQL、PHP 这四个东西,所以就这样解释了。

自己很早就在做网站,最初玩的是 ASP,后来主要研究 .Net,也用 .Net 搞过类似的开发。但是自己最主要还是想把网站做起来,于是乎就将主要精力花在了网站运营上了,当然建站就选用了市面上成熟的一些 CMS 或者是博客程序。目前的 CMS 和博客程序实际上都可以融入到一起,因为其内容的表现形式上相当的接近,故选择哪一块来做,完全看自己的特长了。

由于 Linux 和 PHP 的免费,在国外是相当的流行。国内大部分主机都是 Windows 平台,而我学的 ASP 和 .Net 刚好能搭配运行起来。后来由于种种原因,我的网站都移民到了国外,而在国外找一个性价比好的 Windows 主机实在是件难事,不光语言上的阻碍,国外版权意识很好,所以很少有性价比好的 Windows 主机。我不得不转向了 Linux 平台。而且非常流行的 WordPress 吸引了我,故目前主要注意力就集中在 Linux 主机和 PHP 上。虽然自己对 PHP 基本不了解,呵呵。

虽然 Linux 平台上好的组件不止 Apache 一个,例如俄罗斯人开发的 Nginx,还有性能超强的 LiteSpeed 等等,这两者我都用过,前者以高效、资源占用低为特点,据说腾讯网就是基于此运行的,后者是以性能强大著称,同样据说这是 WordPress 官方推荐的用来运行 WordPress 最佳组件。但是呢,各种网上资料表明,虽然 Apache 性能、资源占用不如其他组件,但是 Apache 开发的目标就是以稳定为主。任何一个网站难道不是希望能够稳定运行?所以我还是选择学习 Apache 来作为网站的服务器环境。学会了一个,其他就能够举一反三了。

一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论。从最基础的开始,一点点完成一个可用的 Linux 主机。这里就开始介绍如何在 CentOS 6.0 上安装 LAMP 组件。经过如下语句安装,目前安装到的版本为:

PHP:5.3.2
Apache:2.2.15
MySQL:5.1.52

一、安装 MySQL

首先来进行 MySQL 的安装。打开超级终端,输入:

[root@localhost ~]# yum install mysql mysql-server

安装完毕,让 MySQL 能够随系统自动启动:

[root@localhost ~]# chkconfig --levels 235 mysqld on
[root@localhost ~]# /etc/init.d/mysqld start

设置 MySQL 数据 root 账户的密码:

[root@localhost ~]# mysql_secure_installation

当出现如下提示时候直接按回车:

Enter current password for root

出现如下再次回车:

Set root password? [Y/n]

出现如下提示输入你需要设置的密码,回车后在输入一次确认:

New password:

接下来还会有四个确认,分别是:

  • Remove anonymous users? [Y/n]
  • Disallow root login remotely? [Y/n]
  • Remove test database and access to it? [Y/n]
  • Reload privilege tables now? [Y/n]

直接回车即可。

二、安装 Apache 组件

由于 CentOS 已经封装了 Apache,直接运行安装:

[root@localhost ~]# yum install httpd

同样配置系统让 Apache 随系统启动:

[root@localhost ~]# chkconfig --levels 235 httpd on

配置完毕,启动 Apache:

[root@localhost ~]# /etc/init.d/httpd start

此时已经可以访问你的服务器,不出意外的话,能够看到 “Apache 2 Test Page powered by CentOS” 的测试页面。注意,如果其他机器访问这台服务无法显示这个页面,而直接在这台服务器上可以访问的话,一般情况下是 CentOS 自带的防火墙禁止了。你只需要进入防火墙,将 “WWW” 对应的 “80” 端口打开即可。

注意:在 CentOS 中 Apache 的默认根目录是 /var/www/html,配置文件 /etc/httpd/conf/httpd.conf。其他配置存储在 /etc/httpd/conf.d/ 目录。

三、安装 PHP

输入如下指令安装 PHP:

[root@localhost ~]# yum install php

需要重新启动 Apache 服务:

[root@localhost ~]# /etc/init.d/httpd restart

四、测试 PHP 相关信息

这步实际上可以省略,但是为了测试是否安装成功,你可以新建一个 PHP 页面进行测试,使用 vim 编辑器新建:

[root@localhost ~]# vi /var/www/html/info.php

按 “i” 键进行编辑,输入:

<?php
phpinfo();
?>

编辑完毕,按 “ESC” 键退出编辑模式,接着输入:

:wq

然后回车,即保存并退出。

此时你可以访问你的站点地址,例如 “http://192.168.1.2/info.php”,查看是否能看到相关的 PHP 信息。

看到这样的图,就说明 PHP 安装成功了。

五、将 PHP 模块和 MySQL 模块关联起来

还需要将 PHP 和 MySQL 关联起来,才能正常工作。搜索模块:

[root@localhost ~]# yum search php

安装相关模块:

[root@localhost ~]# yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

需要重启 Apache 模块才能生效:

[root@localhost ~]# /etc/init.d/httpd restart

再次刷新刚才建立的 “info.php” 页面,往下拉找到相关 MySQL 模块,看是否检测到相关信息。

如果看到如上图相关信息,则说明 MySQL 工作正常了。

六、总结

到这里就结束了,本文阐述了在 CentOS 6.0 系统下 LAMP 组件(Apache+MySQL+PHP) 的详细安装步骤,可以让更多新手熟悉服务器配置环境。

但是到这里,还只是将环境配置完毕,很多东西还有欠缺,而且还是一些重要的问题,例如目录的权限配置问题,或者是管理上的问题,像建立 FTP 等。这些内容随后会慢慢谈到。

 

 

 

发表在 linux | 留下评论

Centos搭建SVN服务器

搭建SVN服务,有效的管理代码,以下三步可以快速搞定。
1、安装

#yum install subversion 

判断是否安装成功
#subversion -v

svnserve, version 1.6.11 (r934486)
出现上面的提示,说明安装成功。

有了SVN软件后还需要建立SVN库。
#mkdir /opt/svn/repos
#svnadmin create /opt/svn/repos
执行上面的命令后,自动在repos下建立多个文件, 分别是conf, db,format,hooks, locks, README.txt。

2、配置

上面的操作很简单,几个命令就搞定, 下面的操作也不难。
进入上面生成的文件夹conf下,进行配置,   有以下几个文件authz, passwd, svnserve.conf
其中authz 是权限控制,可以设置哪些用户可以访问哪些目录,   passwd是设置用户和密码的,    svnserve是设置svn相关的操作。

2.1先设置passwd

[users]
# harry = harryssecret
# sally = sallyssecret
hello=123
用户名=密码 

这样我们就建立了hello用户, 123密码

2.2 再设置权限authz

[/]
hello= rw 

意思是hello用户对所有的目录有读写权限,当然也可以限定。
如果是自己用,就直接是读写吧。

2.3最后设定snvserv.conf

anon-access = none # 使非授权用户无法访问
auth-access = write # 使授权用户有写权限
password-db = password
authz-db = authz   # 访问控制文件
realm = /opt/svn/repos # 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
采用默认配置. 以上语句都必须顶格写, 左侧不能留空格, 否则会出错.

好了,通过以上配置,你的svn就可以了。

3、连接

启动svn: svnserve -d -r /opt/svn/repos 

如果已经有svn在运行,可以换一个端口运行
svnserve -d -r /opt/svn/repos –listen-port 3391

这样同一台服务器可以运行多个svnserver

好了,启动成功后,就可以使用了。
建议采用TortoiseSVN, 连接地址为: svn://your server address (如果指定端口需要添加端口  :端口号)

连接后可以上传本地的文件,有效的管理你的代码。

后续:

centos 添加开机启动 修改文件 /etc/rc.d/rc.local

将你的命令添加在后面就行了

例如

1、编辑rc.local文件
#vi /etc/rc.d/rc.local
2、加入如下启动命令
/usr/sbin/apachectl start
/etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/smb start
/usr/local/subversion/bin/svnserve -d

 

/etc/init.d/vncserver start

 

注意不要将命令的路径写错了,否则不会运行成功,添加完,保存退出就行了。

如果需要http访问:

1.SVN简介

由于前些年在版本的管理上采用的都是CVS系统,总体上而言还是很优秀的,经过了多年
的项目开发管理经历,在使用CVS系统在管理中大型的软件项目时还是遇到了很多不可克服的
缺陷和局限性,主要表现在如下的几个方向:
1. 无法进行文件名称的修改活动,这样一来就会导致必须先删除该文件再上传,丢失了
历史信息,要不就必须到服务上将xxx,v文件进行改名(我采用这种方法,不过总是
找管理员太不方便了);
2. 目录名称没有被管理,这样就不能进行改名等动作,其实项目的目录结构对于项目的
成功起了非常重要的作用,每次也只能到服务器上进行修改;
3. 项目的分支代价太高,需要对每一个文件都进行标记,对于大的项目耗时太长,并且
基本上不能删除废弃了的分支和标记,因为那样很容易导致项目仓库的损坏,我就遇
到了好多次这种让人发狂的情况;
4. 对于文件二进制和文本的处理经常会出现混乱,结果就使将二进制文件当作文本上传
后内容被扩展导致丢失,因为有些时候二进制文件的扩展名和某些文本文件的扩展名
相同了,所以导致CVS识别就会出错。
可以安装并配置subversion(简称svn)系统,使用svn来替换CVS系统,以解决上述问题。

Subversion有两种运行方式,一种是基于Apache Http Server另外一种是Subversion Standalone Server。下面我讲解的是基于Apache Http Server的Subversion,这样做几个好处
A.能使用WebDAV协议。
B.能使用浏览器作为客户端工具浏览源码仓库。
C.可以很容易的支持到SSPI(Windows域认证)和LDAP(AD?),这些都是Apache本身就支持的。
D.能得到比较完善的Apache安全认证系统,比如SSL加密连接。

 

2.svn安装
安装系统:CentOS
安装方式:yum install(这种方式比较简单,如果用源码安装容易产生版本兼容的问题)
建议
最好将svn系统安装在Linux操作系统环境下,这样一来系统比较的稳定可靠,同时也可以减少很多的病毒和攻击的服务器日常维护工作量,我将svn安装在了CentOS的服务器版本下。

安装:

yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql

确定已经安装了svn模块:mod_dav_svn
#cd /etc/httpd/modules
#ls | grep svn
mod_authz_svn.so
mod_dav_svn.so
如果要确认是否成功的安装了svn可以通过如下的命令进行验证:
svn –version

显示如下,表示正常:

svn, version 1.1.4 (r13838)
compiled Aug 21 2005, 20:56:55

Copyright (C) 2000-2004 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
- handles ‘http’ schema
- handles ‘https’ schema
* ra_local : Module for accessing a repository on local disk.
- handles ‘file’ schema
* ra_svn : Module for accessing a repository using the svn network protocol.
- handles ‘svn’ schema

 

3.apache的配置
配置/etc/httpd/conf/httpd.conf
(httpd的安装目录,一般是/etc/httpd或/usr/local/appache2)
进入到/etc/conf目录下用vim打开httpd.conf配置文件进行选项的修改:
a. KeepAlive选项(可选)
该选项可以修改也可以不修改,主要是为了提高http协议访问的性能,可以
使得svn仓库的访问更快,KeepAlive表示可以保持http的永久性TCP连接,
省去了每次都需要进行重建TCP连接的巨大开销,找到如下几个选项并修改:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
b. ServerAdmin/ServerName选项(可选)
对于需要对系统进行管理的可以在ServerAdmin选项设置成为管理员的email
地址,这样在出现问题时apache会自动发送邮件到该地址中;而ServerName
必须设置为本服务器的域名,如xxx.xxx.cn:80。

为了使客户端能够通过Apache来访问SVN档案库,Apache需要加载一个特殊的模块mod_dav_svn。如果您的Apache是按照与预设目 录安装的,mod_dav_svn 模块应该会安装在 Apache 安装位置 (默认路径是 /usr/local/apache2) 的 modules 子目录内。同时在Apache的配置文件httpd.conf(默认路径为/usr/local/apache2/conf)中已经使用 LoadModule指令加载了该模块(如果没有,请手动添加)LoadModule 指令的语法很简单, 就是将一个具名模块对映到共享链接库在磁盘上的位置:
LoadModule dav_svn_module     modules/mod_dav_svn.so
注意这个指令必须出现在其它的 Subversion 相关指令之前。
还要加载mod_authz_svn.so模块
如图:

 

测试Apache是否可以正常启动:

#vim /etc/httpd/conf/httpd.conf — Edit what you need and save the file
#service httpd start
#chkconfig httpd on
在浏览器中访问:http://localhost, 如果能看到Apache的页面,则说明Apache已经正常启动。

Apache命令:
启动:apachectl -k start
关闭:apachectl -k stop
重启:apachectl -k restart
查看日志:tail -f /etc/httpd/logs/error-log

 

4.svn的配置
进入到/etc/httpd/conf.d目录下用vim打开subversion.conf配置文件进行选项的
修改:
a. module的配置
一定要保证下面的两句话存在于配置文件中,否则无法在如svn的模块,就
无法访问svn的仓库了:
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

b. 仓库目录配置
项目仓库就是用于存放项 目目录结构的服务器目录,一般情况下Linux的规则时间容易变化的内容存放在/var目录下,所以我们需要在/var目录下创建一个svn目录,这样所 有的项目的根目录都作为/var/svn/目录下的一级子目录了,这样以来就可以在一个仓库目录下存放多个项目了。

下面将使用myapp这个仓库来配置Subversion

# mkdir -p /var/svn

# cd /var/svn

# svnadmin create myapp

# chown -R apache.apache myapp

# vi /etc/httpd/conf.d/subversion.conf

加入以下配置

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<Location /svn>
DAV svn
SVNParentPath /var/svn
#
#   # Limit write permission to list of valid users.
#   <LimitExcept GET PROPFIND OPTIONS REPORT>
#      # Require SSL connection for password protection.
#      # SSLRequireSSL
#
AuthType Basic
AuthName ”Authorization Realm”
AuthUserFile /var/svn/passwd
Require valid-user
#   </LimitExcept>
</Location>

下面建立可访问用户文件

# htpasswd -c /var/svn/passwd justin

要增加用户,则使用下面命令

# htpasswd /var/svn/passwd other

重起Apache

# service httpd restart

Subversion部分安装完成,打开浏览器访问http://localhost/svn/myapp即可看到效果。


发表在 linux | 留下评论

八点读报

八点读报:全国最大最全最权威的看报平台软件。

发表在 android | 标签为 , | 留下评论

jquery笔记

一。选择器

基本选择器:

$(“#myELement”)    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素

$(“div”)                     选择所有的div标签元素,返回div元素数组

$(“.myClass”)           选择使用myClass类的css的所有元素

$(“*”)                        选择文档中的所有的元素

可以运用多种的选择方式进行联合选择:例如$(“#myELement,div,.myclass”)

层叠选择器:

$(“form input”)         选择所有的form元素中的input元素

$(“#main > *”)          选择id值为main的所有的子元素

$(“label + input”)     选择所有的label元素的下一个input元素节点

经测试选择器返回的是label标签后面直接跟一个input标签的所有input标签元素

$(“#prev ~ div”)       同胞选择器

该选择器返回的为id为prev的标签元素的所有的属于同一个父元素的div标签

基本过滤选择器:

$(“tr:first”)               选择所有tr元素的第一个

$(“tr:last”)                选择所有tr元素的最后一个

$(“input:not(:checked) + span”)

过滤掉:checked的选择器的所有的input元素

$(“tr:even”)               选择所有的tr元素的第0,2,4… …个元素(注意:因为所选择的多个元素时为数组,所以序号是从0开始)

$(“tr:odd”)                选择所有的tr元素的第1,3,5… …个元素

$(“td:eq(2)”)             选择所有的td元素中序号为2的那个td元素

$(“td:gt(4)”)             选择td元素中序号大于4的所有td元素

$(“td:ll(4)”)              选择td元素中序号小于4的所有的td元素

$(“:header”)

$(“div:animated”)

内容过滤选择器:

$(“div:contains(‘John’)”)  选择所有div中含有John文本的元素

$(“td:empty”)           选择所有的为空(也不包括文本节点)的td元素的数组

$(“div:has(p)”)        选择所有含有p标签的div元素

$(“td:parent”)          选择所有的以td为父节点的元素数组

可视化过滤选择器:

$(“div:hidden”)        选择所有的被hidden的div元素

$(“div:visible”)        选择所有的可视化的div元素

属性过滤选择器:

$(“div[id]“)              选择所有含有id属性的div元素

$(“input[name='newsletter']“)    选择所有的name属性等于’newsletter’的input元素

$(“input[name!='newsletter']“)  选择所有的name属性不等于’newsletter’的input元素

$(“input[name^='news']“)         选择所有的name属性以’news’开头的input元素

$(“input[name$='news']“)         选择所有的name属性以’news’结尾的input元素

$(“input[name*='man']“)          选择所有的name属性包含’news’的input元素

$(“input[id][name$='man']“)    可以使用多个属性进行联合选择,该选择器是得到所有的含有id属性并且那么属性以man结尾的元素

子元素过滤选择器:

$(“ul li:nth-child(2)”),$(“ul li:nth-child(odd)”),$(“ul li:nth-child(3n + 1)”)

$(“div span:first-child”)          返回所有的div元素的第一个子节点的数组

$(“div span:last-child”)           返回所有的div元素的最后一个节点的数组

$(“div button:only-child”)       返回所有的div中只有唯一一个子节点的所有子节点的数组

表单元素选择器:

$(“:input”)                  选择所有的表单输入元素,包括input, textarea, select 和 button

$(“:text”)                     选择所有的text input元素

$(“:password”)           选择所有的password input元素

$(“:radio”)                   选择所有的radio input元素

$(“:checkbox”)            选择所有的checkbox input元素

$(“:submit”)               选择所有的submit input元素

$(“:image”)                 选择所有的image input元素

$(“:reset”)                   选择所有的reset input元素

$(“:button”)                选择所有的button input元素

$(“:file”)                     选择所有的file input元素

$(“:hidden”)               选择所有类型为hidden的input元素或表单的隐藏域

表单元素过滤选择器:

$(“:enabled”)             选择所有的可操作的表单元素

$(“:disabled”)            选择所有的不可操作的表单元素

$(“:checked”)            选择所有的被checked的表单元素

$(“select option:selected”)  选择所有的select 的子元素中被selected的元素

二。jquery对象

在jquery中利用:
$(“#id”)取出的是jquery对象,这是个集合对象,要想获得dom对象,可以用$(“#id”).get(i),其中i是jquery对象序列号,从0开始计算。

举例如下:
$(“#input1″)获取的不是dom对象,而是jquery对象。

而采用:var obj=document.getElementById(id); 获取的才是dom对象。

所以需要将jquery对象转化为dom对象,所以后面需要加上get()方法。参数名称就是jquery对象的序列号,从0开始计算。

或者是用
$(“[id=input1]“) 可以直接获取dom对象

相互转换:

刚开始学习jQuery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象。至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换。

什么是jQuery对象?

—就是通过jQuery包装DOM对象后产生的对象。jQuery对象是jQuery独有的,其可以使用jQuery里的方法。

比如:

$(“#test”).html()   意思是指:获取ID为test的元素内的html代码。其中html()是jQuery里的方法

这段代码等同于用DOM实现代码:

document.getElementById(“id”).innerHTML;

虽然jQuery对象是包装DOM对象后产生的,但是jQuery无法使用DOM对象的任何方法,同理DOM对象也不能使用jQuery里的方法.乱使用会报错。比如:$(“#test”).innerHTML、document.getElementById(“id”).html()之类的写法都是错误的。

还有一个要注意的是:用#id作为选择符取得的是jQuery对象与document.getElementById(“id”)得到的DOM对象,这两者并不等价。请参看如下说的两者间的转换。

既然jQuery有区别但也有联系,那么jQuery对象与DOM对象也可以相互转换。在再两者转换前首先我们给一个约定:如果一个获取的是jQuery对象,那么我们在变量前面加上$,如:var $variab = jQuery对象;如果获取的是DOM对象,则与习惯普通一样:var variab = DOM对象;这么约定只是便于讲解与区别,实际使用中并不规定。

jQuery对象转成DOM对象:

两种转换方式将一个jQuery对象转换成DOM对象:[index]和.get(index);

(1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。

如:var $v =$(“#v”) ; //jQuery对象

var v=$v[0];    //DOM对象

alert(v.checked)   //检测这个checkbox是否被选中

(2)jQuery本身提供,通过.get(index)方法,得到相应的DOM对象

如:var $v=$(“#v”);  //jQuery对象

var v=$v.get(0);   //DOM对象

alert(v.checked)  //检测这个checkbox是否被选中

DOM对象转成jQuery对象:

对于已经是一个DOM对象,只需要用$()把DOM对象包装起来,就可以获得一个jQuery对象了。$(DOM对象)

如:var v=document.getElementById(“v”);  //DOM对象

var $v=$(v);    //jQuery对象

转换后,就可以任意使用jQuery的方法了。

通过以上方法,可以任意的相互转换jQuery对象和DOM对象。需要再强调注意的是:DOM对象才能使用DOM中的方法,jQuery对象是不可以用DOM中的方法。

发表在 jquery | 留下评论

jqueryui 1.8.19引用顺序(导致var basePrototype = new base()错误)

在jqueryui1.8.19中,发现它没有使用原来1.8.17里边那个巨大的260K的单个js,而是把各种JS散开放了,有效地防止了JS下载的带宽。

不过放错顺序,会出现各种错误,不一而足,比如标题括号中的那个位置就经常出做,自己测试及上网搜索了一下,找到个现在可用的顺序,供大家参考。

(在搜索过程中发现有人1.4.X就开始用分离的多个小JS,但此之前本人一直单个的JS)

 

 

jquery本身必须放在第一位:
<script src="../../../Scripts/Jquery1.7.2/jquery-1.7.2.js" type="text/javascript"></script>
core必须放在所有ui之前:
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.core.js" type="text/javascript"></script>
widget必须放在剩下.ui....之前:
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.widget.js" type="text/javascript"></script>
mouse必须放在剩下的.ui...之前,这个试验了半天没发现,在google上找到的:
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.mouse.js" type="text/javascript"></script>
下面的不强制,按字母顺序放就行,当然可以删除多余的:
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.accordion.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.autocomplete.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.button.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.datepicker.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.dialog.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.draggable.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.droppable.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.position.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.progressbar.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.resizable.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.selectable.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.slider.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.sortable.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.ui.tabs.js" type="text/javascript"></script>
effects.core必须放置在所有剩下的.effects..之前:
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.core.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.blind.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.bounce.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.clip.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.drop.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.explode.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.fade.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.fold.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.highlight.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.pulsate.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.scale.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.shake.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.slide.js" type="text/javascript"></script>
<script src="../../../Scripts/jquery-ui-1.8.19/ui/jquery.effects.transfer.js" type="text/javascript"></script>

 

发表在 jquery | 留下评论

Thread stack overrun: 解决办法

系统能不能连接数据库,关键要看两个数据

1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。

2、数据库当前的连接线程数threads_connected。这是动态变化的。

如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝。

因为创建和销毁数据库的连接,都会消耗系统的资源。而且为了避免在同一时间同时打开过多的连接线程,现在编程一般都使用所谓数据库连接池技术。

但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽。

这种情况通常发生在程序未能及时释放数据库连接资源或其他原因造成数据库连接资源不能释放,

该错误的简便的检查办法是,在刷新页面时,不断监视threads_connected的变化。如果max_connections足够大,而 threads_connected值不断增加以至达到max_connections,那么,就应该检查程序了。当然,如果采用数据库连接池技术,threads_connected增长到数据库连接池的最大连接线程数时,就不再增长了。

查看max_connections

进入MySQL,用命令show variables
查看数据库最大可连接数的变量值max_connections

查看threads_connected

进入MySQL,用命令show status
查看当前活动的连接线程变量值threads_connected
设置max_connections

设置办法是在my.cnf文件中,添加下面的最后红色的一行

——————————————————————————–

[mysqld]
port=3306
#socket=MySQL
skip-locking
set-variable = key_buffer=16K
set-variable = max_allowed_packet=1M
set-variable = thread_stack=194K
set-variable = table_cache=4
set-variable = sort_buffer=64K
set-variable = net_buffer_length=2K
set-variable = max_connections=32000
——————————————————————————–

修改完毕后,重启MySQL即可。当然,为了确保设置正确,应该查看一下max_connections。

注意
1、虽然这里写的32000。但实际MySQL服务器允许的最大连接数16384;
2、除max_connections外,上述其他配置应该根据你们系统自身需要进行配置,不必拘泥;
3、添加了最大允许连接数,对系统消耗增加不大。
4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通。

ERROR 1436 (HY000):Threadstack overrun:  4508 bytesusedofa 131072 byte stack, and 128000 bytes needed.  Use ‘mysqld -O thread_stack=#’ to specify a bigger stack.

可通过上面方法改变set-variable = thread_stack=194K值

发表在 sql | 留下评论

JAVA获取数据库连接信息

package com.util.jdbc;  
 
import java.sql.Connection;  
import java.sql.Driver;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.sql.SQLException;  
import java.util.Enumeration;  
 
import org.apache.log4j.Logger;  
 
/** 
 * @author ken 
 * @Time 2011-12-10 
 * SQL API 学习 
 */ 
public class JDBCMsg {  
 
    private static Logger log = Logger.getLogger(JDBCMsg.class);  
      
    public static void main(String[] args) throws SQLException {  
        //rs connection 未关闭  
        //getAllDriverMsg();  
        //getDBParameterMetaData();  
        demoDB();  
    }  
      
    /** 
     * 取一个数据库中所有表的信息 
     * @throws SQLException  
     */ 
    public static void demoDB() throws SQLException{  
        Connection conn = JDBCUtil.getConnection();  
        log.info(“######  DatabaseMetaData关于数据库的整体综合信息====”);  
        java.sql.DatabaseMetaData dbmd = conn.getMetaData();  
 
        log.info(“数据库产品名: ” + dbmd.getDatabaseProductName());  
        log.info(“数据库是否支持事务: ” + dbmd.supportsTransactions());  
        log.info(“数据库产品的版本号:”+dbmd.getDatabaseProductVersion());  
        log.info(“数据库的默认事务隔离级别:”+dbmd.getDefaultTransactionIsolation());  
        log.info(“支持批量更新:”+dbmd.supportsBatchUpdates());  
        log.info(“DBMS 的 URL:”+dbmd.getURL());  
        log.info(“数据库的已知的用户名称:”+dbmd.getUserName());  
        log.info(“数据库是否处于只读模式:”+dbmd.isReadOnly());  
        log.info(“数据库是否支持为列提供别名:”+dbmd.supportsColumnAliasing());  
        log.info(“是否支持指定 LIKE 转义子句:”+dbmd.supportsLikeEscapeClause());  
        log.info(“是否为外连接提供受限制的支持:”+dbmd.supportsLimitedOuterJoins());  
        log.info(“是否允许一次打开多个事务:”+dbmd.supportsMultipleTransactions());  
        log.info(“是否支持 EXISTS 表达式中的子查询:”+dbmd.supportsSubqueriesInExists());  
        log.info(“是否支持 IN 表达式中的子查询:”+dbmd.supportsSubqueriesInIns());  
        log.info(“是否支持给定事务隔离级别:”+dbmd.supportsTransactionIsolationLevel(1));  
        log.info(“此数据库是否支持事务:”+dbmd.supportsTransactions());  
        log.info(“此数据库是否支持 SQL UNION:”+dbmd.supportsUnion());  
        log.info(“此数据库是否支持 SQL UNION ALL:”+dbmd.supportsUnionAll());  
        log.info(“此数据库是否为每个表使用一个文件:”+dbmd.usesLocalFilePerTable());  
        log.info(“此数据库是否将表存储在本地文件中:”+dbmd.usesLocalFiles());  
        log.info(“底层数据库的主版本号:”+dbmd.getDatabaseMajorVersion());  
        log.info(“底层数据库的次版本号:”+dbmd.getDatabaseMinorVersion());  
          
        log.info(“JDBC 驱动程序的主版本号:”+dbmd.getJDBCMajorVersion());  
        log.info(“JDBC 驱动程序的次版本号:”+dbmd.getJDBCMinorVersion());  
        log.info(“JDBC 驱动程序的名称:”+dbmd.getDriverName());  
        log.info(“JDBC 驱动程序的 String 形式的版本号:”+dbmd.getDriverVersion());  
          
        log.info(“可以在不带引号的标识符名称中使用的所有“额外”字符:”+dbmd.getExtraNameCharacters());  
        log.info(“用于引用 SQL 标识符的字符串:”+dbmd.getIdentifierQuoteString());  
        log.info(“允许用于类别名称的最大字符数:”+dbmd.getMaxCatalogNameLength());  
        log.info(“允许用于列名称的最大字符数:”+dbmd.getMaxColumnNameLength());  
        log.info(“允许在 GROUP BY 子句中使用的最大列数:”+dbmd.getMaxColumnsInGroupBy());  
        log.info(“允许在 SELECT 列表中使用的最大列数:”+dbmd.getMaxColumnsInSelect());  
        log.info(“允许在表中使用的最大列数:”+dbmd.getMaxColumnsInTable());  
        log.info(“数据库的并发连接的可能最大数:”+dbmd.getMaxConnections());  
        log.info(“允许用于游标名称的最大字符数:”+dbmd.getMaxCursorNameLength());  
        log.info(“在同一时间内可处于开放状态的最大活动语句数:”+dbmd.getMaxStatements());  
          
        //获取所有表 new String[]{“TABLE”}   
        //String[] type = {“TABLE”,”VIEW”}  null  
        log.info(“###### 获取表的信息”);  
        ResultSet tSet = dbmd.getTables(null, “%”, “%”, new String[]{“TABLE”,”VIEW”});  
        while (tSet.next()) {  
            log.info(tSet.getRow()+”_表类别:”+tSet.getString(“TABLE_CAT”)+”_表模式:”+tSet.getString(“TABLE_SCHEM”)  
                    +”_表名称:”+tSet.getString(“TABLE_NAME”)+”_表类型:”+tSet.getString(“TABLE_TYPE”)  
                    //+”\n_表的解释性注释:”+tSet.getString(“REMARKS”)+”_类型的类别:”+tSet.getString(“TYPE_CAT”)  
                    //+”\n_类型模式:”+tSet.getString(“TYPE_SCHEM”)+”_类型名称:”+tSet.getString(“TYPE_NAME”)  
                    //+”\n_有类型表的指定’identifier’列的名称:”+tSet.getString(“SELF_REFERENCING_COL_NAME”)  
                    //+”\n_指定在 SELF_REFERENCING_COL_NAME 中创建值的方式:”+tSet.getString(“REF_GENERATION”)  
                    );  
            //2_表类别:MANOR_表模式:PUBLIC_表名称:SYS_RESOURCE_表类型:TABLE  
            String tableName = tSet.getString(3);  
            String sql = “select * from ” + tableName;  
            ResultSet rsSet = conn.createStatement().executeQuery(sql);  
            ResultSetMetaData rsData = rsSet.getMetaData();  
            for (int i = 1; i <= rsData.getColumnCount(); i++) {  
                log.info(“==列的信息:获取SQL语句的列名:”+rsData.getColumnName(i)+”(“+rsData.getColumnLabel(i)+”,”+rsData.getColumnType(i)+”,”+rsData.getColumnClassName(i)+”)” 
                        +” 列宽”+rsData.getPrecision(i)+” 大小写敏感”+rsData.isCaseSensitive(i)+” isReadOnly:”+rsData.isReadOnly(i));  
                //==列的信息:获取SQL语句的列名:LIMITLEVER(LIMITLEVER,5,java.lang.Short) 列宽5 大小写敏感true isReadOnly:false  
            }  
              
        }  
        tSet.close();  
          
        log.info(“###### 获取当前数据库所支持的SQL数据类型”);  
        ResultSet tableType = dbmd.getTypeInfo();  
        while(tableType.next()){  
            log.info(“数据类型名:”+tableType.getString(1)  
                 +”,短整型的数:”+tableType.getString(2)  
                 +”,整型的数:”+tableType.getString(3)  
                 +”,最小精度:”+tableType.getString(14)  
                 +”,最大精度:”+tableType.getString(15));  
            //数据类型名:TIMESTAMP,短整型的数:93,整型的数:23,最小精度:0,最大精度:10  
            //数据类型名:VARCHAR,短整型的数:12,整型的数:2147483647,最小精度:0,最大精度:0  
        }  
           
        log.info(“###### 表的主键列信息”);  
        ResultSet primaryKey = dbmd.getPrimaryKeys(“MANOR”,”PUBLIC”,”SYS_ROLE_RES”);  
        while(primaryKey.next()){  
         log.info(“表名:”+primaryKey.getString(“TABLE_NAME”)+”,列名:”+primaryKey.getString(“COLUMN_NAME”)  
                 +” 主键名:”+primaryKey.getString(“PK_NAME”));  
         //表名:SYS_ROLE_RES,列名:SYS_RES_ID 主键名:CONSTRAINT_9  
         //表名:SYS_ROLE_RES,列名:SYS_ROLE_ID 主键名:CONSTRAINT_9  
        }  
          
        log.info(“###### 表的外键列信息”);  
        ResultSet foreinKey = dbmd.getImportedKeys(“MANOR”,”PUBLIC”,”SYS_ROLE_RES”);  
        while(foreinKey.next()){  
            log.info(“主键名:”+foreinKey.getString(“PK_NAME”)+”,外键名:”+foreinKey.getString(“FKCOLUMN_NAME”)  
                    +”,主键表名:”+foreinKey.getString(“PKTABLE_NAME”)+”,外键表名:”+foreinKey.getString(“FKTABLE_NAME”)  
                    +”,外键列名:”+foreinKey.getString(“PKCOLUMN_NAME”)+”,外键序号:”+foreinKey.getString(“KEY_SEQ”));  
            //主键名:PRIMARY_KEY_95,外键名:SYS_RES_ID,主键表名:SYS_RESOURCE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1  
            //主键名:PRIMARY_KEY_A,外键名:SYS_ROLE_ID,主键表名:SYS_ROLE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1  
        }  
          
        log.info(“###### 获取数据库中允许存在的表类型”);  
        ResultSet tableTypes = dbmd.getTableTypes();  
        while(tableTypes.next()){  
            log.info(“类型名:”+tableTypes.getString(1));  
            /** H2 
             类型名:SYSTEM TABLE 
             类型名:TABLE 
             类型名:TABLE LINK 
             类型名:VIEW 
             */ 
        }  
          
        //此外还可以获取索引等的信息  
        conn.close();  
    }  
      
    /** 
     * PreparedStatement 信息 
     * ResultSetMetaData 信息 
     * @throws SQLException 
     */ 
    public static void getDBParameterMetaData() throws SQLException{  
        Connection conn = JDBCUtil.getConnection(); //id,name  
        PreparedStatement pre = conn.prepareStatement(“SELECT * FROM SYS_APPTYPE where id = ?”);  
        pre.setInt(1, 3);  
        java.sql.ParameterMetaData pmd = pre.getParameterMetaData();  
        log.info(“参数的个数:”+pmd.getParameterCount());  
        log.info(“获取指定参数的 SQL 类型:”+pmd.getParameterType(1));  
        log.info(“culomn的参数类型:”+pmd.getParameterTypeName(1));  
        log.info(“Java 类的完全限定名称:”+pmd.getParameterClassName(1));  
        log.info(“获取指定参数的模式:”+pmd.getParameterMode(1));  
        log.info(“获取指定参数的指定列大小:”+pmd.getPrecision(1));  
        log.info(“获取指定参数的小数点右边的位数:”+pmd.getScale(1));  
        log.info(“是否允许在指定参数中使用 null 值:”+pmd.isNullable(1));  
        log.info(“指定参数的值是否可以是带符号的数字:”+pmd.isSigned(1));  
          
        //获取结果集元数据  
        ResultSet rs = pre.executeQuery();  
        while (rs.next()) {  
            log.info(rs.getString(1)+”___”+rs.getString(2));  
        }  
        rs.close();  
    }  
 
    /** 
     * 获取所有Driver信息 
     */ 
    public static void getAllDriverMsg(){  
        Enumeration<Driver> drivers = DriverManager.getDrivers();  
        while(drivers.hasMoreElements()) {  
            Driver d = drivers.nextElement();  
            log.info(d.getClass().getName()+”_”+d.getMajorVersion());  
        }  
 
    }

发表在 sql | 留下评论