lizongbo 的 编程学习

http://618119.com

BlogJava 首页 新随笔 联系 聚合 管理
  23 Posts :: 1 Stories :: 78 Comments :: 0 Trackbacks

#

     摘要: 新注册了个独立域名,使用独立的blog了。

http://618119.com

新的blog rss订阅地址: http://feed.feedsky.com/lizongbo

从最早的 http://blog.csdn.net/lizongbo,

到 http://blog.donews.com/lizongbo

再到http://www.blogjava.net/lizongbo

现在终于拥有自己的域名和独立的blog了。  阅读全文
posted @ 2007-10-16 09:46 lizongbo 的编程学习| 编辑 收藏

mysql 双机热备配置

1.下载mysql-noinstall-5.0.45-win32.zip
2.解压到E:\mysql,然后将文件夹E:\mysql\mysql-noinstall-5.0.45-win32改为E:\mysql\master
3.再解压到E:\mysql,然后将文件夹E:\mysql\mysql-noinstall-5.0.45-win32改为E:\mysql\slave
4.复制E:\mysql\master\my-small.ini为E:\mysql\master\my.ini
编辑内容:,增加log-bin和binlog-do-db参数
示例如下:
#skip-networking
server-id = 1

# Uncomment the following if you want to log updates
#log-bin=mysql-bin

log-bin=mysql-bin
binlog-do-db = testdb1 #需同步数据库  testdb1
binlog-do-db = testdb2 #需同步数据库  testdb2

5.复制E:\mysql\slave\my-small.ini为E:\mysql\slave\my.ini
编辑内容:,修改端口,
port  = 3310

示例如下:

[client]
#password = your_password
port  = 3310
socket  = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port  = 3310
socket  = /tmp/mysql.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K


#skip-networking
server-id = 2

# Uncomment the following if you want to log updates
#log-bin=mysql-bin

master-host=127.0.0.1
master-user=root
master-password=
master-port=3306
replicate-do-db=testdb1
replicate-do-db=testdb2

6.保存 E:\mysql\master\my.ini.和E:\mysql\slave\my.ini

7.在命令行下运行E:\mysql\master\bin\mysqld.exe,

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

E:\mysql\master\bin>mysqld

8.再新开命令行,运行E:\mysql\slave\bin\mysqld.exe

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

E:\mysql\slave\bin>mysqld
071013 21:41:06 [Warning] The syntax for replication startup options is deprecat
ed and will be removed in MySQL 5.2. Please use 'CHANGE MASTER' instead.

9.用mysql 客户端 HeidiSQL连接到 127.0.0.1的3306,创建数据库testdb1和testdb2,
并在数据库中新建表,然后插入一些数据.

10.客户端连接 到 127.0.0.1的3310,可以看见数据库testdb1和testdb2,且数据库中的数据与master的数据库数据一致.

11.t查看 E:\mysql\master\data\mysql-bin.000001 和E:\mysql\master\data\mysql-bin.index,可以看到被记录的sql操作,

 




posted @ 2007-10-13 21:53 lizongbo 的编程学习| 编辑 收藏


4.4.6  Tomcat HTTPS配置
在server.xml里配置:
tomcat普通的https配置
    <Connector port="8443"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
           keystoreFile="conf/.keystore"
           keystorePass="lizongbo">
    </Connector>


Tomcat使用apr之后的ssl双向认证配置如下:

   <Connector port="8443" maxHttpHeaderSize="8192" protocol="HTTP/1.1"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" disableUploadTimeout="true"
              acceptCount="100" scheme="https" secure="true"
              clientAuth="true" <!--双向验证-->
              SSLEngine="on" bufferSize="8192"
              SSLEnabled="true"
              SSLProtocol="all"
              SSLCipherSuite="ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
              SSLCertificateFile="..\conf\ca\www.crt"
              SSLCertificateKeyFile="..\conf\ca\www.key"
              SSLCACertificateFile="..\conf\ca\ca.crt"
              SSLCACertificatePath="..\conf\ca"
              SSLVerifyDepth="15"
              SSLVerifyClient="require"
               />

 

4.6.6  Squid HTTPS
squid.conf中加上:
https_port 3443 cert=D:/ca/www.crt key=D:/ca/www.key


4.7.6  LightTPD HTTPS
首先使用copy命令把 key和crt合并为一个文件,
D:\ca>copy /b www.key+www.crt www.pem

