2011年10月17日星期一

HTML4 和 HTML5 的10个关键区别

HTML5是HTML标准的下一个版本。越来越多的程序员开始HTML5来构建网站。如果你同时使用HTML4和HTML5的话 ,你会发现用HTML5从头构建,比从HTML4迁移到HTML5要方便很多。虽然HTML5没有完全颠覆HTML4,它们还是有很多相似之处,但是它们 也有一些关键的不同。本文就列出了它们之间10个关键的不同之处。


1. HTML5 标准还在制定中
首先要注意的是,HTML5虽然现在很火,但是HTML5标准还在制定中,标准仍在改变。HTML4已经10多年了,不会有任何改变了。


2. 简化的语法
HTML5简化了很多细微的语法,例如doctype的声明,你只需要写!doctype html就行了。HTML5与HTML5,XHTML1兼容,但是与SGML不兼容。


3. canvas标签替代Flash
Flash给很多Web开发者带来了麻烦,要在网页上播放Flash需要一堆代码和插件。canvas标签使得开发者只要使用一个标签就 能和用户产生UI交互。虽然目前canvas标签还不能实现Flash的所有功能,但是很快canvas就会让 Flash看起来老土,哈哈!


4. 新增 header 和 footer 标签
HTML5设计的一个原则是更好的体现网站的语义性,所以增加了header和footer这样的标签,用来明确表示网页的结构。


5. 新增 section 和 article 标签
与header, footer类似,section和article也有利于清晰化网页的结构,更有利于SEO。


6. 新增 menu 和 figure 标签
menu可以被用于创建传统的菜单,也可以用于工具栏和上下文菜单。figure标签使得网页文字和图片的排版更专业。


7. 新增 audio 和 video 标签
这两个标签可能是HTML5里面最有用的两个标签了。顾名思义,这两个标签是用来播放音频和视频的。


8. 全新的表单
HTML5对 form 和 forminput 标签进行了大量修改,添加了很多新的属性,也修改了很多属性。


9. 删除 b 和 font 标签
这个改进我还无法理解。我不认为删除这两个标签对代码的改进有很大的帮助。官方的解释是应该用CSS来替代这两个标签。但我还是觉得对于简单的文本,这两个标签还是很方便的。


10. 删除 frame, center, big 标签
我已经记不得上次是什么时候使用这些标签了。


以上十点只是HTML5和HTML4差别的很小一部分,最新最全的HTML5-HTML4对比信息请看http://dev.w3.org/html5/html4-differences/

快速提升MySQL可扩展性的五大绝招

   在可扩展性方面,客户的要求变得越来越多,功能列表上经常会出现20条、50条甚至多达100多条要求,但总的来说,我们可以把它们缩短为五个大类,通过五条途径来解决可扩展性问题:
  1. 调整查询操作
  对查询进行优化能够让你付出最少的精力就得到最多的成果。将查询功能完善的发挥出来,达到业务需求,不会被过多的流量和过重的载荷压倒。这就是为什么我们经常看见客户碰到的麻烦越来越多,随着他们网站的访问量越来越大,可扩展性的挑战也变得越来越严重,这就是问题的所在。对网站角落里那些不常用的页面做查询优化是并不必要的,那些页面并不会收到真实世界的流量。根据反映对网络应用做一定的调整是很普遍的做法,而且效果很好。
  查询优化需要启用缓慢查询日志并且不断观察。使用mk-query-digest这个Maatkit套件中的强大工具来分析日志,而且要确定设置了log_queries_not_using_indexes标签。一旦你发现某个查询严重占用资源,那就要优化它。使用EXPLAIN解释机制,使用profiler,观察索引的使用情况,创建失踪的索引,理解它是怎么进行添加和排序的。
  2.使用Master-Master复制
  Master-Master的active-passive复制模式,或者称为循环复制,不仅能带来高可用性,也能够带来高度的可扩展性。这是因为你能够即刻给你的应用分配到一块只读的从属盘。许多网络应用都按照80/20的规律来分割,80%的活动用来进行读取或SELECT,剩下的分配给INSERT和UPDATE。配置你的应用或者进行重新架构,把读取需要的流量发送到从盘,这样做是可行的,这种类型的横向可扩展能力可以进一步延伸,在必要时能够附加更多块只读从盘。
  3. 使用存储
  这听起来是很基础的东西,也很直接,但是经常会被忽视,你至少应该确认设置了这些:
  innodb_buffer_pool_size
  key_buffer_size (MyISAM索引缓存)
  query_cache_size – 使用大型SMP时需要小心
  thread_cache & table_cache
  innodb_log_file_size & innodb_log_buffer_size
  sort_buffer_size, join_buffer_size, read_buffer_size, read_rnd_buffer_size
  tmp_table_size & max_heap_table_size
  4. 磁盘读取的RAID
  你的数据库下面是什么?不知道吗,请找出来。你是在用RAID 5吗?这对于性能来说可是一个巨大的阻碍。RAID5的插入和更新操作速度很慢,而且如果你丢失了一块硬盘,RAID 5在重建时几乎无能为力。RAID 5实在是太慢了,那么应该用什么代替它呢?用RAID 10做镜像和分段,这就可以充分利用你的服务器或机箱里的所有硬盘了。即使你的内存能够容纳下整个数据库,依然需要对硬盘进行许多读取操作。为什么呢?因为比如排序操作需要重新安排行列,群组和联接等等也一样,还有添加交易日志等等这些都是磁盘I/O操作。
  5. 调整Key参数
  另外,有些附加的参数也可以用来提高性能:
  innodb_flush_log_at_trx_commit=2
  它可以极大的提升insert和update的速度,只是在清除innodb日志缓冲区时有点偷懒。你可以对它多做些研究,但大多数情况下是非常值得推荐的。
  innodb_file_per_table
  innodb开发就像Oracle,存储方面使用的是tablespace模式。显然内核开发者们做的并不完善,因为使用单独tablespace的默认设置就会出现性能瓶颈。这个参数设置可以帮助innodb为每个表创建tablespace和数据文件,就像MyISAM所做的一样。
  原文地址:http://sql.dzone.com/news/5-ways-boost-mysql-scalability

