#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb
db=MySQLdb.connect(host="127.0.0.1",port=3306,db="django",user="sa",passwd="sa")
cur=db.cursor()
cur.execute("select count(*) from djuser")
print("rowcount=",cur.rowcount)
rows=cur.fetchall()
for row in rows:
print("%s" % (row[0]))
Author Archives: neohope
Python使用ODBC
#!/usr/bin/python
# -*- coding: utf-8 -*-
import ceODBC
con=ceODBC.connect('driver=MySQL ODBC 5.1 Driver;server=127.0.0.1;port=3306;database=django;uid=sa;pwd=sa;')
cur=ceODBC.Cursor(con)
cur.execute("SELECT count(*) FROM djuser")
rows=cur.fetchall()
for row in rows:
print(row[0])
Python调用dll
1.Test.h
#ifndef TEST_INTADD_HEADER #define TEST_INTADD_HEADER extern "C" int WINAPIV IntAdd(int a,int b); #endif
2.Test.cpp
#include <windows.h>
#include "Test.h"
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(hinstDLL);
UNREFERENCED_PARAMETER(lpReserved);
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" int WINAPIV IntAdd(int a,int b)
{
return a+b;
}
3.Test.def
LIBRARY "Test" EXPORTS IntAdd
4.test_cdll.py
#test_cdll.py #请用__cdecl调用约定而不是__stdcall from ctypes import * fileName="Test.dll" Test=cdll.LoadLibrary(fileName) print(Test.IntAdd(2,3))
JAAS配置
1.web.xml
<!-- JAAS认证 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>protected-resource</web-resource-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.action</url-pattern>
<http-method>HEAD</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>NEOJAAS</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description>JAASTest Roles</description>
<role-name>NEOJAAS</role-name>
</security-role>
2.login.jsp
<form method="post" action="j_security_check"] <label>用户名</label> <input name="j_username" type="text" maxlength="32" class="login-text"/> <label>密 码</label> <input name="j_password" type="password" maxlength="32" class="login-text"/> <input type="submit" class="stuff" value="登 录" /> </form>
打开Led闪光灯
#import <AVFoundation/AVFoundation.h>
-(IBAction)btnClicked:(id)sender
{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch])
{
if(AVCaptureTorchModeOn==[device torchMode])
{
[btn setTitle:@"Turn On" forState:UIControlStateNormal];
[device lockForConfiguration:nil];
[device setTorchMode: AVCaptureTorchModeOff];
[device unlockForConfiguration];
}
else if(AVCaptureTorchModeOff==[device torchMode])
{
[btn setTitle:@"Turn Off" forState:UIControlStateNormal];
[device lockForConfiguration:nil];
[device setTorchMode: AVCaptureTorchModeOn];
[device unlockForConfiguration];
}
}
}
好书推荐
1.C,CPP
《C++ Primer》当然放到第一位啦,一个词:经典
2.MFC
《深入浅出MFC》这本绝不是快餐,要慢慢品,其中的关键技术方针及图例堪称经典
3.Windows进阶
《Windows核心编程》无论是新手还是老手,都应该好好看的一本书哟
4.Win32汇编
《WINDOWS下32位汇编语言程序设计》初看这部书时,只有一个感觉:这是汇编吗?现在想来,这本书让我对Windows程序的运行原理有了一个较好的认识。虽然是汇编,但看懂不难,呵呵。
5.QT
市面上就没有看到本像样的书,全是垃圾食品。要我说,还没有比QT中的例子更好的资料呢。
6.OpenGL
要看就Google:OpenGL+NeHe
7.Java
《Core Java》两册一定要读!
《Thinking in Java》也不错:)
8.C#
《C#本质论》比某些超级厚的书给力多了
9.设计模式
G4的《Design Pattern》必读经典
10.管理
《人月神话》和《人件》必读经典。
未完待续…
VC计算CString摘要
1、VC计算字符串MD5摘要
//输入:要计算摘要的字符串
//输出:128位MD5摘要
#include <wincrypt.h>
CString szResult;
CString CDigestDlg::CalcMD5(CString strContent)
{
DWORD dwLength=0;
BYTE* pbContent=NULL;
dwLength = (DWORD)strContent.GetLength();
pbContent = new BYTE[dwLength];
memcpy(pbContent,strContent.GetBuffer(dwLength),dwLength);
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteMD5[16];
DWORD dwHashLen=16;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteMD5, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteMD5[0],byteMD5[1],byteMD5[2],byteMD5[3],byteMD5[4],byteMD5[5],byteMD5[6],byteMD5[7]
,byteMD5[8],byteMD5[9],byteMD5[10],byteMD5[11],byteMD5[12],byteMD5[13],byteMD5[14],byteMD5[15]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}
2、VC计算字符串SHA1摘要
//输入:要计算摘要的字符串
//输出:160位SHA1摘要
#include <wincrypt.h>
CString szResult;
CString CDigestDlg::CalcSHA1(CString strContent)
{
DWORD dwLength=0;
BYTE* pbContent=NULL;
dwLength = (DWORD)strContent.GetLength();
pbContent = new BYTE[dwLength];
memcpy(pbContent,strContent.GetBuffer(dwLength),dwLength);
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteSHA1[20];
DWORD dwHashLen=20;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteSHA1, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteSHA1[0],byteSHA1[1],byteSHA1[2],byteSHA1[3],byteSHA1[4],byteSHA1[5],byteSHA1[6],byteSHA1[7],
byteSHA1[8],byteSHA1[9],byteSHA1[10],byteSHA1[11],byteSHA1[12],byteSHA1[13],byteSHA1[14],byteSHA1[15],
byteSHA1[16],byteSHA1[17],byteSHA1[18],byteSHA1[19]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}
VC计算文件摘要
1、VC计算文件MD5摘要
//输入:文件路径
//输出:128位MD5摘要
#include <wincrypt.h>
CString szResult;
CString CMD5AndSHA1Dlg::CalcMD5(CString strFilePath)
{
//读取文件
CFile inFile;
CFileException ex;
DWORD dwLength=0;
BYTE* pbContent=NULL;
BOOL bRet;
bRet=inFile.Open(strFilePath,CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite,&ex);
if(bRet==FALSE)
{
return TEXT("Error opening file");;
}
dwLength = (DWORD)inFile.GetLength();
pbContent = new BYTE[dwLength];
if(pbContent==NULL)
{
return TEXT("Error not enough memory");;
}
inFile.Read(pbContent,dwLength);
inFile.Close();
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteMD5[16];
DWORD dwHashLen=16;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteMD5, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteMD5[0],byteMD5[1],byteMD5[2],byteMD5[3],byteMD5[4],byteMD5[5],byteMD5[6],byteMD5[7]
,byteMD5[8],byteMD5[9],byteMD5[10],byteMD5[11],byteMD5[12],byteMD5[13],byteMD5[14],byteMD5[15]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}
2、VC计算文件SHA1摘要
//输入:文件路径(文件必须小于2^64bit)
//输出:160位SHA1摘要
#include <wincrypt.h>
CString szResult;
CString CMD5AndSHA1Dlg::CalcSHA1(CString strFilePath)
{
//读取文件
CFile inFile;
CFileException ex;
DWORD dwLength=0;
BYTE* pbContent=NULL;
BOOL bRet;
bRet=inFile.Open(strFilePath,CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite,&ex);
if(bRet==FALSE)
{
return TEXT("Error opening file");;
}
dwLength = (DWORD)inFile.GetLength();
pbContent = new BYTE[dwLength];
if(pbContent==NULL)
{
return TEXT("Error not enough memory");;
}
inFile.Read(pbContent,dwLength);
inFile.Close();
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteSHA1[20];
DWORD dwHashLen=20;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteSHA1, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteSHA1[0],byteSHA1[1],byteSHA1[2],byteSHA1[3],byteSHA1[4],byteSHA1[5],byteSHA1[6],byteSHA1[7],
byteSHA1[8],byteSHA1[9],byteSHA1[10],byteSHA1[11],byteSHA1[12],byteSHA1[13],byteSHA1[14],byteSHA1[15],
byteSHA1[16],byteSHA1[17],byteSHA1[18],byteSHA1[19]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}
Tomcat中的Realm
Realm其实就是一个存放用户名,密码及角色的一个“数据库”。
Tomcat中的Realm有下面几种,你也可以使用自己的Realm,只要实现org.apache.catalina.Realm就可以了。
1.JDBCRealm
授权信息存在关系数据库中, 通过JDBC驱动访问
数据库中必须至少有两张表,表示用户及角色
用户表必须至少有两个字段,用户名及密码
角色表必须至少有两个字段,用户名及角色
create table users ( user_name varchar(15) not null primary key, user_pass varchar(15) not null ); create table user_roles ( user_name varchar(15) not null, role_name varchar(15) not null, primary key (user_name, role_name) );
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost/authority?user=dbuser&password=dbpass" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>
2.DataSourceRealm
授权信息存在关系数据库中, 通过JNDI JDBC数据源访问
数据库中必须至少有两张表,表示用户及角色
用户表必须至少有两个字段,用户名及密码
角色表必须至少有两个字段,用户名及角色
create table users ( user_name varchar(15) not null primary key, user_pass varchar(15) not null ); create table user_roles ( user_name varchar(15) not null, role_name varchar(15) not null, primary key (user_name, role_name) );
<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/authority" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>
3.JNDIRealm
授权信息存在LDAP目录服务器中,通过JNDI提供者访问
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionName="cn=Manager,dc=mycompany,dc=com"
connectionPassword="secret"
connectionURL="ldap://localhost:389"
userPassword="userPassword"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
/>
4.UserDatabaseRealm
默认配置,只是用于少量用户
授权信息存在用户数据JNDI资源中,该资源通常是一个XML文档 (conf/tomcat-users.xml)
<tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat" /> <user name="role1" password="tomcat" roles="role1" /> <user name="both" password="tomcat" roles="tomcat,role1" /> </tomcat-users>
5.MemoryRealm
授权信息存在内存中的对象集合中,该对象集合来自XML文档 (conf/tomcat-users.xml).
仅用于测试。
6.JAASRealm
通过JAAS框架访问授权信息,最灵活最开放的一种授权方式。
如果前面几种方式满足不了你的需求,可以先试试这种方式。
<Realm className="org.apache.catalina.realm.JAASRealm" appName="MyFooRealm" userClassNames="org.foobar.realm.FooUser" roleClassNames="org.foobar.realm.FooRole"/>
7.CombinedRealm
采用多种方式授权。
<Realm className="org.apache.catalina.realm.CombinedRealm" >
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
8.LockOutRealm
多次登录失败后,锁定用户
<Realm className="org.apache.catalina.realm.LockOutRealm" >
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
最后,如果你需要加密密码,那么需要只需要在Realm配置中指定所用的摘要算法就可以了
digest="MD5" digest="SHA"
CMD常用命令08特殊符号
1、.
表示当前目录
dir .\
2、..
表示上一级目录
dir ..\
3、””
界定符号,通常用来引用有空格的目录
dir "c:\Documents and settings"
4、::
注释,和REM类似
5、*
通配符号,表示任意个字符
dir c:\windows\*.log
6、?
通配符号,表示任意一个字符
dir c:\?indows
7、^
转义符
echo ^> >d:\1.txt
8、@
只显示命令执行结果
@echo 你好
9、>
重定向符号,覆盖
dir c:\ > d:\test.txt
10、>>
重定向符号,追加
dir c:\ >> d:\test.txt dir d:\ >> d:\test.txt
11、|
管道符
netstat -an | find "135"
12、,
某些时候可以当空格来使用
echo, dir,c:\
13、;
当命令相同时,可以将不同目标用来隔离
dir c:\;d:\
14、&
两个命令连续执行
dir c:\ & dir d:\ & dir e:\
15、&&
当&&前的命令执行成功时,执行&&后的命令
dir c:\ && dir d:\ dir z:\ && dir d:\
16、||
当||前的命令执行失败后,才执行||符号后的内容
dir z:\ || dir c:\ dir c:\ || dir d:\
17、%
%%用于引用变量
set hello=hi echo %hello%
18、:
标签
@echo off :again echo It's me again :) pause goto again