然后配置如下:
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "D:/ca/www.pem"
ssl.ca-file = "D:/ca/ca.crt"
server.name = "www"
server.document-root = "D:/httpsdosc"
server.errorlog = "httpserror.log"
accesslog.filename = "httpsaccess.log"
}
(下面的双向验证没有测试是否可用)
如需启用双向验证,则还需下面的配置参数:
ssl.verify-peer = "enable"
ssl.verify-depth  = 1
参考:http://trac.lighttpd.net/trac/ticket/921


 

posted @ 2007-10-13 13:50 lizongbo 的编程学习| 编辑 收藏

     摘要: atj2135自带的avi转换工具 AVIConverter,
采用炬力ATJ2135主控芯片mp4,支持播放的avi格式为xvid编码,分辨率为320*240。
而我用网上的其它转换工具进行转换得到的avi,用电脑里 播放器可以播放,而用2135的mp4无法播放,
于是将2135自带的转换工具剥离出来了,放在网上,以作备份,方便avi转换。
工具名是:AVIConverter,下载地址为:
http://www.blogjava.net/Files/lizongbo/2135AVIConverter.part1.rar
http://www.blogjava.net/Files/lizongbo/2135AVIConverter.part2.rar

Line:488
Char:77
Code:0
Error:Automation 服务器不能创建对象
网址:http://www.blogjava.net/lizongbo/admin/EditPosts.aspx
无法发布正文,只好  阅读全文
posted @ 2007-10-10 09:26 lizongbo 的编程学习| 编辑 收藏

1.取出discuz的当前文件夹路径.
2.根据php版本,对于小于4.1.0的php,设置相应的变量.
3.载入全局函数库 global.func.php
4.判断网页机器人,对于不允许的机器人,返回403
5.过滤cookie
6.初始化变量
$charset = $dbcharset = $forumfounders = $metakeywords = $extrahead = '';
$plugins = $hooks = $admincp = array();
7.载入全局配置 config.inc.php
8.判断 论坛防御级别 作处理.
10.载入数据库的class库.
11.生成网站路径 boardurl
12.获取真实ip到 onlineip
13.正则解析ip
14.加载论坛配置参数缓存 /forumdata/cache/cache_settings.php
15.将settings中的变量转换为全局变量.
16.判断是否启用gzip压缩.
17.判断loadctrl负载参数,对于非windows下超过负载的 情况,返回系统忙错误.
18.对于几个固定的请求,加载已经生成的缓存数据.
19.连接数据库.
20.判断用户的安全提问
21.

 

 

附件下载流程 attachment.php

1.处理 common.inc.php 流程
2.检查Referer头信息
3.检查每日下载限制时间  periodscheck
4.查询附件信息检查附件是否存在
5.判断是否允许下载
6.判断是否已经购买
7.执行购买操作.
8.执行下载

posted @ 2007-08-29 10:01 lizongbo 的编程学习| 编辑 收藏

1.搭建php版运行环境,包括数据库和discuz php版本的运行,用于观察了解
2.搭建java web应用基础库,
3.对没有主键的标增加主键,用工具生成dao 层代码.(注意jdbc的url里需要写上charset)
4.生成logic层代码
5.对应每个控制层的php,转换成对应的spring mvc中的controller. 先从简单的faq.php做起
action映射使用.php后缀.

视图层使用jsp+jstl.

 


 

posted @ 2007-08-29 09:43 lizongbo 的编程学习| 编辑 收藏

由于原有模板是以.htm方式存在的,
在转换成jsp方式时,对其中很多通用的代码,可以通过替换的方式直接转换为jstl语法的.
步骤如下:

1.首先将所有的htm文件名替换成jsp,
在命令行下运行 rename *.htm *.jsp即可.

2.将bbs\forumdata\cache\style_1.php中的css变量TABLEWIDTH等,
替换成类似${crtStyles['TABLEWIDTH']}的jstl语法.
全部只能手工替换

3.将*.jsp中的{lang forum_favorite}等替换成类似 <fmt:message key="faq" bundle="${forum_favorite}"/>
使用正则表达式进行替换:
editplus中的 查找内容为: {lang (.+)},替换内容为:<fmt:message key="faq" bundle="${\1}"/>
Jbuilder中的查找内容为 \{lang (.+)\},Pattern为:Regular Expressions,
替换内容为:(暂时未写出来,打算写程序进行替换操作)