MySQL数据库性能优化六大技巧

 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间。Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕。如果你是个数据库管理员,你很有可能已经在某个阶段遇到上述情况。因此,本文将介绍对MySQL进行性能优化的技巧和窍门。
  1、存储引擎的选择
  如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。并且不要尝试同时使用这两个存储引擎。思考一下:在一个事务处理中,一些数据表使用InnoDB,而其余的使用MyISAM。结果呢?整个subject将被取消,只有那些在事务处理中的被带回到原始状态,其余的被提交的数据转存,这将导致整个数据库的冲突。然而存在一个简单的方法可以同时利用两个存储引擎的优势。目前大多数MySQL套件中包括InnoDB、编译器和链表,但如果你选择MyISAM,你仍然可以单独下载InnoDB,并把它作为一个插件。很简单的方法,不是吗?
  2、计数问题
  如果数据表采用的存储引擎支持事务处理(如InnoDB),你就不应使用COUNT(*)计算数据表中的行数。这是因为在产品类数据库使用COUNT(*),最多返回一个近似值,因为在某个特定时间,总有一些事务处理正在运行。如果使用COUNT(*)显然会产生bug,出现这种错误结果。
  3、反复测试查询
  查询最棘手的问题并不是无论怎样小心总会出现错误,并导致bug出现。恰恰相反,问题是在大多数情况下bug出现时,应用程序或数据库已经上线。的确不存在针对该问题切实可行的解决方法,除非将测试样本在应用程序或数据库上运行。任何数据库查询只有经过上千个记录的大量样本测试,才能被认可。
  4、避免全表扫描
  通常情况下,如果MySQL(或者其他关系数据库模型)需要在数据表中搜索或扫描任意特定记录时,就会用到全表扫描。此外,通常最简单的方法是使用索引表,以解决全表扫描引起的低效能问题。然而,正如我们在随后的问题中看到的,这存在错误部分。
 5、使用”EXPLAIN”进行查询
  当需要调试时,EXPLAIN是一个很好的命令,下面将对EXPLAIN进行深入探讨。
  首先,创建一个简单的数据表:
CREATETABLE'awesome_pcq'('emp_id'INT(10)NOTNULL
DEFAULT'0','full_name'VARCHAR(100)NOTNULL,'email_id'VARCHAR(100)NOTNULL,'password'VARCHAR(50)NOTNULL,'deleted'TINYINT(4)NOTNULL,PRIMARYKEY('emp_id')
) COLLATE
='utf8_general_ci'
ENGINE
=InnoDB
ROW_FORMAT
=DEFAULT
  这个数据表一目了然,共有五列,最后一列“deleted”是一个Boolean 类变量flag来检查帐号是活动的还是已被删除。接下来,您需要用样本记录填充这个表(比如,100个雇员记录)。正如你看到的,主键是“emp_id”。因此,使用电子邮件地址和密码字段,我们可以很容易地创建一个查询,以验证或拒绝登录请求,如下(实例一):
