上班第16天,明天就发工资咯。也到月末了,可以休息一下了。
把仙剑5赶紧通关,然后弄点好吃的。
利用空闲时间学习一点python,名字还是很霸气的
=========================================
1.变量可以随便用的,也可以用global
2.def就是定义函数
3.class就是定义类
4.字符串很方便
5.无类型之说
6.while可以有else
7.没有switch
8.__init__方法类似于C++、C#和Java中的 constructor
9.不需要分号,最好一行一句逻辑语句
10.self就是this
11.类,if,def等后面都要有冒号
12.注意缩进格式,不能随便缩进
13.继承就是class ChildClass(FatherClass)
14.模块使用import引入
分类目录归档:IT World
PHP调试时用print_r()和var_dump()的区别
上班第14天,开始为用户中心测试后台添加实际功能了。
列车追尾了,很痛心。
北京连续下雨,像疯了一样。
好好生活,珍惜生命。
==================以下是转的=============================================
print_r()结构智能地显示传递给它的东西,而不像echo 和print()那样将所有的东西都转换成字符串.字符串和数字都被简单地输出.数组以括起来的键和值的列表形式表示.以Array开头:
$arr = array(‘name’=> ‘bob’,’age’ => 20, ‘sex’ => ‘man’);
print_r($arr);
输出形如:
Array
{
[name] => bob,
[age] => 20,
[sex] => man
}
但对,用print_r()来显示布尔值和NULL是没有意义的:
如:
print_r(true); //输出1
print_r(false); //没有输出
print_r(null); //没有输出
因此,调试的时候用var_dump()比print_r()更好.var_dump()函数用适合阅读的格式显示任何PHP值:
var_dump(true); //输出 bool(true)
var_dump(false); // bool(false)
var_dump(null); // bool(null)
var_dump(array(‘name’ => ‘bob’, ‘age’ => 20));
array(2) {
[‘name’] => string(3) ‘bob’
[‘age’] => int(20)
}
正则表达式
今天周五啦,事情不多,学习学习正则表达式。昨天把Lion装完了,体验还是不错的嘛。
继续学习。。。
=================昏哥线===================
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]d*$ //匹配正整数
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式
原载地址:http://lifesinger.3322.org/myblog/?p=185
学习php?
发现技术用来用去虽然说只有那几种,但是不一定每次你都能用到想用的技术。
以前最熟悉的是java,但是实验室开发就偏要用c++ mfc
做过的网站都是jsp和ssh框架的,但是来了百度之后就要学习php,还好数据库一般都是mysql,但是实验室就偏要用mssql。哈哈。至今还没有用过oracle,估计以后工作了就会用到的。
————以上废话—————–
1. php + zend框架、就是类似ssh的一个mvc框架,有自己的controller,view和model,挺好用的
2. 用zend studio写php还是比较顺手,本身就是基于eclipse开发的,而且不用编译,省去了jsp页面总是要重新发布的麻烦事
3. extjs和jquery都算是接触了,还是挺好用的。 extjs风格有点诡异,不过还是基于dom操作和定义的一些框架而已。
4. php script也还是不错的,写了一个识别验证码的。不知道用python会不会更好用,可惜一直想用python没有机会通过实践来学习。
百度实习第十天,期待lion的发布~
Liferay、Zimbra和Processmaker与CAS的单点登陆集成
一.搭建CAS服务器
1.1 CAS下载 http://downloads.jasig.org/
推荐搭建在独立的服务器上
启用Tomcat SSL
编辑 $LIFERAY_HOME/conf/server.xml,反注释SSL配置段,如下:
1.2 使用JDK工具keytool生成SSL证书
在任何目录(我在HOME)下使用命令:
keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
将生成.keystore在$HOME下。
注意:在输入What is your first and last name? 时请使用你的hostname(参考/etc/hosts文件),不要用IP。或者使用hostname命令查看
整个过程如下:
daniel@daniel-desktop:~$ keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: daniel-desktop
What is the name of your organizational unit?
[Unknown]: SEE
What is the name of your organization?
[Unknown]: Jinfonet
What is the name of your City or Locality?
[Unknown]: Kunming
What is the name of your State or Province?
[Unknown]: Yunnan
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=daniel-desktop, OU=SEE, O=Jinfonet, L=Kunming, ST=Yunnan, C=CN correct?
[no]: yes
从keystore中导出证书并将此证书导入到JRE中:
daniel@daniel-desktop:~$ keytool -export -alias tomcat -keypass changeit -file server.cert
这个server.cert以后还会用到,下面的这个导入方法适用于使用的是系统的jre的情况下,下面会介绍其他的情况
daniel@daniel-desktop:~$ keytool -import -alias tomcat -file server.cert -keypass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts
测试SSL连接
访问https://daniel-desktop:8443/cas 成功
1.3 CAS登录验证
在CAS的验证页面,使用test作为帐号,test作为密码(只要帐号==密码就可以了),测试一下能不能通过CAS的验证。结果应该是可以通过,但是跳转也没无任何显示。因为我们并没有真正通过我们的帐号验证。其实CAS也是可以和ldap或者mysql集成的,请参考其他资料 =)
二. Liferay与CAS的单点登陆集成
Liferay的设置相对比较简单,只需要使用之前的server.cert,并导入到自己的jre中的cacerts文件即可,注意网上下载的liferay都是自带jre的。
之后需要往lib中加入cas-client-3.2.0-release包。
然后打开web页面,已管理员账户登陆liferay,选择顶部:管理-控制面板-门户-设置-认证-开启CAS,填写相关的CAS服务器地址,注意不能使用localhost或ip,必须要主机名或者域名
之后可以测试点击主页面的登陆和登出,都会跳转到CAS的认证页面。
三. Zimbra与CAS的单点登陆集成
CAS( Central Authentication Service)是由JA-SIG开发的一套开源的单点登录系统,在教育行业有着非常广泛的应用,有不少企业也在使用它。CAS的特点是安全性非常高,可维护性高。下面详细描述一下如何实现ZCS与CAS的集成。
1.配置ZCS的CACert keystore
在zimbra用户下执行以下脚本,将CAS的服务器证书(证书或证书链)导入到ZCS的CACert keystore中:
/opt/zimbra/java/bin/keytool -import -file casserver.cert -alias cascert -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit
/opt/zimbra/java/bin/keytool -import -file casserver.chain -alias caschain -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit
复制代码
2.部署CAS客户端
[li]从http://www.ja-sig.org/downloads/cas-clients/下载客户端软件包。3.1.x版本的客户端可以与ZCS 6.0.x、CAS服务器. 3.3.x一起工作。[/li][li]复制cas-client-core-3.1.x.jar文件到/opt/zimbra/jetty/common/lib目录。
[/li]
3.修改ZCS的配置文件
3.1 zimbra应用
将下列代码加入到/opt/zimbra/jetty/etc/zimbra.web.xml文件中,插入位置应在
默认的端口:CAS为8443,ZCS为443或80。
复制代码
3.2 zimbraAdmin应用
针对/opt/zimbra/jetty/etc/zimbraAdmin.web.xml文件进行同上一步的操作(插入内容、替换关键字)。
ZCS管理控制台的默认端口是7071。
4.建立PreAuth键
在zimbra用户身份下执行以下脚本:
[pre]
zmprov gdpak yourdomain.com
复制代码
[/pre]将会得到这样的PreAuth键值: “359d722926fc3daebd0fee5d8b9dad9bbe1646e68041afa8ab662c6a9152e6b9″。
5.建立preauth.jsp文件
5.1 zimbra应用
[li]将附件(附件为ZIP压缩文件,请将扩展名由GIF改为ZIP后打开)中的preauth.jsp-zimbra复制为: /opt/zimbra/jetty/webapps/zimbra/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第90处的domainname.com[/li]
5.2 zimbraAdmin应用
[li]将 preauth.jsp-zimbraadmin复制为: /opt/zimbra/jetty/webapps/zimbraAdmin/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第92处的domainname.com[/li]
6.替换登录和注销URL
以zimbra用户身份执行以下脚本,替换ZCS默认的登录和注销URL:
[pre]
zmprov md yourdomain.com zimbraWebClientLoginURL https://zimbra.url.com:port/zimbra/public/preauth.jsp
zmprov md yourdomain.com zimbraWebClientLogoutURL https://cas.url.com:port/cas/logout
zmprov md yourdomain.com zimbraAdminConsoleLoginURL https://zimbra.url.com:port/zimbraAdmin/public/preauth.jsp
zmprov md yourdomain.com zimbraAdminConsoleLogoutURL https://cas.url.com:port/cas/logout
复制代码
实践证明,使用zmprov mcf zimbraWebClientLogoutURL http://www.monSiteAuth.com 更好
默认端口同前。
7.重启ZCS
以zimbra身份运行zmcontrol restart命令重启ZCS服务。
四. Processmaker与CAS的单点登陆集成
1. upload the CAS Client library to the /opt/processmaker/gulliver/thirdparty
2. modify /opt/processmaker/workflow/engine/methods/login/authentication.php code as below
add CAS method
At #26 to #40.
Code: Select all
require_once ‘CAS-1.0.1/CAS.php’; //这里要写自己的版本号
// initialize phpCAS
phpCAS::client(CAS_VERSION_2_0,’oa.cybercloud.com’,8443,); //这里要写自己的CAS服务器地址和端口
// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();
// force CAS authentication
phpCAS::forceAuthentication();
if( phpCAS::isAuthenticated() == true )$casAuth = CASAuthIsTrue;
$_POST[‘form’][‘USR_USERNAME’] = phpCAS::getUser();
$_POST[‘form’][‘USR_PASSWORD’] = $casAuth;
3. modify /opt/processmaker/rbac/engine/classes/model/RbacUsers.php
change password check to CAS auth check. This is a tricky method. I use “password” as check CAS Authenticated or not. But I think this is not a good way. 😛
At line #71 & #72.
// if ( $aFields[‘USR_PASSWORD’] == md5 ($sPassword ) || ‘md5:’.$aFields[‘USR_PASSWORD’] === $sPassword) {
if ( $sPassword == CASAuthIsTrue) {
4. add javascript to submit form
/opt/processmaker/workflow/engine/xmlform/login/login.xml
在最后几行加入
document.login.submit();
五.Q&A
基本完成了CAS的单点集成登陆。
其他的一些问题:
1.出现如下异常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
这是缺少安全证书时出现的异常,解决方案就是将你要访问的webservice的安全认证证书导入到客户端即可。以下是获取安全证书的一种方法
1,写一个程序专门获取安全证书,参考InstallCert.java
2.执行 java InstallCert hostname 比如
java InstallCert 192.168.1.137:8443
会看到如下信息:
java InstallCert ecc.fedora.redhat.com Loading KeyStore /usr/jdk/instances/jdk1.5.0/jre/lib/security/cacerts… Opening connection to ecc.fedora.redhat.com:443… Starting SSL handshake…
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038) at InstallCert.main(InstallCert.java:63) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839) … 7 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216) … 13 more
Server sent 2 certificate(s):
1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US
Issuer CN=Certificate Shack, O=example.com, C=US
sha1 2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7
md5 dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54
2 Subject CN=Certificate Shack, O=example.com, C=US
Issuer CN=Certificate Shack, O=example.com, C=US
sha1 fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6
md5 72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68
Enter certificate to add to trusted keystore or ‘q’ to quit: [1] 3.输入1,然后直接回车,会在相应的目录下产生一个名为‘jssecacerts’的证书。将证书copy到$JAVA_HOME/jre/lib/security目录下,或者通过以下方式
System.setProperty(“javax.net.ssl.trustStore”, “D:\UTA\DOC_E_Health_XML\Keystore\jssecacerts
Zimbra cacerts证书坏了之后,可以暂停了服务之后重新签发证书
用root执行
/opt/zimbra/bin/zmcertmgr createca -new
/opt/zimbra/bin/zmcertmgr deployca
/opt/zimbra/bin/zmcertmgr createcrt -new -days 7300
/opt/zimbra/bin/zmcertmgr deploycrt self
/opt/zimbra/bin/zmcertmgr viewdeployedcrt
六. 参考资料
InstallCert.java
Preauth.jsp-zimbra
Preauth.jsp-zimbraAdmin
Liferay 5.1.1 安装与整合CAS
http://blog.csdn.net/DL88250/archive/2008/08/20/2802525.aspx
ZCS与CAS(Central Authentication Service)单点登录系统的集成
http://opengeek.cn/thread-151-1-1.html
ProcessMaker与CAS集成 http://forum.processmaker.com/viewtopic.php?f=9&t=930
使用 CAS 在 Tomcat 中实现单点登录 http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
【原创】CAS调研总结 http://www.iteye.com/topic/544899
ZCS证书的重新签发 http://opengeek.cn/thread-492-1-1.html
iPhone: There is no SDK with the name or path iphoneos XXX
今天开始继续学习iOS开发~
环境: MAC OS 10.6
编译《iPhone 应用程序开发名家解析》的源码报错
(源码下载:www.deitel.com/books/iphonefp
先注册,点 Register,填写相关信息,到邮箱里确认注册
登录,到www.deitel.com/books/iphonefp
下载页面左侧的Download Code Examples
)
iPhone: There is no SDK with the name or path iphoneos XXX
老的iPhone 项目,使用最新的 XCode 3.2进行编译,报错:
iPhone: There is no SDK with the name or path iphoneos XXX
解决办法:
在XCode的工具条里面选择 Project- Edit Project Setting –
在 General 里面 Project Format 选择 XCode 3.2,
在Build里面 Base SDK选择 iPhone Simulator 3.0
然后再重新编译即可。
常见编码转换
写JSP的时候经常会遇到各种编码问题,真的是程序员一大头疼问题。
最近又解决了一个编码问题,编码问题从Eclipse的编码,tomcat的编码,到jsp页面的编码都需要调整。
常见的编码解决办法有几种:设置tomcat的编码,设置jsp页面的编码和在servlet中强制转换编码。
由于有时候出现的问题,不知道到底是何种编码,需要转换成什么编码才能正确显示,于是写了下面一个小工具,可以用来进行几种编码的转换。
通过使用这个工具,可以将“测试”从UTF-8编码转换成GBK编码的“娴嬭瘯”,然后再转换回UFT-8的“测试”二字。
检测出Eclipse默认的GBK编码出现的问题~ 修改就好了~
附代码:
package util;
import java.io.UnsupportedEncodingException;
public class CharsetConvertor {
public static void main(String[] args) throws UnsupportedEncodingException {
String oldStr = "测试";
String tmp;
String[] code = { "utf8", "gb2312", "ISO8859_1", "unicode", "gbk" };
for (int i = 0; i < code.length; i++) {
for (int j = code.length – 1; j >= 0; j–) {
tmp = new String(oldStr.getBytes(code[i]), code[j]);
System.out.println((oldStr + " : " + code[i] + " to " + code[j] + " : " + tmp);
System.out.println(tmp + " : " + code[j] + " to " + code[i]
+ " : " + new String(tmp.getBytes(code[j]), code[i]));
System.out.println("========================================");
}
}
}
}
CUDA学习笔记(四)——CUDA性能
四、CUDA性能
CUDA中的block被划分成一个个的warp,在GeForce8800GTX上,一个warp有32个线程。若不够32个线程,则padding相应数目的线程。Warp中的线程ID是连续且递增的。对于二维组织的线程来说,先把threadIdx.y为0的线程按照threadIdx.x从小到大排,然后把threadIdx.y为1的线程按照threadIdx.x从小到大的顺序排列成warp。对于三维组织的线程来说,先排列 threadIdx.z为0的二维线程,再排列threadIdx.z为1的二维线程,以此类推。
任何时刻,硬件都只能一次选择执行一个warp。
下面2个图是执行元素总和的操作,不同的算法实现,其效率不同。第二种方法使得线程没有分支。
CUDA学习笔记(三)——CUDA内存
CUDA学习笔记(二)——CUDA线程模型
一个grid中的所有线程执行相同的内核函数,通过坐标进行区分。这些线程有两级的坐标,blockId和threadId,由CUDA runtime system指定。grimDim.x标识block在x维度上的数目,gridDim.y标识block在y维度上的数目。例如,