用java程序替换的核心代码为:

 //替换样式变量
             content = content.replaceAll("FORMHASH", "formhash");
             //替换样式变量 ${crtStyle['TABLEWIDTH']}
       content = content.replaceAll("\\{([A-Z0-9]+)\\}", "\\${crtStyle\\['$1'\\]}");
             //替换国际化定义
             //content = content.replaceAll("\\{lang (.+?)\\}",
             //                             "<fmt:message key=\"$1\" bundle=\"\\$\\{templates\\}\"/>");
             //对标签属性里的值暂时不替换
             content = content.replaceAll("([^\"])\\{lang (.+?)\\}",
       "$1<fmt:message key=\"$2\" bundle=\"\\$\\{templates\\}\"/>");

             //替换单层的属性访问
             content = content.replaceAll("\\$([a-z]+?)\\[([a-z]+?)\\]",
                                   "\\$\\{$1\\['$2'\\]\\}");
             //替换标题部分的声明
             content = content.replaceAll("\\{template header\\}",
                                   "<%@page pageEncoding=\"UTF-8\" " +
                                   "contentType=\"text/html;" +
                                   " charset=UTF-8\"%>\n"
                                   + "<%@include file=\"/WEB-INF/" +
                                   "inc/taglibs.jspf\"%>\n" +
                                   "<jsp:include flush=\"true\" " +
                                   "page=\"header.jsp\"/>\n");
             ////替换底部部分的声明
             content = content.replaceAll("\\{template footer\\}",
                                   "\n<jsp:include flush=\"true\" " +
                                   "page=\"footer.jsp\"/>");

             //替换其它引用声明
             content = content.replaceAll("\\{template (.+?)\\}",
                                   "\n<jsp:include flush=\"true\" " +
                                   "page=\"$1.jsp\"/>");
             //替换url定义
       content = content.replaceAll("\\$indexname", "\\${settings.indexname}");
             //替换网站名字
             content = content.replaceAll("\\$bbname", "\\${settings.bbname}");
             //替换导航标签
             content = content.replaceAll("\\$navigation", "\\${navigation}");
             //替换一些变量
             //content = content.replaceAll("\\$pid", "\\${pid}");
       content = content.replaceAll("\\$([a-z_]+)(\"|<|\\))", "\\${$1}$2");

posted @ 2007-08-29 09:42 lizongbo 的编程学习| 编辑 收藏


前言:discuz是一个很流行的 php论坛,一时好奇,打算学习并将其功能用java实现。
但是个人精力有限,只试着做了很小的一点功能。
但是在此过程中总结了一些经验:

需要转换实现机制的模块



1.计划任务
由于php受语言限制,必须靠外界的访问去触发计划任务,而java则可以通过qutarz来做定时任务.
因此可以采取spring配置 qutarz的方式去设置定时任务.

2.风格机制
使用.jsp,使用jstl语法,允许用户写jstl
依然按目录存放到templates目录下,每个风格为一个文件夹.

3.缓存机制
使用oscache 标签 来缓存页面的方式.

4.特殊标签的解析 hidden标签,reply标签
采取在显示的时候,进行 jsp:include page="/tag/hidden.jsp" 这样的方式来实现.

5.日历选择框: 使用jscalendar

6.页面gzip压缩,使用专门的gzip过滤器.

7.全文检索,使用compass.

8.视图层的模板.
discuz 已经使用了 mvc的模式,只是使用自己开发的模板技术,
 D:\xampp\htdocs\bbs\templates每个文件夹为一个主题,每个主题内对应的是各种视图的htm.
因此在用java实现的时候,使用spring mvc ,
视图层使用jsp来展示.
其中页面的布局分为三段
{template header} 是最上面的导航部分
{template footer} 是最下方的版权申明等部分.
中间部分为各具体模块的视图.
后台则是使用的固定框架,然后来合成内容的.

9.国际化支持
discuz使用的是 .lang.php定义数组的方式实现的,而且一次只支持一种语言
而java开发则使用I18N方式.多种语言均使用同一个系统.

 

 1.php的array功能非常强大,而java中只能用map和list结合起来处理.
2.在一个http请求中php的变量几乎都是全局生效,而jstl中,则可以放到requestScope中.

1.discuz的有些表的主键不是自动增长的,因此不能够生成@GeneratedValue(strategy = GenerationType.AUTO)的注释.
这些表有: new String[] {
      "validating", "trades", "relatedthreads", "pushedthreads", "polls",
      "onlinetime", "memberspaces", "memberfields", "forumfields",
      "admingroups", "adminactions", "activities"}

