部分HTML5功能的教学代码

March 20th, 2011 by Dream☆Wing No comments »
/******************************************************
 * @Web Storage
 ******************************************************/
//一直有效,关闭窗口和重启浏览器后数据依然存在
window.localStorage["key"] = value;

//当前装口有效,关闭窗口和重启浏览器后数据消失
window.sessionStorage["key"] = value;

//不能存放函数,如果是函数会被转换成字符串
//每个域的数据是不能共享的

/******************************************************
 * @Web SQL Database
 ******************************************************/
//1.打开数据库
db = openDatabase("DBTest", "1.0", "HTML5 Database API example", 200000);

//2.判断是否打开成功
if (!db) {
    alert("数据库打开失败");
}
else {
    //3.执行sql查询
    db.transaction(function(tx){
        tx.executeSql("SELECT * FROM Table1Test", [], function(tx, result){
            console.log(r = result);
            for (var i = 0, item = null; i < result.rows.length; i++) {
                //提取结果中第i行数据对象,存入item变量,通过item["id"]这种方式获得该行id字段的值
                item = result.rows.item(i);
                console.log(item);
            }
        });
    });

    //4.插入一条记录
    db.transaction(function(tx){
        tx.executeSql("INSERT INTO Table1Test (id, text) VALUES (?, ?)", [num, document.querySelector('#todoitem').value], function(tx, result){
        }, onError);
    });
}
//查询函数,data为替代sql语句中?的变量的数组
tx.executeSql("sql", data, successCallback, errorCallback)
//例如
tx.executeSql("INSERT INTO Table1Test (id, text) VALUES (?, ?)", [10,"text"], successCallback, errorCallback)

/******************************************************
 * @Web Workers
 ******************************************************/
//main.js:父进程脚本
var worker = new Worker('extra_work.js');
worker.onmessage = function(event){
    alert(event.data);
};

//extra_work.js: 被调用的脚本,子进程

// 这里进行你所需要的计算
postMessage(some_data);//当需要通知父进程时调用,参数传入到父进程的onmessage方法中

/******************************************************
 * @Web Sockets
 ******************************************************/
//连接sockets服务器
var socket = new WebSocket("ws://bloga.jp:80/mychat1");

socket.readyState; //连接状态 0:连接中 1:连接成功 2:连接关闭
//当连接成功时
socket.onopen = function(event){
    console.log("connected!");
}
//当从服务器接收到信息时
socket.onmessage = function(event){
    console.log(event.data);
}
//当连接关闭时
socket.onclose = function(event){
    console.log("closed");
}

/******************************************************
 * @Notifications
 ******************************************************/

window.webkitNotifications.checkPermission();//检查是否允许桌面提示 0:允许 1:禁止。桌面提示的允许状态是按域保存的
window.webkitNotifications.requestPermission();//请求用户允许桌面提示

tip = window.webkitNotifications.createNotification("src/dwd1.png", "提示框的标题", "提示框的内容!!!")
tip.show(); //弹出提示框
tip.close(); //关闭提示框

/******************************************************
 * @Geolocation
 ******************************************************/
navigator.geolocation.getCurrentPosition(function(position){

    position.coords //位置坐标
    position.coords.longitude //经度
    position.coords.latitude //纬度
    position.coords.accuracy //精度
    position.coords.altitudeAccuracy //高度的精度
    position.coords.heading //朝向
    position.coords.speed //速度
    position.timestamp //获取坐标的时间戳
});

/******************************************************
 * @Audio + Video
 ******************************************************/
//获得video对象,audio对象也可以通过此方法,需要在html中放置video或audio标签
Media = document.getElementById("vvv");

//audio对象可以通过这个方法快速创建,video不可以。
Media = new Audio("http://directguo.com/html5/src/france.ogg")