SELECTCOUNT(*)FROMawesome_pcqWHERE
email_id
='blahblah'ANDpassword='blahblah'ANDdeleted=0
  之前我们提到,要避免使用COUNT(*)。代码纠正如下(实例二):
SELECTemp_idFROMawesome_pcqWHERE
email_id
='blahblah'ANDpassword='blahblah'ANDdeleted=0
  现在回想一下,在实例一中,代码查询定位并返回“email_id”和“password”等于给定值的行数。在实例二中,进行了同样的查询,不同的是明确要求列出“emp_id”所有满足给定的标准的值。哪个查询更费时?
  很显然,这两个实例都是同样费时的数据库查询,因为无意间,两个实例查询都进行了全表扫描。为了更好地读懂指令,执行如下代码:
EXPLAINSELECTemp_idFROMawesome_pcqWHERE
email_id
='blahblah'ANDpassword='blahblah'ANDdeleted=0
  在输出时,集中在倒数第二列:“rows”。假设我们已经将表填充了100个记录,它会在第一行显示100,这是MySQL需要进行扫描用来计算查询的结果的行数。这说明了什么?这需要全表扫描。为了克服这个弊端,则需要添加索引。
  6、添加索引
  先从重要的说起:给每一个可能遇到的次要问题创建索引并不明智。过多的索引会导致效能减慢和资源占用。在进一步讨论之前,在实例中创建一个样本索引:
ALTERTABLE'awesome_pcq'ADDINDEX'LoginValidate'('email_id')
  接下来,再次运行该查询:
EXPLAINSELECTemp_idFROMawesome_pcqWHERE
email_id
='blahblah'ANDpassword='blahblah'ANDdeleted=0
  请注意运行后的值。不是100,而是1。因此,为了给出查询结果,MySQL只扫描了1行,多亏先前创建的索引。你可能会注意到,索引只在电子邮件地址字段创建,而查询对其他字段同样进行了搜索。这表明MySQL先执行了一个cros-check,检查是否有在WHERE子句中的定义的值有索引指定,如果有这样的值就执行相应的操作。但是,它不是每次重复将减少到一个。例如,如果不是唯一的索引字段(如employee names列可以有两行相同的值),即使创建索引,也将有多个记录留下。但它仍然比全表扫描好。并且,在WHERE子句中指定列的顺序没有在这个过程中发挥作用。例如,如果在上面的查询中,改变字段的顺序,使电子邮件地址出现在最后,MySQL仍将遍历索引列的基础上。那么,就要在索引上动脑筋,注意如何避免大量的全表扫描,并获得更好的结果。不过,这需要经历一个很长的过程。

2011年10月16日星期日

android 模拟器上网问题


方法一
首先,Windows下,配置Adroid环境变量(Win7为例)
1、桌面右键——》我的电脑——》高级系统设置
2、高级——》环境变量——》系统变量——》Path
3、添加Android SDK 目录到系统变量Path中,如下图:
注:F:/Pro-files/android-sdk-windows/tools ,添加到系统Path
如果有F:/Pro-files/android-sdk-windows/platform-tools ,也一并添加到系统Path,
说明:最新版的Android SDK安装,emulator命令一般在tools目录中,adb命令移到了platform-tools目录

接着,启动模拟器
1、cmd (Ctrl+R,启动命令提示符窗体)
2、emulator -avd avd2.1 (启动模拟器,avd2.1 为您安装Android的模拟器名称Name)
3、cmd (Ctrl+R,再另启动命令提示符窗体)
然后,将网络连接代理设置写入配置数据库
1、adb shell (进入模拟器的linux 系统,成功启动模拟器后,此命令才有效)
假如你的上网代理IP是10.10.26.252 :1080
2、写数据到数据库,更新系统设置
sqlite3 /data/data/com.android.providers.settings/databases/settings.db "INSERT INTO system VALUES(99,'http_proxy','10.10.26.252 :1080')"
3、查询数据库,看是否成功更改了系统设置:
sqlite3 /data/data/com.android.providers.settings/databases/settings.db "SELECT * FROM system"
说明:sqlite 是Android手机系统采用的微型数据库,您可以理解成我们常用的Access、MySQL、SQL Server等数据库
4、重启模拟器,使用Browser直接上网Internet
最后,如果想删除数据库,请执行以下命令:
sqlite3 /data/data/com.android.providers.settings/databases/settings.db "DELETE FROM system WHERE _id=99"
 ===============================================================================
