console.log扩展学习

在玩前端时console.log常常会用到,其实这货还有一堆小伙伴,在用不同浏览器的不同调试工具时有不同的方法可以调用。
如下参考chrome和firebug的方法api

https://developers.google.com/chrome-developer-tools/docs/console-api

http://getfirebug.com/wiki/index.php/Console_API

jsonp就是加载一个javascript文件

jsonp就是加载一个javascript文件

这个文件在服务器端能够动态处理请求

返回的是一个js函数,函数名能够通过请求的地址中callback参数传过去,js函数有一个参数,建议使用json格式

 

这就是jsonp

最快UCenter API使用入门

如果你写了一个WEB程序,你又想与ucenter共用一个用户库,你会怎么做?

来吧,让我告诉你,只要几个简单的步骤就行了。

1、先到ucenter administrator建一个应用,在应用里配置完你的项目的地址,在UC_KEY那里随便输入一些字符串,越长越好。【在这里有配置通讯文件的名称,好象是提示你在api目录下,你可以定义一个,默认是uc.php】。然后你会一直发现应用列表中,该应用一直是通讯失败。

2、生成应用后,在应用详情的最下方有一个textarea框,这个就是系统帮你生成的连接ucenter的配置文件 。

3、在您的项目根目录下建立一个api目录,里面放上刚才说的通讯文件,默认是uc.php

在通讯文件里定义一些常量,可以从uchome、supesite、等里面拷贝出来,其实就是一些返回值 的常量。

加载刚才ucenter administrator所生成的配置文件。

到comsenz的任何一个程序中拷贝一下authcode函数(一般在common.inc.php或者global.inc.php中)

写上简单的判断代码:

$code = $_GET[‘code’];   //取得GET回来的code变量

//经过authcode解码后,转化为一个数组,这个数组里其实就有一些简单的验证信息,如:时间,传递过来的操作等
parse_str(authcode($code, ‘DECODE’, UC_KEY), $get);

//如果当前时间大于传递来的时间1小时,返回超时
if(time() – $get[‘time’] > 3600) {
exit(‘Authracation has expiried’);
}

//如果转换出来的$get变量是空值 ,那肯定是出错了
if(empty($get)) {
exit(‘Invalid Request’);
}

//获取传递过来的操作
$action = $get[‘action’];

//写上一个简单的判断
if ($action == ‘test’){
exit(API_RETURN_SUCCEED);
}

4、写完这样的代码后,去ucenter管理中心看一下应用列表,是不是通讯成功了?

其实那个通讯成功,就是发送了一个 action = test过来。所以当返回1的时候就直接成功了。

不过,由于exit();函数自身的状态,如果参数是字符串,则会直接输出,而如果参数是整数,则仅仅用来表示退出程序,而整数则代表了error code。

If status is an integer, that value will also be used as the exit status. Exit statuses should be in the range 0 to 254, the exit status 255 is reserved by PHP and shall not be used. The status 0 is used to terminate the program successfully.

这时候,你就会发现,你必须得使用exit(“1″);才会真正的输出1。【当然,这是PHP的基础,与通信问题不大,在这里提出来,只是为了防止你明明写了exit(1),却不会输出而在那里拼命调试】

OK,到现在为止,一个简单的通讯就完成了。如果你需要更多的功能,可以参考一下server究竟提供了哪些服务,然后写上针对性的代码和判断就可以了。

本文没图,但我相信,说的应该够明白了吧?

IxEdit傻瓜式JavaScript开发工具(附下载、汉化版、视频教程)

昨天看到了这个工具,今天把视频教程看完了,真的非常简单。链接放这了~

js把字符串类型转换成数字型

<script>
function changeText()
{
var x=document.getElementById(“tid”);
var g = document.getElementById(“g”);
var go = x.options[x.selectedIndex].value;
switch (Number(go)){
case 0:
g.value = “0”;
break;
case 1:
g.value = “1”;
break;
case 2:
g.value = “2”;
break;
case 3:
g.value = “3”;
break;
default:
g.value = “de”;
}
}
</script>
<select name=”tid” id=”tid” class=”BigSelect” onchange=”changeText()” >
<option value=”0″>–请选择类型–</option>
<option value=”1″>abc</option>
<option value=”2″>abc2</option>
<option value=”3″>a3bc</option>
<input type=”text” id=”g” value=”a”>
</select>
如上代码中从下拉列表的选项读出值类型是字符串,无法被switch使用,故加上类型转换。

再谈git

这次试用git是为了对一个程序控制版本

专门搜了一下相关资料。

喏,这有一个教程,采用了 git版本控制

git-clone http://www.bitsun.com/git/gittutorcn.git

windows下创建git服务器还是挺麻烦的,所以干脆就只做本地用的,方便自己查看就好了

说下gui下的操作吧。

自己摸索的。

1、创建仓库,指定到自己的web目录下。

2、全选左侧未缓存的修改,菜单-》提交-》缓存为提交,菜单-》提交-》提交。

3、以后文件修改后重新扫描就会显示出来不同的地方,十分方便。

mysql调优

mysql最近老是出问题,linux服务器cpu居高不下,多次Google未果,今天终go出些有用的东西了
Too many connections 错误。
小结一下,要保证你的系统不会出现Too many connections 错误,需要注意两点:
1.保证你的apache的最大进程数不超过mysql的最大连接数;
2.不要在程序里面用过多mysql_pconnect连接到同一个数据库服务器(一个就够了).这需要好的编码习惯和规范.特别是不断的给系统增加

http://www.yeeach.com/2008/02/09/mysql-%E6%95%B0%E6%8D%AE%E5%BA%93cpu-%E5%8D%A0%E7%94%A8999%E9%97%AE%E9%A2%98%E8%B0%83%E4%BC%98%E6%9C%AD%E8%AE%B0/

http://blog.s135.com/post/349/

ckeditor+ckfinder

保存了一些关于新版ckeditor与ckfinder的整合的文章链接

禁用ckeditor+ckfinder的“浏览服务器”按钮

http://www.path8.net/tn/archives/1862

CKEditor + CKFinder 配置

http://hi.baidu.com/ggggggqwertyu/blog/item/770f822cf0ae97341e308943.html

http://blog.sina.com.cn/s/blog_6754f5fb0100k1nw.html

http://hi.baidu.com/yutangzi/blog/item/ef2109ff24150b1c08244d1f.html【推荐新手】

特殊设置

http://blog.csdn.net/cui55/archive/2010/06/18/5679083.aspx

http://wenwen.soso.com/z/q216932072.htm

Git It

话说Git我就用过一次,比我第一次用svn还早。那是当年Google Chromium源码第一次release。

为了访问网页,不得不翻过那堵墙。

打开了网页我却找不到一个http下载链接。而是一个Git://形式的文本。

当时也接触过一些linux,所以安装了Git Bash在命令行下一行一行的敲,愣是下了一小部分的Chromium下来,可是那堵墙又封上了,我只好就此打住,Git也随着重装系统而不再使用。

今天看wss留言要我写教程,我也不是很会,下下来安装过程发现win版有GUI的,安装的时候把快捷方式加入开始菜单就行了。