2.mysql的hibernate dao单元测试中,insert是无法回滚的,而delete却可以不操作数据库,
因此crud单元测试的时候,导致不停的插入数据却没有删除数据.
解决办法,在 crud 测试方法的最后加上一行代码:  this.setComplete();

3.mysql的jdbc需要几个特殊设置
a.字符编码集必须指定.
b.对于"0000-00-00" 这样的默认日期,在转化成java.sql.Date的时候会出错,因此需要加上个zeroDateTimeBehavior属性.

datasource.url=jdbc:mysql://localhost:3306/discuz?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull

4.mysql的jdbc驱动存在bug :  http://bugs.mysql.com/bug.php?id=22215

在usergroups 表中, readaccess字段是 tinyint(3)类型,而有值为200的,mysql的jdbc就会报错,说数字越界了.

java.sql.SQLException: '200' in column '1' is outside valid range for the
datatype TINYINT.

暂时无解决办法,采取修改200为20回避之.
(update:后来使用Short代替byte类型)
discuz 已经使用了 mvc的模式,只是使用自己开发的模板技术,
 D:\xampp\htdocs\bbs\templates每个文件夹为一个主题,每个主题内对应的是各种视图的htm.

因此在用java实现的时候,使用spring mvc ,

视图层使用jspx来展示.


其中页面的布局分为三段

{template header} 是最上面的导航部分

{template footer} 是最下方的版权申明等部分.

中间部分为各具体模块的视图.

 

后台则是使用的固定框架,然后来合成内容的.



 

posted @ 2007-08-29 09:41 lizongbo 的编程学习| 编辑 收藏


a.    安装vmware5.5。

b.    安装trixbox2.0
1.    下载trixbox22.0的vmware镜像文件,下载地址为:
http://jaist.dl.sourceforge.net/sourceforge/asteriskathome/trixbox-2.0-vmware.zip
2.    解压 trixbox-2.0-vmware.zip 到E:\trixbox 2.0。
3.    启动VMware,选择“Open Existing VM or Term”,
 
4.    然后选择打开 E:\trixbox 2.0\Red Hat Enterprise Linux 4.vmx.
 
5.    启动虚拟机.
 
6.    创建uuid,点“OK”进行确认。
 
7.    点“OK”进行确认。(也可以先修改虚拟机的光驱设置为正确的配置)
 
8.    鼠标点进虚拟机,敲回车立即进入Linux(或者等系统自己启动)
 
9.    敲回车,准备修改硬件配置
 
10.    移除原有的网络配置,选择“Remove Configuration”,然后敲回车.
 
11.    新的网络配置。选择“Configure”,然后回车
 
12.    配置ip地址,敲空格 选中“Use dynamic IP configuration (BOOTP/DHCP)”
 
13.    然后按 tab键 切换到“OK”,敲回车进行确认。
 
14.    登录linxu,用户名是root,密码是password。
 
15.    登录成功。屏幕上显示配置trixbox的url.
 
16.    用hostname查看主机名,用ifconfig查看ip信息。
 

c.    配置trixbox.
1.    在浏览器中打开: http://10.108.20.188/
然后点右上角“switch”切换到 Admin Mode
 
2.    输入登录信息,用户名是maint,密码是password
 
3.    进入freepbx配置界面。
 
4.    也可以从最上方一排菜单里转到freePBX配置, Asterisk  --> freePBX
 
5.    点“Setup”.
 
6.    进入配置界面,再点左边的“Extensions”,进入分机号码配置界面。
 
7.    Device使用默认选项“Generic SIP Device ” ,然后 点“submit”.
 
8.    填写分机号,和用户名字。这里填写的分机号是300,名字也填的300。
 
9.    拉动表单到下方,填写密码,也就是 secret的值,这里也填的300。
 
10.    再拉动表单到最下方,点“Submite”进行提交。
 
11.    分机添加成功,用同样方法,再添加”301”
 
12.    点左上方的红色“Apply Configuration Changes”,提交更改。
 

13.    确认。
 

14.    到这里为止,服务端的分机号码配置成功了。

d.    配置X-Lite 3.0
1.    X-Lite 的下载地址为:
https://s3.amazonaws.com/0W6GQ7E1ZFEHHTW1F082/downloads/X-Lite_Win32_1006e_34025.exe
2.    运行X-Lite_Win32_1006e_34025.exe进行安装。
3.    运行X-Lite。
 
4.     在主界面上点右键,从菜单中选择“SIP Accounts Settiings”,进入账号配置界面
 