方法二
1、参照方法一,设置系统变量,启动模拟器
2、依次进入 settings->Wireless controls->Mobile networks->Access Point Names  
3、设置以下参数:
- Proxy : your proxy address 
- Port : your proxy port 
- Username : your username if needed, or
 Password : your password if needed, or
4、设置DNS参数:
Android 模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人(像我)来讲,一般 电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方 法很简单,只要把模 拟 器的默认DNS设置成电脑的DNS地址即可。
第一步:adb shell   (进入模拟器的linux系统)
第二步:getprop  (getprop会列出系统当前的各项属性)
第三步:得到模拟器的DNS地址
在结果里可以看到:
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]
第四步:把dns改成我们自己的DNS
setprop net.dns1 192.168.1.1  或者 setprop net.dns1 192.168.0.1
注:一般TP-LINK及D-LINK的无线DNS都是192.168.1.1,有些公司有线DNS默认192.168.0.1;
如果以上两个DNS不好用,请直接使用ipconfig  /all(windows系统) 或者 ifconfig -a(linux/unix 系统)命令确认。
大功告成,再去使用模拟器的浏览器的话,你就可以发现你已经可以上网了。


试了一下第4种方式,成功上网。
-----------------------------------------------------------------------------------------------------------------------------
  我在网上查了一下,发现有以下四种方式:
  一:将网络连接代理设置写入配置数据库
  1、通过命令行或者通过双击emulatoer可执行文件,打开模拟器
  2、在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows))
  3、执行 ls -l /data/data/com.android.providers.settings/databases/settings.db ,查看系统设置数据库文件是否存在
  4、如果数据库文件存在,执行 sqlite3 /data/data/com.android.providers.settings/databases/settings.db,以settings.db为当前scheme启动SQLITE3
  5、执行 INSERT INTO system VALUES(99,’http_proxy’, ‘192.168.0.245:8080′); 语句插入数据,其中192.168.0.245是我用的代理服务器IP,8080是端口,请根据具体情况替换
  6、执行 SELECT * FROM system; 来查看刚才插入的数据
  7、重启模拟器,以使代理服务器设置生效
  8、可以使用 DELETE FROM system WHERE _id=99; 语句来删除代理设置,或者使用 UPDATE system SET value = ‘192.168.0.245:8070′ WHERE _id=99; 来修改代理服务器设置
  二:可能是DNS的问题
  1、用系统的命令进入Android开发包的tools目录
  cd E:android-sdk-windows ools
  2、使用adb的shell,确认系统的各项属性
  adb shell
  getprop
  getprop会列出系统当前的各项属性
  3、得到模拟器的DNS地址
  在结果里可以看到:
  [net.dns1]: [10.0.2.3]
  [net.dns2]: [10.0.2.4]
  4、把dns改成我们自己的DNS
  setprop net.dns1 192.168.1.1
  注:一般TP-LINK及D-LINK的DNS都是192.168.1.1,如果不是请使用ipcnofig /all命令确认。
  三:直接带参数启动模拟器
  emulator @default -http-proxy 10.16.xx.xx:8080
  其中default是模拟器的名称
  四:在模拟器中设置
  启动模拟器,然后进入 Settings->Wireless & networks->Mobile networks->Access Point Names
  然后打开出现在列表中的access point;
  然后下面这样设置:
  - Proxy : your proxy address
  - Port : your proxy port
  - Username : your username if needed, or
  - Password : your password if needed, or
  由于公司的代理需要用户认证的,我用的是第四种方式,

转载于 :
http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6074.html
http://blog.csdn.net/prince58/archive/2010/12/16/6080074.aspx

上海松善实业有限公司

    上海松善实业有限公司是一家集多品牌销售于一体的电线电缆骨干企业,公司成立于2016年。 公司拥有国内各大品牌:起帆、远东、上上、江南、胜华等。     主要产品有:高低压电力电缆、橡套电缆、控制电缆、架空绝缘电缆、塑胶电缆、电子计算机电缆、通讯电缆、...