GUI版的Git简单明了并且大部分的菜单都汉化了,稍微接触过版本控制应该比较轻松使用吧。

Google map API 开发实例

刚接触谷歌 地图 ,用坐标定位后可能会不知道怎么深入了,来看例子吧。

例子如下:

一般都是经纬度定位。

地图标记及信息显示方法(打开页面即显示信息,关闭后无法再点开)

http://www.jonllen.com/upload/jonllen/case/GoogleMap_Point.html

地图标记及信息显示方法(可显示多个标记,关闭后可点开)

http://blog.54575.com/wp-files/2010/google_map_api_example.html

坐标快立得:(修改中心坐标到你需要的地区范围内再打开页面)

http://blog.54575.com/wp-files/2010/google_map_api_tools.html

地名定位:(可搜索地名,但小地方是搜不到的)

http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/v2/examples/geocoding-simple.html

参考网页:http://bbs.blueidea.com/thread-2967145-1-1.html以及其链接地址以及其链接地址的链接地址

JiaThis

网站地址:http://jiathis.com/

之前我曾找过社会化分享的按钮代码,并放到了bbpcn上。

今天偶然看到一个网站源码有个js是外联到上面这个网站,打开一看,原来是这么个网站。

“加上这个按钮,
您的网站将被分享到互联网任何角落。
稳步提升网站流量和搜索引擎排名的WEB2.0工具,
JiaThis是国内最大的社会化分享到按钮提供商:提供分享到QQ空间、新浪微博,分享到人人网、开心网、豆瓣等代码…网站主可以在这里获得按钮代码,嵌入到自己的网站上!”

由他们提供现成的分享按钮,确实能省不少事。

【转】ThinkPHP使用总结——外一则

ThinkPHP使用总结