5.    点“Add”添加账号,Display Name为:300,User name为:300,Password为:300,Authorization user name为:300,Domain为:10.108.20.188。钩上“Register with domain and receive incoming calls”, Send outbound via选择“domain”.然后点“确定”.
 
6.    该账号默认为 Enabled。,点“Close”。
 

7.    300登录成功。
 

8.    打电话给自己。输入号码:300,然后拨号。
 
9.    收到呼叫。
 

10.    linux控制台输出日志:
 

11.    web界面查询呼叫日志。


e.    安装Asterisk-IM 插件
1.下载最新的插件asterisk-im 1.2 beta,
http://www.igniterealtime.org/projects/wildfire/plugins-beta/asterisk-im.jar
2. 安装插件,但是由于我用的数据库是oracle,而插件中的脚本只更新了mysql的
因此需要手工用mysql的脚本改成oracle的来执行,主要是将字段类型bigint改成number.
再复制asterisk-im.jar到D:\xmpp\wildfire\plugins下面(光这一点就折腾了很久)。
3.启动wildfire。
f.    配置Asterisk-IM 参数信息
先在trixbox中增加管理账号:Config Edit ,编辑 manager.conf
增加:
[wildfire]
secret=mypass
allow=10.108.20.1.1/255.255.0.0
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user

wildfire中进行配置.
2.打开http://10.108.20.198:9090/plugins/asterisk-im/phone-settings.jsp
Add Server,
Server Name 必须是:  asterisk1.local (也就是vmware镜像的虚拟机里的主机名.)
Server Address为: 10.108.20.188
Port为: 5038
Username:wildfire
Password:mypass

添加成功之后,Configure Phone Manager
 Drop-down device selection:       钩上  Yes
 Asterisk Context为: from-internal
 然后点 save.
图标绿色,表示连接成功了.
然后到 Phone Mappings 中映射电话.

在xmpp客户端Spark中 call对方即可.或者直接输入电话号码进行呼叫.


posted @ 2007-01-22 10:30 lizongbo 的编程学习| 编辑 收藏

在 PLSQL Developer 中进行文本导入的操作步骤。

主菜单--〉工具-->文本导入器。
选择文本文件,进行相关配置,可以生成一个导入数据的配置文件。
保存为 xxx.def
样本为:

[General]
ID=Import Definition
Version=1
Header=False
SingleLineRecord=True
QuoteChar="
TableOwner=SMK
OracleTable=ZNEW20070109
OverwriteDuplicates=True
CommitCount=100
EmptyTable=False

[ODBC]
DSN=
UserName=
Command=
Kind=0

[Fields]
Field=0
FieldStart=0
FieldStartValue=0
FieldEnd=2
FieldEndValue=,
OracleSQL=
OracleField=FTRANSACTIONID (VARCHAR2)
OracleType=0
ODBCField=
ODBCFieldNo=0
ODBCType=0
ODBCCType=0
ODBCLength=0
OracleParamNo=0

Field=1
FieldStart=0
FieldStartValue=0
FieldEnd=2
FieldEndValue=,
OracleSQL=
OracleField=FFEETERMINAL (VARCHAR2)
OracleType=0
ODBCField=
ODBCFieldNo=0
ODBCType=0
ODBCCType=0
ODBCLength=0
OracleParamNo=0

Field=2
FieldStart=0
FieldStartValue=0
FieldEnd=2
FieldEndValue=,
OracleSQL=
OracleField=FDESTADDR (VARCHAR2)
OracleType=0
ODBCField=
ODBCFieldNo=0
ODBCType=0
ODBCCType=0
ODBCLength=0
OracleParamNo=0

Field=3
FieldStart=0
FieldStartValue=0
FieldEnd=2
FieldEndValue=,
OracleSQL=to_date('#', 'yyMMddHH24MISS')
OracleField=FSUBMITTIME (DATE)
OracleType=2
ODBCField=
ODBCFieldNo=0
ODBCType=0
ODBCCType=0
ODBCLength=0
OracleParamNo=0

Field=4
FieldStart=0
FieldStartValue=0
FieldEnd=2
FieldEndValue=,
OracleSQL=to_date('#', 'yyMMddHH24MISS')
OracleField=FDELIVERTIME (DATE)
OracleType=2
ODBCField=
ODBCFieldNo=0
ODBCType=0
ODBCCType=0
ODBCLength=0
OracleParamNo=0

posted @ 2007-01-17 12:44 lizongbo 的编程学习| 编辑 收藏

仅列出标题
共3页: 1 2 3 下一页