//方法和属性。video和audio方法和属性基本相同
Media.src = value; //返回或设置当前资源的URL
Media.currentTime = value; //当前播放的位置,赋值可改变位置
Media.startTime; //一般为0,如果为流媒体或者不从0开始的资源,则不为0
Media.duration; //当前资源长度 流返回无限
Media.paused; //是否暂停
Media.ended; //是否结束
Media.autoPlay = value; //是否自动播放 true/false
Media.loop = value; //是否循环播放 true/false
Media.play(); //播放
Media.pause(); //暂停
Media.controls = value; //是否有默认控制条 true/false
Media.volume = value; //音量
Media.muted = value; //静音 true/false
//TimeRanges(区域)对象 :该对象描述的是一个或多个区域,例如已经加载的区域为两个部分:1-5.8秒 6-10秒
TimeRanges.length; //区域段数,例如上述例子,应该返回2
TimeRanges.start(i) //第i段区域的开始位置,单位秒
TimeRanges.end(i) //第i段区域的结束位置,单位秒

//事件
eventTester = function(e){//着里定义了一个简单的事件检测函数来检测如下的事件
    Media.addEventListener(e, function(){
        console.log((new Date()).getTime(), e);
    });
}

eventTester("abort"); //客户端主动终止下载(不是因为错误引起),
eventTester("error"); //请求数据时遇到错误
eventTester("play"); //play()和autoplay开始播放时触发
eventTester("pause"); //pause()触发
eventTester("playing"); //开始回放
eventTester("timeupdate"); //播放时间改变
eventTester("ended"); //播放结束
eventTester("ratechange"); //播放速率改变
eventTester("volumechange"); //音量改变

//详细API请看:http://directguo.com/blog/index.php/2010/07/html5-audio-video-tag/

/******************************************************
 * @Canvas2D
 ******************************************************/
var elem = document.getElementById('myCanvas');
var ctx = elem.getContext('2d');

//画矩形
ctx.fillRect(x,y,width,height);  //画一个填充的矩形
ctx.strokeRect(x,y,width,height);  //为一个矩形描边
ctx.clearRect(x,y,width,height);  //清楚一个矩形的一部分并且设为透明
ctx.rect(x, y, width, height); //画矩形

//画路径
ctx.beginPath();//创建路径的第一步是调用beginPath方法,返回一个存储路径的信息
ctx.closePath();//从当前的点到起始点闭合路径
ctx.stroke();//描边路径
ctx.fill();//填充路径
ctx.lineTo(x, y);//从上一个起点到(x,y)的点画线,上一个起点可以通过moveTo来指定,默认为原先路径的终点

//画圆弧
arc(x, y, r, sa, ea, cw);//x,y圆心坐标,r-半径, sa和ea是圆弧的开始和结束弧度cw为true是逆时针,false为顺时针

//画贝塞尔曲线
quadraticCurveTo(cp1x, cp1y, x, y);//二次贝塞尔曲线

//使用图像
drawImage(image, x, y); //image-图像对象

//更多内容请看:http://adamlu.com/?p=157

转自:http://directguo.com/blog/index.php/2010/08/%e9%83%a8%e5%88%86html5%e5%8a%9f%e8%83%bd%e7%9a%84%e6%95%99%e5%ad%a6%e4%bb%a3%e7%a0%81/

  • Share/Save/Bookmark

[转]关于DOM事件的Bubbling和Capturing

March 19th, 2011 by Dream☆Wing 2 comments »

Bubbling
在浏览器解析事件的时候,有两种触发方式,一种叫做Bubbling(冒泡),另外一种叫做Capturing(捕获)。由上图可以看出来,冒泡的方式效果就是当一个DOM元素的某事件例如click事件被fire时,依次它的父元素的click事件也被fire(触发),一直传递到最顶层的body元素为止。而捕获的触发方式正好相反,当某个元素的click事件被触发时,先从最顶层的body元素click事件被触发开始,一直传递到真正被触发的元素为止。
****************************************************************************
这次我将讨论W3C的标准DOM事件模型和IE独立门户的DOM事件模型到底有多少区别,首先我们可以回想一下目前大多数Js程序员习惯如何绑定事件到 DOM元素上,最常见的就是obj.onclick=handler这种方式(更恶劣的是在Html代码的元素标签中直接加上onclick属性,完全没达到视图和动作分开的原则)。我们暂时称这种方式的事件添加为Traditional(传统方式)吧,IE有自己的IE Event Module,而火狐等浏览器则遵循的W3C方式的Event Module,下面看看这三者各自的优缺点在哪里——
1、Traditional Module