ThinkPHP中的BUG及技巧与策:
1. 模板中不能使用的标签
{$content} {$i}
2. If标签
如:
试验后总是有想不到的错误, 这样,还不如直接用php
if(…){ …?>来得块些呢.

约定:
1.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致
2.控制器的类名以Action为后缀
3.模型的类名以Model为后缀,类名第一个字母须大写
4.数据库表名全部采用小写,

如:
数据表名: 前缀_表名
模型类名: 表名Model 注:这里的表名第一个字母要大写
创建对象: D(‘表名’) 注:这里的表名第一个字母要大写

定义控制器类
class IndexAction extends Action{
public function show(){
echo ‘这是新的 show 操作’;
}
}
然后在浏览器里面输入
http://localhost/myApp/index.php/Index/show/

定义模型类:
class 表名Model extends Model{
[//手动定义字段[可选]
protected $fields = array(
‘id’,
‘username’,
’email’,
‘age’,
‘_pk’=>’id’, //主键
‘_autoInc’=>true //是否自增
)
]
}

记录的修改:
$User = D(“User”) // 实例化 User 对象
$User->find(1) // 查找 id 为 1 的记录
$User->name = ‘ThinkPHP’ // 把查找到的记录的名称字段修改为 ThinkPHP
$User->save() // 保存修改的数据
更新特定字段的值
$User->setField(‘name’,’TopThink’,’id=1′)
同样可以支持对字段的操作
$User->setField(‘score’,'(score+1)’,’id=1′)

新建记录,方法1:
$User = new UserModel() //实例化 User 对象
$User->字段名 = 字段值 //给字段赋值
$User->add() //添加记录
新建记录,方法2:
$data[‘字段名’] = 字段值; //给字段赋值
$User = D(‘User’); //实例化 User 对象
$User->add($data); //$insertId,Add 方法的返回值就是最新操る的主键值,可以直接猎取。
新增多条记录:
$User = new UserModel()
$data[0][‘name’] = ‘ThinkPHP’
$data[0][’email’] =
$data[1][‘name’] = ‘流年’
$data[1][’email’] =
$User>addAll($data)

删除记录
$User->find(2)
$User->delete() // 删除查找到的记录
$User->delete(‘5,6’) // 删除主键为 5、6 的数据
$User->deleteAll() // 删除查询出来的所有数据

记录查询

$User->getDbFields() //猎取当前数据字段
$User->findAll(); //查找所有记录
$User->findAll(‘1,3,8’) //查询主键为1,3,8的记录集
$User->count() // 猎取记录数
$User->max(‘score’) // 猎取用户的最大积分
$User->min(‘score’,’score>0′) // 猎取积分大于 0 的用户的最小积分
$User->avg(‘字段名’) // 猎取所有记录的字段值的平均值
$User->sum(‘字段名’) // 统计字段值
$User->getN(2,’score>80′,’score desc’) // 返回符合条件的第 2 条记录
$User->getN(2,’score>80′,’score desc’) //还可以猎取最后第二条记录
$User->first(‘score>80′,’score desc’) //如果要查询第一条记录,还可以使用
$User->last(‘score>80′,’score desc’) // 猎取最后一条记录
$User->top(5,”,’score desc’) // 猎取积分最高的前 5 条记录
$User->getBy(‘name’,’liu21st’) //跟据字段的字段值来查询记录

$Model = new Model() // 实例化一个 model 对象 没有对应任何数据表
$Model->query(“select * from think_user where status=1”)

$objrs = $Model->query(“select * from think_user where status=1”) //自定义查询
$Model->execute(“update think_user set name=’thinkPHP’ where status=1″) //用于更新和写入数据的 sql 操作,返回影响的记录数

$User->startTrans() // 启动事务
$User->commit() // 提交事务
$User->rollback() // 事务回滚

模板:

$this->assign(‘name’,$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值

$this->display() // 输出模版文件

批量赋值
$array[‘name’] = ‘thinkphp’
$array[’email’] =
$array[‘phone’] = ”
$this->assign($array)

$this->display() // 调用 User 模块的 read 操作模版
$this->display(‘edit’) // 调用 User 模块的 edit 操作模版
$this->display(‘Member:read’) // 调用 Member 模块的 read 操作模版
$this->display() // 调用 Xp 主题的 User 模块的 edit 操作模版
$this->display(‘../Member/read.html’) // 直接指定模版文件的全名

模板标签:

{ } 或 {// 注释内容 } //模板注释
{$user[‘name’]} //输出数组变量
{$user:name} //输出对象的属性

为了方便模板定义,无论输出的模板变量是数组还是对象,都可以用下列统一方式输出:
{$user.name}
如果是多维数组或者多层对象属性的输出,请使用下面的定义方式:
{$user[‘sub’][‘name’]}
{$user:sub:name}

使用函数:
格式:{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置

细叱变量
{$Think.server.script_name } //取得$_SERVER 变量
{$Think.session.session_id|md5 } // 猎取$_SESSION 变量
{$Think.get.pageNumber } //猎取$_GET 变量
{$Think.cookie.name } //猎取$_COOKIE 变量
系统常量
{$Think.const.__FILE__ }
{$Think.const.MODULE_NAME }
特殊变量 ,由 ThinkPHP 系统定义的常量
{$Think.version } //版本
{$Think.now } //现在时间

块捷输出
{:function(…)} //执行方法并输出返回值
{~function} //执行方法不输出
} //输出 Session 变量
{&var} //输出配置参数
{%var} //输出语言变量
{.var} //输出 GET 变量
{^var} //输出 POST 变量
{*var} //输出常量

包含外部文件
// 用变量控制要导入的模版
// 使用一个完正的文件名包含

循环输出
iterate 还有其它的别名,包括 volist,resultset,sublist

模版赋值:
$User = D(‘User’)
$list = $User->findAll()
$this->assign(‘list’,$list)

模版定义:

{$vo.name}

注意 name 和 id 表示的含义
// 输出 list 的第 5~15 条记录

{$vo.name}

// 输出偶数记录

{$vo.name}

// 输出 key

{$k}.{$vo.name}

//子循环输出

{$sub.name}

Switch 标签

value1
value2
default

其中 name 属性可以使用函数以及细叱变量,例如:

admin
default

也可以对 case 的 value 属性使用变量,例如:

admin
member
default

ThinkPHP中FCKeditor编辑器的使用

前段时间一直为TP寻找好用的在线编辑器而苦恼,经过多次尝试与修改后,终于成功地将编辑器集成到Thinkphp里面。而且可以用直接上传和ajax两种方式处理内容。为了给一些还没能成功地集成fckeditor的同侪们一些启发与帮助,兹将我的经验与体会描述如下:
应用目的:将FCKeditor编辑器集成到Thinkphp中,使用户能够在线像编辑Word一样处理即将发表的文字与图像。
应用软件与环境:apache服务器2.0以上版本,PHP版本5.0以上,mysql5.0以上;Thinkphp版本1.5或以上,Fckeditor版本2.x。
应用步骤:
1、下载FCKeditor2.x版本,将解压后的文件夹FCKeditor复制到ThinkPHP文件夹下的Vendor目录下,以便符合THinkPHP的第三方类库引入规则。
2、修改参数:
首先,用EditPlus等软件打开FCKeditor目录下的fckeditor_php5.php文件,找到第130行。出现内容如下:

public function __construct( $instanceName )

{$this->InstanceName
= $instanceName ;
$this->BasePath= ‘   ‘ ;

$this->Width
= ‘900′;

$this->Height
= ‘400′;

$this->ToolbarSet
= ‘Default’ ;

$this->Value
=   ‘  ’;
$this->Config
= array() ;

}
public function __construct( $instanceName )

{

$this->InstanceName
= $instanceName ;

$this->BasePath
= ‘/bm/ThinkPHP/Vendor/FCKeditor/’ ;

$this->Width
= ‘900′;

$this->Height
= ‘400′;

$this->ToolbarSet
= ‘Default’ ;

$this->Value
= ”;
其中,最关键的就是将Basepath设置好。里面填写的就是fckeditor_php5.php文件相对于网站文档根目录(document root)的路径。其实这就是用以表征FCKeditor编辑器相对根目录的路径。比如服务器的文档根目录最下级是htdocs/或www/,项目名为project,project项目文件夹下有Thinkphp系统文件包与项目文件包myapp。而且服务器没有对该项目设置虚拟主机的话,此时的文档根目录仍是www/或htdocs/,那么应该是$this->BasePath=’/project/ThinPHP/Vendor/FCKeditor/’;
若是设置了虚拟主机,即将project变为虚拟的文档根目录,通过某一域名能够直接访问网站项目的话,那么此时,
$this->BasePath=’/ThinPHP/Vendor/FCKeditor/’;
其他的参数如宽度与高度可以填或不填,若填下的话就是编辑器的默认高与宽。InstanceName是编辑器所在标签的id与name,此时不用理会。其他参数也不用理会。
其次,在FCKeditoreditorfilemanagerconnectorsphp下面找到config.php文件,打开它,找到30与34行。需要改写的参数如下:$Config[‘Enabled’] = true ;
$Config[‘UserFilesPath’] = ‘    ’ ;
其中,第一个参数应该设为true.默认是true.第二个参数填写的是上传文件的路径,比如要显示的图片等。我们在project目录下建立一个 uploads文件夹,那么$Config[‘UserFilesPath’] = ‘ /project/uploads/   ‘;路径规则与上一个basepath一样。要是project是虚拟文档根目录的话,那么$Config[‘UserFilesPath’] = ‘ /uploads/   ‘;
3、应用程序:
比如在myapp项目中Lib目录下IndexAction.class.php控制器类中的index方法中,当访问该程序时,输出的模板网页里有form表单,要求用户输入一篇文章,那么就可以用到编辑器.代码示例如下,只显示与fckeditor有关的代码,其他代码会略。
首先是服务器程序:
public function index()
{……//其他代码
vendor(”FCKeditor.fckeditor”);//包含FCKeditor类库,TP引入第三方类库的系统方法,其路径是相对于vendor目录来说的。
$editor= new FCKeditor();   //实例化FCKeditor对象
$editor->Width=’980′;//设置编辑器实际需要的宽度。此项省略的话,会使用默认的宽度。
$editor->Height=’400′;//设置编辑器实际需要的高度。此项省略的话,会使用默认的高度。
$this->Value=”;//设置编辑器初始值。也可以是修改数据时的设定值。可以置空。
$editor->InstanceName=’comment’;//设置编辑器所在表单内输入标签的id与name,即<input& gt;标签的id与name。此处假            //设为comment.此处不可省,也要保持唯一性。表单上传到服务器处理程序后,即可通过$_POST[‘comment’]来读取。
$html=$editor->Createhtml();//创建在线编辑器html代码字符串,并赋值给字符串变量$html.
$this->assign(’html’,$html);//将$html的值赋给模板变量$html.在模板里通过{$html}可以直接引用。
…….//其他代码,包括输出模板。
}
其次是对应的html模板即index 文件。只需要在需要的地方插入编辑器即可,其他代码与一般的<form>写法一样。
…….<!–其他html代码     –>
<div>
<form id=”commentform” name=”commentform” action=””>//action里填写表单处理程序,如’__APP__/Index/check’。  指的是IndexAction类下的check()方法来处理提交的表单数据。
<table style=”width:100%;”>
<tr>
<td style=”text-align:left;”>添加新评论:
</td>
</tr>
……//其他表单填写项
<tr>
<td > {$html}</td>
</tr>
<tr>
<td><input type=”submit” value=”提交评论” >
</td>
</tr>
</table>
</form>
</div>
到这里, 已经可以用了。在表单处理程序里像通常处理表单元素那样就行。但是,有的时候项目移植后,上传的图片等链接路径会被错误编译,以致不能正确显示图片等东西。通常是双引号解析错误,我还没有解决。要想不出错的话,可以采取ajax的方式处理表单数据。不过在进行ajax处理之前,要先用一段js代码将编辑器中的值赋给表单中 name是instacename的值的表单元素。比如,本项示例中要用ajax对表单进行处理的话,index模板文件中必须在表单处理前运行的一段 js代码为:
…….//其他js代码
var  editor=FCKeditorAPI.GetInstance(’comment’);//comment是设置的instanceName值.
document.commentform.comment.value=editor.EditorDocument.body.innerHTML; //将编辑器中内容处理后的源代码                                                                                                               //赋值给commentform表单的comment 属性元素值。
……//其他js代码
注:个人认为xajax比较不错,只需要将主要精力花在后台程序上。我也是用xajax进行数据处理的。前台代码很简单。

开始尝试ThinkPHP开发

前几天下了ThinkPHP,并按照手册上的例子生成了首页,并不是很理解它所谓的单一入口文件的意思。今想用它增加一个login页。仔细研读下才明白。

整个项目就一个index.php文件。引入ThinkPHP框架后通过类似于

http://[::1]/index.php/index/index

http://[::1]/index.php/index/login

这种形式来访问。即手册中所指:“ThinkPHP 框架的应用采用单一入口文件来执行,所有的模块和操作都通过URL 的参数来访问和执行。”

正则表达式的问号|nginx rewrite 匹配问号(?)

今天再给bbpcn.net添加rewrite功能时遇到一个难题。

要把这个地址http://bbpcn.net/bb-admin/admin-base.php?page=4&plugin=mass_edit

rewrite成这个http://bbpcn.net/bb-admin/admin-base.php/page/4?plugin=mass_edit

考虑到通用性我的语句为

rewrite ^/bb-admin/admin-base.php/page/([0-9]+)&plugin=(.*)$ /bb-admin/admin-base.php?page=4&plugin=$2 last;

但是reload nginx后一直在404,于是猜测是正则问题。

之前写的rewrite规则都比较简单,这次多了些特殊符号,“.”、“?”。按照我那破破的C语言水平,我试着添加转义符号“”,不过依然不起作用,开始在Google上以多个关键字搜索,终于让我找到方法了。

这个问题apache和nginx可能都存在。

只说解决方法吧。点号可以用反斜杠转义,问号后面的字符串用自带变量处理。最终我的rewrite规则改写为如下即可。

rewrite ^/bb-admin/admin-base.php/page/([0-9]+)$ /bb-admin/admin-base.php?page=$1&query_string last;

【转】windows 下 openvpn 使用小结

由于03自带的vpn服务器改端口麻烦(不知道能不能改…),而且它只支持tcp连接,所以如果碰到VPN要用指定端口连接,或者想 用win做linux的vpn服务器的话,openvpn是个不错的选择。用了也有一段时间了,除了IPV6问题没解 决外,感觉一切还在掌握之中。简单小结下过程。可能somebody会需要…

1. 服务端
环境:win2003+openvpn2.1.1
(1)安装openvpn,最好默认安装,否则后面配置时注意路径。
(2)到安装目录下的easy-rsa文件夹下,用文本编辑器打开vars.bat.sample文件,根据需要修改最后几行(其实也可以不改,就是为了 配置过程中输入的东西少点):

  1. set KEY_COUNTRY=CN
  2. set KEY_PROVINCE=GD
  3. set KEY_CITY=FS
  4. set KEY_ORG=NCIST
  5. set KEY_EMAIL=a@b.com


(3)打开cmd命令行窗口同样进入到安装目录下的easy-rsa文件夹,分别执行下面三个命令:

  1. init-config
  2. vars
  3. clean-all


上面是初始化工作,以后,在进行证书制作工作时,仍旧需要进行初始化,但只需要进入openvpneasy-rsa目录,运行vars就 可以了,不需要上面那些步骤了。
(4)生成根证书,分别执行命令:

  1. build-ca
  2. build-dh


(5)生成服务端密钥:

  1. build-key-server server


(6)生成客户端密钥

  1. build-key client1


build-key client2 可以继续配置第二个VPN客户端密钥
以上三步执行过程中需要输入一些参数,大部分只需按要求输入即可。其中一些是需要注意的:

  • common name,出现三次,据说要求每次输入的都不一样,至于都一样行不行我没试,那就随便输入三个不一样的参数。
  • A challenge password []:  An optional company name []: 这两个都可以留空

将生成的keys文件夹内的ca.crt,dh1024.pem,server.crt,server.key,ta.key复制到 OpenVPNconfig目录下

(7)配置文件

  1. port 60000
  2. proto udp //如果不能连接换成tcp
  3. dev tap
  4. //下面四项注意路径,如果不是放在config目录下请用绝对路径
  5. ca ca.crt
  6. cert server.crt
  7. key server.key
  8. dh dh1024.pem
  9. server 192.168.10.0 255.255.255.0
  10. ifconfig-pool-persist ipp.txt
  11. push “route 0.0.0.0 0.0.0.0”
  12. push “redirect-gateway def1 bypass-dhcp”
  13. push “dhcp-option DNS 192.168.175.5” //这个根据实际自行修改
  14. keepalive 20 120
  15. comp-lzo
  16. persist-key
  17. persist-tun
  18. status openvpn-status.log
  19. verb 3


要配置的大概就是这些,将配置文件另存为.ovpn文件,并保存到openvpnconfig目录下即可。如果需要通过服务器端连接外网,还需配置 win2003自带的vpn服务器,在nat/防火墙那里把本地连接接口添加进去。

2.客户端
客户端安装openvpn后,只需把服务端生成的ca.crt client.crt client.key三个文件拷到openvpnconfig目录下,再建一个配置文件即可。
配置文件:

  1. client
  2. dev tap
  3. proto udp
  4. remote 10.1.x.x 60000 //服务器ip 端口
  5. resolv-retry infinite
  6. nobind
  7. persist-key
  8. persist-tun
  9. ca ca.crt
  10. cert client.crt
  11. key client.key
  12. ns-cert-type server
  13. comp-lzo
  14. verb 3


大概就是这个样吧…
然后还有些小技巧:
(1)让openvpn随系统自启:编个批处理,写入以下代码:

  1. net start openvpnservice
  2. openvpn-gui-1.0.3 –connect client1.ovpn
  3. pause


其中:
net start openvpnservice 是启动openvpn的系统服务。
openvpn-gui-1.0.3  –connect client.ovpn是用命令行方式连接openvpn,这里要注意路径问题:一是openvpn-gui-1.0.3,这个文件在 OpenVPNbin目录下,如果出现不是有效命令,请在系统环境变量里把“C:Program FilesOpenVPNbin”添加进去;二是client.ovpn配置文件的路径,如果配置文件不是在config根目录,请用绝对路径。

另:转份配置文件的解析,可以琢磨下:

openvpn配置文件详解

转自星期三~

dz7.2论坛Got error 134 from storage engine修复记

版主室有人报告某个新建板块无法访问的问题,过去一看
Got error 134 from storage engine
习惯性的点进dz的faq页,说是要么mysql空间满了,要么硬盘坏了,我心说要是mysql数据坏了就杯具了,Google一下,有说用命令修复一下mysql就行了,抱着试一下的心态,dz后台->工具->数据库->优化
更新缓存。
页面能访问了。

多种方法结合加速网站

使用主从读写分离 + memcached + eaccelerator + 页面缓存技术加速网站
windows环境下:
安装appserv 工具包。

配置apache的虚拟主机:
Include conf/extra/httpd-vhosts.conf

编辑httpd-vhosts.conf:
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot “D:/AppServ/www/”
ServerName youhap
ErrorLog “logs/youhap-error.log”
CustomLog “logs/youhap-access.log” common
</VirtualHost>

<VirtualHost *:80>
DocumentRoot “D:/AppServ/www/mysite/”
ServerName center
ErrorLog “logs/center-error.log”
CustomLog “logs/center-access.log” common
</VirtualHost>

编辑hosts:
127.0.0.1    localhost
127.0.0.1    center
127.0.0.1    youhap

分别保存。

php编码,我使用的是codeigniter这个框架。
下载地址:http://219.239.26.9/download/832062/866311/1/zip/151/72/1252812646551_840/CodeIgniter_1.7.2.zip

mysql主从分离:

mysql主从配置及优化:
————-Mysql Replication Setup————
# The MySQL server
[mysqld]
port            = 3306
server-id = 1
#log-bin
master-host = 10.99.1.1
master-user = slave
master-password = slave
master-port = 3306
slave-skip-errors = 1050,1007,1051,1062
read-only
socket          = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU’s*2 for thread_concurrency
thread_concurrency = 8

在master执行:
mysql>GRANT FILE ON *.* TO slave@’%’ IDENTIFIED BY ‘slave’;
mysql>GRANT REPLICATION SLAVE ON *.*  TO slave@’%’ IDENTIFIED BY ‘slave’;
mysql>flush privileges;

修改slave的my.cnf:
master-host     =  10.99.1.1
master-user     =  slave
master-password =  slave
master-port     =  3306
server-id       =  2
slave-skip-errors = 1050,1007,1051,1062
read-only

启动mysql以后,
在从上执行:slave start;
主从复制成功以后,继续。

一个主master,多个从slave
修改、插入连接master服务器,读取数据从slave上读取。
以下代码已经测试通过。
数据库连接设置:
<?php
$active_group = “master”;
$active_record = TRUE;

$db[‘master’][‘hostname’] = “192.168.1.1”;
$db[‘master’][‘username’] = “root”;
$db[‘master’][‘password’] = “******************”;
$db[‘master’][‘database’] = “dbname”;
$db[‘master’][‘dbdriver’] = “mysql”;
$db[‘master’][‘dbprefix’] = “”;
$db[‘master’][‘pconnect’] = TRUE;
$db[‘master’][‘db_debug’] = TRUE;
$db[‘master’][‘cache_on’] = FALSE;
$db[‘master’][‘cachedir’] = “”;
$db[‘master’][‘char_set’] = “utf8”;
$db[‘master’][‘dbcollat’] = “utf8_general_ci”;

$db[‘slave’][‘hostname’] = “192.168.1.2”;
$db[‘slave’][‘username’] = “root”;
$db[‘slave’][‘password’] = “********************”;
$db[‘slave’][‘database’] = “dbname”;
$db[‘slave’][‘dbdriver’] = “mysql”;
$db[‘slave’][‘dbprefix’] = “”;
$db[‘slave’][‘pconnect’] = TRUE;
$db[‘slave’][‘db_debug’] = TRUE;
$db[‘slave’][‘cache_on’] = FALSE;
$db[‘slave’][‘cachedir’] = “”;
$db[‘slave’][‘char_set’] = “utf8”;
$db[‘slave’][‘dbcollat’] = “utf8_general_ci”;
?>

这个地方,主从已经分离。但是,如果只有主和从两台服务器的话,如果写数据库的操作所占比例较小的情况下,也可以让主服务器承担一部分查询操作。修改以上的配置:
$rand = mt_rand(1, 10);
/* 只有主从
* 读取数据,主:30%,从70%
* */
if( $rand < 4){
$db[‘slave’][‘hostname’] = ‘master_ip’;
}else{
$db[‘slave’][‘hostname’] = ‘slave_ip’;
}

/* 多个从,随机选择其中之一读取数据
* $slaveGroup = array(‘slave1_ip’ => 1, ‘slave2_ip’ => 2, ‘slave3_ip’ => 3);
* $db[‘slave’][‘hostname’] = array_rand($slaveGroup, 1);
* */

控制器:
<?php
class Replication extends Controller{
private $master;
private $slave;

function Replication(){
parent::Controller();
$this->master = $this->load->database(‘master’, true, true);
$this->slave = $this->load->database(‘slave’, true, true);
}
function index(){
//读写分离技术
$this->master->set(‘awardName’, ‘2008 olimpic games media’);
$this->master->set(‘awardSubTypeId’, 1);
$this->master->set(‘awardTypeId’, 1);
$this->master->insert(‘awards’);

$this->slave->from(‘t_login’);
$query2 = $this->slave->get();
}

function memcache(){
$this->load->library(‘cache’);
$conn = $this->cache->useMemcache(‘127.0.0.1’, 11211);
$this->slave->from(‘t_login’);
$query = $this->slave->get();
$this->cache->save(‘loginInfo’, $query->result(), null, 3600);
var_dump($this->cache->get(‘loginInfo’));

?>

安装memcached:
下载:http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip
安装:cmd –> memcached.exe -d install
启动:cmd –> memcached.exe -d start
启动成功以后。

在php.ini里面加载memcache.dll
下载:http://jp.php.net/distributions/pecl-5.2.6-Win32.zip(注意版本,我的php是5.2.6)
解压缩,找到memcache.dll放在ext目录下。

加载:打开php.ini:
extension=php_memcache.dll

重启apache。没有错误表示可以用memcache了。

使用:
<?php

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$data = $memcache->get('view_data');
$memcache->set('view_data', $data, false, 3600) or die ("Failed to save data at the server");
$memcache->get('view_data');

?>

文件: Cache.zip
大小: 1KB
下载: 下载

继续优化:
使用eAccelerator,官方主页:http://eaccelerator.net/
windows版本:http://www.sitebuddy.com/PHP/Accelerators/eAccelerator_windows_binaries_builds

注意版本。

下载好的eAccelerator0952_5.2.6.dll放在php的ext扩展下,打开php.ini:

extension=eAccelerator0952_5.2.6.dll
eaccelerator.shm_size=”64″ ; 20MB per heavy site ?
eaccelerator.cache_dir=”D:AppServwwwmysitesystemcache”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
; 0 should be faster but will skip checking the modified date on your cached files eaccelerator.debug=”0″
eaccelerator.filter=””
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”0″ ;( I have used 3600 = 1 hour)
eaccelerator.shm_prune_period=”0″  ;( testing 1800)
eaccelerator.shm_only=”0″ ;(testing 1 this seem noticeably faster?)
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
eaccelerator.keys = “shm” ;(testing)
eaccelerator.sessions = “shm” ;(testing)
eaccelerator.content = “shm” ;(testing)
eaccelerator.admin.name=”yourusername” ;(upto eAccelerator 0.9.4)
eaccelerator.admin.password=”yourpassword” ;(upto eAccelerator 0.9.4

如果还不够快,可以用smarty或者其他的页面缓存。这样你的网站就跟飞一样快。

有人已经测试过了,在这里:http://www.haughin.com/2008/02/13/optimizing-and-scaling-your-codeigniter-application/

参考文档:
http://devbee.com/opcode_cache_for_dummies
http://www.haughin.com/2008/02/13/optimizing-and-scaling-your-codeigniter-application/
http://www.sitebuddy.com/PHP/Accelerators/eAccelerator
http://blog.zol.com.cn/838/article_837067.html
http://hi.baidu.com/xpiaoxue/blog/item/f87b2aecbb33c534279791ac.html
http://codeigniter.com/forums/viewthread/57117/

Discuz!的Memcache缓存实现【转】

Discuz!的Memcache缓存实现

原文地址:http://www.ccvita.com/261.html

前言
在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问 量。同时给出一些使用Memcache去减轻MySQL压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。另外由于个人思维的问 题,行文比较跳跃,特此声明!

系统分析
单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困 难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的 PV,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。

就我手头的一些数据显示,目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力 增大可以通过并行增加服务器解决,而MySQL压力却无处释放,在不考虑MySQL官方服务的情况下,我们通过合理的利用Memcache是可以达到减轻 MySQL服务器负载的。

可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表)处理,但是当前的情况 是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(注:本段文字针对已经成型的 系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。

还可能有朋友会说利用MySQL的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在Mysql Master/Slave 模式中,Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,对外部请求进行处理,直到Master恢 复正常。就是说:在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master /Slave同时提供服务。使用MySQL主从依然不能有效的降低MySQL的负载。

或许你又会问我为什么不使用MySQL集群(MySQL Cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。PS:说句题外话,MySQL手册中将MySQL集群解释为 MySQL簇,不习惯。

其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为 单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一。但是遗憾的是,这种MySQL 分区的方式我个人没有使用过的经历,也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用 MySQL分区,但是遗憾的是我没有得到确切的数据。

好了分析总结了这么多种降低MySQL负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解Discuz!论坛的MySQL 负载比较有效的方法就是使用Memcache!

使用Memcache的理由
1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。
2.金钱金钱金钱,最少的付出,获得最大的收益。
3.简单简单简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程

Discuz!使用Memcache
1.在config.inc.php中增加

$memcachehost = ‘127.0.0.1’;
$memcacheport = 11211;
$memcachelife = 60;

2.在include/common.inc.php中

$mem = new Memcache;
$mem->connect($memcachehost, $memcacheport);

3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql 方法,代码如下:

function fetch_array($query, $result_type = MYSQL_ASSOC) {
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0];
}

function query_memcache($sql, $type = ”) {
global $mem,$memcachelife;

$key = md5($sql);
if(!($query = $mem->get($key))) {
$query = $this->query($sql, $type);
while($item  = $this->fetch_array($query)) {
$res[] = $item;
}
$query = $res;
$mem->set($key, $query , 0, $memcachelife);
}
return $query;
}

function query($sql, $type = ”) {
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;

$func = $type == ‘UNBUFFERED’ && @function_exists(‘mysql_unbuffered_query’) ?
‘mysql_unbuffered_query’ : ‘mysql_query’;
if(!($query = $func($sql, $this->link)) && $type != ‘SILENT’) {
$this->halt(‘MySQL Query Error’, $sql);
}

if(substr($sql, 0, 6) == ‘SELECT’) {
echo ‘<font color=”red”>Cache SQL</font>:<font color=”green”>’.$sql.'</font><br /><br />’;
} else {
echo ‘<font color=”red”>Flash SQL</font>:<font color=”green”>’.$sql.'</font><br /><br />’;
}

$this->querynum++;
return $query;
}

4.将需要使用Memcache缓存的SQL查询的代码由

$db->query(

修改为

$db->query_memcache(

注意并将

while($post = $db->fetch_array($query)) {

修改为

foreach($query as $post) {

没有while的$db->fetch_array可以不用修改。

下面代码有用得着的就拿去:

preg_replace(“/while([$](w+)s*=s*[$]db->fetch_array([$]query))/is”, “foreach($query as $1)”, $file);

回头放出个小工具批量替换下就可以了。
在EditPlus中可以这样替换:while([$](.*) = [$]db->fetch_array([$]query))替换为foreach($query as $1)
5.完成了,测试吧!~

参考资料
对Memcached有疑问的朋友可以参考下列文章:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html
Memcache分布式部署方案:http://www.ccvita.com/395.html

后记
写完之后突然发现天已经要亮了,闷骚了一个晚上。个人的一些总结,欢迎留言探讨!

Tag: ,

kimi at 2007-12-17 05:39:29 in Memcache

版权声明:原创作品,欢迎转载,转载时请务必以超链接形式标明文章原始地址、作者信息和本声明。

ftpseek初步使用

虽然是初步使用,但是却折腾我好久。
之前用上ipv6后阅读了上海交大ipv6站提供的一些资料,通过一份ppt的介绍,我知道了一款名为ftpseek的开源ftp检索系统。php+mysql,功能够用了。但sf上该计划早已停止更新,最后的版本是0.32.相关的资料真的非常少,我一开始想这这php文件就这么几个,最不济自己读一遍就能完全掌握了,结果却费了九牛二虎之力。
安装十分简单,用phpmyadmin建立一个新账户和数据库,解压后修改include.php,在浏览器中打开install.php不出意外就直接显示安装成功。打开index.php十分顺利,但是怎么样都无法切换选项。让我着急了很久,首先想到的是去上海交大上找答案,但是他们的渔网搜索却禁止外部访问。无奈我又转而搜索关键词:ftpseek,后来发现了这里:http://itorb.com/ftpseek/,(一会能访问意会不能访问,很奇怪)这个站点一眼观去,仅仅修改了一下模板让内容居中。看了看代码就是在table前后加入了《center》标签。但是各种功能都能正常访问。我接触的php代码太少了,真没解决过这种问题,只好闷着看那为数不多的php文件。include.php包含数据库连接信息,后台管理的密码并实例化了两个类。自带的模板系统十分简单。经验匮乏的我看了一上午没头绪,午饭后理了理思路翻了翻php参考书终于找到点有价值的东西,全局变量。在site.php里的function site ()声明了几个全局变量global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS;而这几个变量是大写的,有古怪。查书发现是冗长写法。需要修改php配置。
此类写法兼容性好所以得以保留但是新的php版本中都被关闭来加快速度,于是我就在php.ini里找到register_long_arrays,将off改为on。ok,终于各个功能都能正常使用了。
第二步,尝试将这几个变量名替换为中等长度的变量,即$HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS替换成_GET,_POST,_COOKIE。然后关闭register_long_arrays来达到提高速度的功能。一切正常,开始运用吧~

寻找阿帕奇

以前运行PHP都是用集成环境,xmapp搞得太复杂,偶不喜欢,一直是用phpstudy,它只包含最基本的apache+PHP+mysql,和phpmyadmin以及两个加速器,都是可以选择性的安装。

最近想自己亲自配环境,下个apache就遇到点麻烦。进入官网(www.apache.org),只有最新版的。我想找稳定版,也就是要找旧版,却找不到入口,一番查看后才找到。

打开 http://www.apache.org 后
右侧  Apache Project
第一个 HTTP Server
就是Apache.

单击后自动转到 http://httpd.apache.org/是最新版本的介绍

然后把页面的滚动条向下稍微拉一点..就可以看到
Downloads 字样....

从镜像下载from a mirror

打开镜像列表页http://www.apache.org/mirrors/

任选一个进去(中国管理的有apache.etoak.com,apache.freelamp.com,校内网labs.xiaonei.com)

在项目列表中找到httpd,进入包目录选择列表

选择binaries(二进制)进入操作系统类型列表

拉到最后,选择win32进入下载列表,选择版本下载。

如没有合适的版本,可以看下面的说明文字,有一段是Older Releases 开头的,最后一句话是Older releases,

and their corresponding debugging -symbols.zip packages, can be obtained from the archive site.最

后面的archive site是链接入口,点击archive site. 或进入旧版本下载页面

或直接http://archive.apache.org/dist/httpd/binaries/win32/

半小时终于下到了。汗。

当然,活用搜索让我没花费半小时时光

论坛不再烦恼视频播放器的问题了

升级到dz7.2以后,自带的编辑器自带的音乐播放器、视频播放器、flash播放器足够了。不足的问题是,音乐播放器和除flv以外的视频播放器在火狐下不知为何显示为未知组件,无法通过更新来显示。flash版的flv视频播放器和前面我测试的那个JW flv player界面十分相似啊。
之前播放器对ftp协议支持并不很好,遇到ftp连接失败就不断弹出错误提示,十分不人性化,这个播放器出现连接错误后会在播放器内显示连接的文件地址,并显示出错。不过IE却无法观看带中文路径的视频链接,估计得改ftp的设置

后话
dz7.2采用了大量flash元素
在./images/common目录下flvplayer.swf
FLV播放器
在./images/common目录下upload.swf
flash批量上传
在./uc_server/images目录下camera.swf
UCenter的用户头像采集
至于UChome用到的flash更多了,在home/image目录里有upload.swf,doodle.swf,1.swf,1.swf,3.swf,4.swf,stat.swf,slide.swf,cam.swf,player.swf,flv.swf

对dz下的flv播放器进一步探索

今晚测试一下veapon同学说的jw player。其实这个东东之前见过,不过没自己用过。具体用哪些代码来调用是个问题

先做做功课

http://www.longtailvideo.com/players/jw-flv-player/#Instructions

JW Player™ Instructions说明文档

The JW Player™ is the Internet’s most popular and flexible media player. It supports playback of any format the Adobe Flash Player can handle (FLV, MP4, MP3, AAC, JPG, PNG and GIF). It also supports RTMP, HTTP, live streaming, various playlists formats, a wide range of settings and an extensive javascript API.

JW Player™是一个网上著名的综合性媒体播放器。它支持所有Adobe Flash Player支持的回放格式(FLV, MP4, MP3, AAC, JPG, PNG 以及GIF)它也支持RTMP, HTTP,流媒体和各种播放列表,很大范围的设置以及一个JS的API接口。

The skinning functionality allows you to completely customize its look and its plugin architecture allows you to easily extend the player with features such as sharing, recommendations, searching, analytics and ad serving.

换肤功能允许你完全改变他的界面外观,而插件机制允许你更容易的为播放器增加“分享、提醒、搜索、分析、广告代理”等特性。

Installation安装

This section details a step-by-step process of how to install the JW Player™ onto your page. The download ZIP contains everything you need to get started.

此部分教您如何一步一步把JW Player™安装到您的页面上去。下载到的ZIP包囊括所有你需要准备的东西,直接开始吧。

Step 1: Transfer the player.swf and swfobject.js file from the ZIP to your website. (Make sure that you’ve also uploaded all the necessary videos / songs / images to your site.)

第一步:把player.swf a和 swfobject.js两个文件从zip包解压出来并上传 到你的 网站。(当然要确保你的视频啊音乐 啊 图片啊什么的都已经传到站点去了。)

Step 2: Embed the player in your HTML page with the lines of code below. Note: If you place the files in different directories, make sure to set the references in this code accordingly.

第二步:像下面这样把代码嵌入你的HTML语句中。注意:如果文件传的目录不同,自行按照代码设置好路径。

<code><p id=’preview’>The player will show in this paragraph</p>
<script type=’text/javascript’ src=’swfobject.js’></script>
<script type=’text/javascript’>
var s1 = new SWFObject(‘player.swf’,’player’,’400′,’300′,’9′);
s1.addParam(‘allowfullscreen’,’true’);
s1.addParam(‘allowscriptaccess’,’always’);
s1.addParam(‘flashvars’,’file=video.flv’);
s1.write(‘preview’);
</script></code>

在dz后太编辑器设置中discuz代码增加flv的代码内将以上代码粘贴进去,仅改动video.flv为{1},参数设置为1即可。

测试效果,由于是JS的,因此一个页面只能加载一个实例。第一次播放有dz的crossdomain权限禁止的弹出提示,不过能够播放,FF下能正常播放,由于论坛是UTF8编码而FTP为GBK编码,所以IE下仍然只支持纯英文路径。

相比之前的播放器好处有:如果ftp上没有这个文件或者无法打开文件直接在播放器中显示错误信息而不是前者那样在FF下不断的弹出ftp连接错误提示。

若要用于论坛需要修改的地方有:播放开始时的JWplayerlogo淡出效果要去掉,最好能加入自己提示文字。更多东西慢慢完善。

Notice the flashvars parameter above can contain a list of variables for configuring the player to use different Plugins or Skins. To quickly set up flashvars, use thesetup wizard. Simply choose an example, select the variables you want to use and paste the code onto your page. It’s that easy.

提醒:代码中的flashvars参数可以包含一大列表的配置播放器的插件或皮肤。试试用设置向导setup wizard.来快速设置这个参数吧。仅需要选择一个实例,选择你需要的值,复制代码到你的页面即可,如此简单。

Documentation文档

All documentation of the JW Player can be found in the JW Player Wiki. The Wiki also includes our product roadmap, source code and bug tickets. Here are some direct links:

所有文档都可在JW player的维基JW Player Wiki上找到。这个维基也囊括我们的产品指南,源代码和BUG记录。直链如下:下面就不用翻译了吧

If you’ve created a CMS module that embeds the player in an existing CMS (or you’ve found one online), please submit it here.

Also, make sure to check out one of our many tutorials, which cover topics such as:

Support

dz用flv播放器对FF的支持

2010/01/30追 dz7.2 have a video player that support lots of video types

以flv dz为关键词搜索这个帖子排名非常靠前,所以我基本没考虑过它的代码问题,但是自己维护的discuz论坛上按照他的方法却无法在firefox下显示,而且即使在IE下也不支持中文路径。
半年多了,html标记之类的知识也学了不少,简单看了一下它的代码,发现少了一个“=”号。见下面代码。

<embed src=”http://*******************/peach.swf?vcastr_file{1}&IsShowTime=1″ allowFullScreen=”true” quality=”high” pluginspage=”http://www.macromedia.com/go/getflashplayer” type=”application/x-shockwave-flash” width=”600″ height=”450″>

红色代码部分改为

vcastr_file={1}

即可。

加上后论坛在火狐下可以正常观看了。而且地址中可以包含中文字符。但又发现新的问题,由于用户是把视频文件上传到ftp后在论坛引用,而ftp由于用户很多所以做了每IP的2线程限制,如果用户正在用迅雷之类 的多线程下载器时打开带有视频的帖子,或者一个帖子里有多个视频就会弹出ftp错误信息,而且是不断弹出!!!这个问题我参考了adobe的flash和dw资料http://kb2.adobe.com/cps/415/tn_4150.html无解,由于完全没有头绪如何搜索这个播放器的源文件而且对flash编程完全没有了解,如何用html标签控制flash行为只能暂时停下来了,有没有人了解一些的可以交流一下。
dz官方论坛里应该这方面资料很多的,之前一直没太注意呢,http://www.discuz.net/viewthread.php?tid=423476这里又提供其他的播放器,如果有机会试试或许也有其他收获也说不定。不过要是把现有的播放器搞定那是最好不过了。

curl能衍生的程序

curl可以模拟浏览器传递数据,而且能够模拟POST传递原网页不能传递的值。

那么分析网页后调用他处数据就可以进行课表查询等查询,使原本不好用的转变为好用的功能。

还能模拟登陆,那么灌水机等都可以做了。

php包含了curl库,而php这个弱语言写起来十分轻松,写意

畅想云计算

是这样的张总,你在家里的电脑上按了CTRL+C,然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不,多贵的电脑都不行。
——题记

现在民用已经实现了:

云存储:Ubuntu one,部分网盘等

web办公:Google docs

分布式计算:多年历史了,主要是一些前沿科技大型项目,为了吸引更多用户,一般客户端都是多平台的。

想要实现在家中按CTRL+C,然后在公司的电脑上再按CTRL+V,数据存在云端,网络质量要好。这里只需要两步,执行第一个命令,执行第二个命令。只不过执行的两个命令在云计算时代会稍有不同,以前只能在一台电脑上进行的操作,在云时代则是对云端进行远程操作。那么问题迎刃而解了,只不过是两个远程客户端先后进行两步操作的难度。

注:本文不是学术性文章,只是整理思路,胡乱幻想。

NAT内网ipv4用户体验ipv6

偶然看到一同学发了个帖子测试自己的ipv6地址。正好我这学期想看看这个ipv6到底何方神圣,于是在网上猛搜了一阵,才发现这东西中文资料真匮乏,那几篇有关标准的文章又是长篇大论,没兴趣看下去,看了他的博客http://www.ipcpu.com里的NAT内网ipv4用户体验ipv6文章,我顺藤摸瓜找了好几个TB服务器测试,未果,在论坛版聊中他建议我别对nat 的ipv6穷追不舍,毕竟它当初就不是为这个设计的,过渡期的方案不能当成正式的东西看待。
看这些东西头昏昏的,算了,就让他pass吧

javascript简单实现倒计时10秒后跳转页面

php毕竟无法解决动态显示的问题,这种事只好交给JavaScript。浅浅的看了看js实例写下来了

倒计时跳转网页

<html>
<title>倒计时跳转网页</title>
<head>

</head>
<body>
<script>

var cTime = 3;//这个变量是倒计时的秒数设置为10就是10秒

function TimeToJump()
{
window.setTimeout(‘TimeToJump()’,1000);//让程序每秒重复执行当前函数。
if(cTime > 0)//判断秒数如果为0
{ ShowTime.innerHTML=”倒计时”+cTime+”秒后跳转”;//显示倒计时时间
cTime–;//减少秒数
}
else{Jump_Click();//执行跳转的操作
}
}
function Jump_Click()
{
window.location = “http://baidu.com”;

}
TimeToJump()
</script>
<div id=”ShowTime”></div>
<input type=”button” name=”Jump” onClick=”Jump_Click();” value=”立即跳转”>

</body>
</html>

百变图–回复(刷新)就变的–制作方法

刷新即变图片代码

下 面来给大家讲解如何制作这类图,可以放在博客里,想想每次别人打开你的博客都会变出一个不同的美女~~那你博客的访问量……呵呵,前提是你有足够的美女图 片~~ 首先把下面代码复制到记事本,修改图片地址,并保存为.TXT文件,然后上传到网络空间获得网络文件地址。(图片大小最好一致,图片数量不限,根据需要自 己修改)最后用下面框架代码调用:<IFRAME marginWidth=0 marginHeight=0 src=”网页地址” frameBorder=0 width=400 scrolling=no height=300></IFRAME>
以上完整代码可以添加到自定义面板,也可添加到文章中。(框架高度及宽度根据图片大小调整)

<html>

<head>

<script LANGUAGE=”JavaScript”>

jannick = new Array(7);

jannick[0] = ‘图片地址1′

jannick[1] = ‘图片地址2′

jannick[2] = ‘图片地址3′

jannick[3] = ‘图片地址4′

jannick[4] = ‘图片地址5′

jannick[5] = ‘图片地址6′

jannick[6] = ‘图片地址7′

index = Math.floor(Math.random() * jannick.length);

document.write(“<img src=”+jannick[index]+” width=’300′ height=’300′>”);

</script>

</head>

<body>

</body>

</html>

效果:http://www.029100.com/bbs/thread-4894-1-1.html

二、<?php
$url=”pic”;
$files=array();
if ($handle=opendir(“$url”)) {
while(false !== ($file = readdir($handle))) {
if ($file != “.” && $file != “..”) {
if(substr($file,-3)==”gif” || substr($file,-3)==”jpg”) $files[count($files)] = $file;
}
}
}
closedir($handle);
$random=rand(0,count($files)-1);
readfile(“$url/$files[$random]”);

?>

使用方法:
将此文件放在某目录下,然后在该目录下创建目录pic,将所有图片放在目录pic下即可.

DZ论坛之GBK插件转UTF-8插件全攻略(存档用)

chatroomfordz60utf8

moneydz60utf8

版主考勤与工资发放插件utf8未测试版.zip

javapainterdz60

网上人物图片评选投票系统 for Discuz! 6 gbk 未修改版

mumsignupdz60utf8

1、数据库代码的转换:

  • MYSQL版本在4.1及以下,如SQL语句转换为UTF-8即可,如SQL语句中不包含中文等非ascll字符,则无需转换
  • MYSQL版本在4.1以上,除进行上面的操作外,则需要将TYPE=MyISAM或ENGINE=MyISAM DEFAULT CHARSET=GBK替换成ENGINE=MyISAM DEFAULT CHARSET=UTF8

2、相关文件转换:

  • 将插件提供的单独文件用支持UTF-8格式的编辑器(如UltraEdit、EmEdit等)另存为UTF-8 NO BOM格式或利用本站提供的在线编码转换系统进行批量转换(系统地址:http://www.utf.com.cn/convert/
  • 对在DZ原文件基础上修改的,修改后的文件中若包括中文等非ascll字符,则也需进行上述步骤

3、插件配置文件转换:

  • 可使用编码中国提供的discuz插件转换系统(系统地址:http://www.utf.com.cn/convert/ ),选择“Discuz插件转换”后,将Discuz后台导出插件配置文件的内容粘贴到下面的表单中,再选择源文件编码为GB2312,目标文件为UTF-8,点下一步即可得到UTF-8版的插件配置文件,此文件内容可在DZ后台进行导入

站长百科的地址是http://www.zzbaike.com/wiki

dz论坛管理

可能标题起得有点大,但是之前我管理学校的dz论坛时可真是抓瞎~~

学了很多东西,从PHP,MYSQL到LINUX,而都只是浅浅的理解了一些,具体怎么维护真是一头雾水,这不,刚刚上了dz官网才发现该怎么作都告诉我们了。。。。。

http://www.discuz.net/usersguide/catalog.htm