传统方式的事件模型即直接在DOM元素上绑定事件处理器,例如—
window.onload=function(){…}
obj.onmouseover=function(e){…}
obj.onclick=function(){…}
首先这种方式是无论在IE还是Firefox等其他浏览器上都可以成功运行的通用方式。这便是它最大的优势了,而且在Event处理函数内部的this变量无一例外的都只想被绑定的DOM元素,这使得Js程序员可以大大利用this关键字做很多事情。
至于它的缺点也很明显,就是传统方式只支持Bubbling,而不支持Capturing,并且一次只能绑定一个事件处理器在DOM元素上,无法实现多 Handler绑定。最后就是function参数中的event参数只对非IE浏览器有效果(因为IE浏览器有特制的window.event)。
2、W3C (Firefox.e.g) Event Module

Firefox等浏览器很坚决的遵循W3C标准来制定浏览器事件模型,使用addEventListener和removeEventListener两个函数,看几个例子—
window.addEventListener(‘load’,function(){…},false);
document.body.addEventListener(‘keypress’,function{…},false);
obj.addEventListener(‘mouseover’,MV,true);
function MV(){…}
addEventListener带有三个参数,第一个参数是事件类型,就是我们熟知的那些事件名字去掉前面的’on’,第二个参数是处理函数,可以直接给函数字面量或者函数名,第三个参数是boolean值,表示事件是否支持Capturing。
W3C的事件模型优点是Bubbling和Capturing都支持,并且可以在一个DOM元素上绑定多个事件处理器,各自并不会冲突。并且在处理函数内部,this关键字仍然可以使用只想被绑定的DOM元素。另外function参数列表的第一个位置(不管是否显示调用),都永远是event对象的引用。
至于它的缺点,很不幸的就只有在市场份额最大的IE浏览器下不可使用这一点。
3、IE Event Module

IE自己的事件模型跟W3C的类似,但主要是通过attachEvent和detachEvent两个函数来实现的。依旧看几个例子吧—
window.attachEvent(‘onload’,function(){…});
document.body.attachEvent(‘onkeypress’,myKeyHandler);
可以发现它跟W3C的区别是没有第三个参数,而且第一个表示事件类型的参数也必须把’on’给加上。这种方式的优点就是能绑定多个事件处理函数在同一个DOM元素上。
至于它的缺点,为什么如今在实际开发中很少见呢?首先IE浏览器本身只支持Bubbling不支持Capturing;而且在事件处理的function 内部this关键字也无法使用,因为this永远都只想window object这个全局对象。要想得到event对象必须通过window.event方式,最后一点,在别的浏览器中,它显然是无法工作的。
最后我在推荐两个必须知道的IE和W3C标准的区别用法吧—
1、当我们需要阻止浏览器某DOM元素的默认行为的时候在W3C下调用e.preventDefault(),而在IE下则通过window.event.returnValue=false来实现。
2、当我们要阻止事件冒泡的时候,在W3C标准里调用e.stopPropagation(),而在IE下通过设置window.event.cancelBubble=true来实现。

转自:http://hi.baidu.com/dcyhldcyhl/blog/item/70e94d235e4fffac4723e86a.html

另外还有一篇介绍了详细的事件触发顺序(Capturing >target >Bubbling):http://blog.sina.com.cn/s/blog_66d6c8870100nl76.html

  • Share/Save/Bookmark

2011年也要继续加油哦~

January 1st, 2011 by Dream☆Wing 1 comment »

2011年也要继续加油哦~

  • Share/Save/Bookmark

mysql optimazation-my.cnf

December 15th, 2010 by Dream☆Wing 1 comment »

zhua
这里写的不错:http://robbin.javaeye.com/blog/461382

结合硬件配置的一份已经优化好的my.cnf进行说明:

# vi /etc/my.cnf

以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略。

[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock

skip-locking # 避免MySQL的外部锁定,减少出错几率增强稳定性。

skip-networking # 开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

skip-name-resolve # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

back_log = 384 ########### 我的1G内存没有设置此项使用的默认值 50,目前观察还不错。
# 1. 指定MySQL可能的连接数量,当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。
# 2. back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。
# 3. 注意:试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。

key_buffer_size = 256M ########### 我设置的128M,目前观察还不错。
# 只对MyISAM表起作用,指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。尤其是索引读的速度。
# 1. 对于内存在4GB左右的服务器该参数可设置为256M或384M。
# 2. 另外一个估计key_buffer_size的办法 把你网站数据库的每个表的索引所占空间大小加起来看看, 以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大.
# 3. 一般我们设为16M,实际上稍微大一点的站点 这个数字是远远不够的,通过检查状态值 Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例 key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。
以下的状态值都是本人(hexu.org)通过 Sqlyog 获得的实例分析:
#> SHOW STATUS LIKE ‘key_read%’
##> key_read_requests – 650759289
##> key_reads – 79112
##> 比例接近1:8000 健康状况非常好
# 4. 注意:该参数值设置的过大反而会是服务器整体效率降低!

query_cache_type = 1 # 指定是否使用查询缓冲

query_cache_limit = 2M

query_cache_size = 64M ########### 我的1G内存设置为64M,目前观察还不错。
# 使用查询缓冲,MySQL将Select语句和查询结果存放在缓冲区中,今后对于同样的Select语句(区分大小写),将直接从缓冲区中读取结果。
# 1. 根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。 指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:
#> SHOW VARIABLES LIKE ‘%query_cache%’;
#> SHOW STATUS LIKE ‘Qcache%’;
# 1. 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小
# 2. 如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在Select语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。
# 3. 如果Qcache_free_blocks的值非常大,则表明缓冲区中碎片很多

max_allowed_packet = 4M
#从服务器发送或接收的最大包长度。(默认值是16MB)。
thread_stack = 256K

table_open_cache = 256 ########### 我的1G内存设置为256,目前观察还不错。
#table_open_cache was known as table_cache in MySQL 5.1.2 and earlier.
# 指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。
# 1. 对于有1G内存的机器,推荐值是128-256。
# 2. 通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。
# 3. 如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了。
#> SHOW STATUS LIKE ’Open%tables‘;
# 1. Open tables 256
# 2. Opened tables 9046
# 虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,已经运行了20 天,opened_tables的值也非常低。因此,增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache
# 4. 注意:不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

sort_buffer_size = 6M # 查询排序时所能使用的缓冲区大小。
read_buffer_size = 4M # 读查询操作所能使用的缓冲区大小。
join_buffer_size = 8M # 联合查询操作所能使用的缓冲区大小
# 注意:sort/read/join_buffer_size 三个参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。

myisam_sort_buffer_size = 64M
table_cache = 512

tmp_table_size = 256M

max_connections = 768
# 指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。

max_connect_errors = 10000000

wait_timeout = 10
# 指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

thread_cache 32
# 没找到具体说明,不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的

thread_concurrency = 8
# 该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8

thread_cache_size = 8
# 默认是 8 ,这个值表示可以重新利用保存在缓存中线程的数量, 当断开连接时:
# 1. 如果缓存中还有空间,那么客户端的线程将被放到缓存中,
# 2. 如果线程重新被请求,那么请求将从缓存中读取,
# 3. 如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,
# 4. 如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。
# 5. 根据物理内存设置规则如下:
# Mem: 1G 可以设置为 8
# Mem: 2G 可以设置为 16
# Mem: 3G 可以设置为 32
# Mem: >3G 可以设置为 64

ft_min_word_len = 4 ########### 我的设置为2
#被全文检索索引的最小的字长. 你也许希望减少它,如果你需要搜索更短字的时候. 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引

log-bin = /home/mysql/logs/binlog/mysql-bin
# 如果你不需要记录2进制log 就把这个功能关掉,注意关掉以后就不能恢复出问题前的数据了,需要您手动备份,
# 1. 二进制日志包含所有更新数据的语句,其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。
# 2. 另外,如果做同步复制( Replication )的话,也需要使用二进制日志传送修改情况。
# 3. 如果不提供文件名,MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。
# 4. 此外说明:
# 1. 使用log-bin-index可以指定索引文件;
# 2. 使用binlog-do-db可以指定记录的数据库;
# 3. 使用binlog-ignore- db可以指定不记录的数据库。
# 注意第一:binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。
# 注意第二:MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。

log_slow_queries = /home/mysql/logs/slowlog/slow.query
# 指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件名。

long_query_time = 2 ########### 我设置的如果查询时间大于 2s,就记录慢查询到log_slow_querys指的文件中

log_long_format
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
转自:http://blog.hexu.org/archives/583.shtml
log-queries-not-using-indexes
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里

skip-innodb #去掉innodb支持
更多设置可以查看:
1. http://flynndang.javaeye.com/blog/399374
2. http://robbin.javaeye.com/blog/461382
3. http://www.suibing.com/post/158/zhuanzhuan’zzhuan’zi转自:http://blog.hexu.org/archives/583.shtml

  • Share/Save/Bookmark

大型网站设计经验分享 技术交流讲座

December 3rd, 2010 by Dream☆Wing No comments »

安哥的技术分享,宣传下~~~

报名地址:http://bbs.lampbrother.net/read-htm-tid-44436.html

讲座时间:2010年12月18日(星期六)14:00-16:00
活动地点:北京市海淀区东北旺西路8号中关村软件园9号楼2区附厅312室
活动收费:50元/人(报名即赠送兄弟连身份牌一个、价值35元的PHP视频教程光盘一套)
活动人数:100人

主办方:LAMP兄弟连 互动阳光
协办方:电子工业出版社 CSDN乐知教育 学生大本营

【讲座介绍】
大 型网站设计,无法回避这样一些问题:数据量大、访问量高、并发高……如何进行大型网站的部署与设计,本次讲座我们邀请到了业内资深专家,曾经在新浪、 UUsee、Comsenz等多家业内知名公司担任项目经理及技术总监的安然老师来为大家分享大型网站设计的经验。

【讲座议程】

引用
13:30-14:00     签到
14:00-15:30     技术分享
15:30-16:00     答疑
16:00-16:05     抽奖
16:05-16:15     合影及交流

【讲座大纲】

引用
1.    大型网站的特点
2.    大型网站技术的选择
a)    操作系统的选择
b)    Web服务器的选择
c)    数据存储的选择
d)    语言的选择
3.    架构大型网站
a)    网站系统的设计
b)    网站服务器设计
c)    数据库的设计
4.    大型网站数据库压力解决方案
a)    缓存-动态缓存
b)    读压力:主从复制+读写分离
c)    容量:表分区
d)    读写压力:表分区+主从复制
e)    分库分库分表
f)    NoSql数据库
5.    实际项目中PHP框架的选择
a)    框架的特点
b)    框架适合的领域
c)    如何选择框架
d)    AnPHP介绍及设计特点
6.    实际项目开发经验分享
a)    腾讯品啦结婚频道
b)    新浪房产
c)    爱卡汽车论坛

【面向人群】
网站站长、技术主管、Web程序员及对网站开发有强烈兴趣的朋友

【讲师简介】


安然
北京互动阳光科技有限公司创 始人,兄弟连项目经理,毕业于吉林大学计算机科学与技术专业。十余年互联网开发与管理经验,精通Linux、Apache、MySQL、PHP等Web技 术,熟悉网站架构、网站服务器部署、网站开发流程以及熟悉项目管理,熟悉中国特色社区的特点。曾任新浪房产研发经理、北京康盛创想有限公司项目总监、北京 悠视互动科技有限公司技术总监、新浪互动社区项目经理、新浪交友高级工程师以及慧聪高级工程师等职位。
  • Share/Save/Bookmark