Archive for November, 2011

作者:AngryFox 分类: Uncategorized November 30th, 2011 暂无评论
function  sort_bubble($list){
    $len = count($list);
    if(empty($len)) return false;
    $flag = false;
    for($i=0; $i< $len; $i++){
        for($j = $len-1; $j>= $i;$j--){
            if($list[$i] > $list[$j]){
                $tmp      = $list[$i];
                $list[$i] = $list[$j];
                $list[$j] = $tmp;
                $flag = true;
            }
        }
    }
    return $list;
}

$example = array(4,3,2,1,55,7,9,33);
alert(sort_bubble($example));
作者:AngryFox 分类: Uncategorized November 30th, 2011 暂无评论

1、linux的多线程和多进程有什么区别?什么时候使用多线程,什么时候使用多进程?

答:(1)进程资源调度的最小单位,线程是cpu调度的最小单位;多进程开销大,多线程开销小,这是最基本的区别;一个进程里面可能有很多线程,把进程分解为线程之后就可以有效利用cpu和内存

(2)当需要频繁创建和销毁时优先选用多线程;

    需要进行大量计算的优先使用线程;

    强相关的处理用线程,弱相关的处理用进程;

    可能要扩展到多机分布的用进程,多核分布的用线程;

    都满足需求的情况下用最熟悉最拿手的方式

2、现有的nosql数据库都有哪些?

答:NoSQL,指的是非关系型的数据库,Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB等等都是非关系型数据库

3、javascript实现跨域的几种方法?

答:(1)document.domain+iframe的设置

对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。 具体的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html两个文件中分别加上 document.domain = ‘a.com’;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以 “交互”了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把script.a.com的domian设为alibaba.com 那显然是会报错地!代码如下:

www.a.com上的a.html

document.domain = ‘a.com’;
var ifr = document.createElement(‘iframe’);
ifr.src = ‘http://script.a.com/b.html’;
ifr.style.display = ‘none’;
document.body.appendChild(ifr);
ifr.onload = function(){
var doc = ifr.contentDocument || ifr.contentWindow.document;
// 在这里操纵b.html
alert(doc.getElementsByTagName(“h1″)[0].childNodes[0].nodeValue);
};

script.a.com上的b.html

document.domain = ‘a.com’;

这种方式适用于{www.kuqin.com, kuqin.com, script.kuqin.com, css.kuqin.com}中的任何页面相互通信。

备注:某一页面的domain默认等于window.location.hostname。主域名是不带www的域名,例如a.com,主域名前面带前缀的通常都为二级域名或多级域名,例如www.a.com其实是二级域名。 domain只能设置为主域名,不可以在b.a.com中将domain设置为c.a.com。

问题:
1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞。
2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。

(2)动态创建script

虽然浏览器默认禁止了跨域访问,但并不禁止在页面中引用其他域的JS文件,并可以自由执行引入的JS文件中的function(包括操作cookie、Dom等等)。根据这一点,可以方便地通过创建script节点的方法来实现完全跨域的通信。具体的做法可以参考YUI的Get Utility

这里判断script节点加载完毕还是蛮有意思的:ie只能通过script的readystatechange属性,其它浏览器是script的load事件。以下是部分判断script加载完毕的方法。

js.onload = js.onreadystatechange = function() {
if (!this.readyState || this.readyState === ‘loaded’ || this.readyState === ‘complete’) {
// callback在此处执行
js.onload = js.onreadystatechange = null;
}
};

(3)利用iframe和location.hash

这个办法比较绕,但是可以解决完全跨域情况下的脚步置换问题。原理是利用location.hash来进行传值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可 以利用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的 cs2.html传递信息,cs1.html首先创建自动创建一个隐藏的iframe,iframe的src指向cnblogs.com域名下的 cs2.html页面,这时的hash值可以做参数传递用。cs2.html响应请求后再将通过修改cs1.html的hash值来传递数据(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于a.com域名下的一个代理iframe;Firefox可以修改)。同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一点有变化则获取获取hash值。代码如下:

先是a.com下的文件cs1.html文件:

function startRequest(){
var ifr = document.createElement(‘iframe’);
ifr.style.display = ‘none’;
ifr.src = ‘http://www.cnblogs.com/lab/cscript/cs2.html#paramdo’;
document.body.appendChild(ifr);
}

function checkHash() {
try {
var data = location.hash ? location.hash.substring(1) : ”;
if (console.log) {
console.log(‘Now the data is ‘+data);
}
} catch(e) {};
}
setInterval(checkHash, 2000);

cnblogs.com域名下的cs2.html:

//模拟一个简单的参数处理操作
switch(location.hash){
case ‘#paramdo’:
callBack();
break;
case ‘#paramset’:
//do something……
break;
}

function callBack(){
try {
parent.location.hash = ‘somedata’;
} catch (e) {
// ie、chrome的安全机制无法修改parent.location.hash,
// 所以要利用一个中间的cnblogs域下的代理iframe
var ifrproxy = document.createElement(‘iframe’);
ifrproxy.style.display = ‘none’;
ifrproxy.src = ‘http://a.com/test/cscript/cs3.html#somedata’; // 注意该文件在”a.com”域下
document.body.appendChild(ifrproxy);
}
}

a.com下的域名cs3.html

//因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
parent.parent.location.hash = self.location.hash.substring(1);

当然这样做也存在很多缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等……

(4)window.name实现的跨域数据传输

文章较长列在此处不便于阅读,详细请看 window.name实现的跨域数据传输。

(5)使用HTML5 postMessage

HTML5中最酷的新功能之一就是 跨文档消息传输Cross Document Messaging。 下一代浏览器都将支持这个功能:Chrome 2.0+、Internet Explorer 8.0+, Firefox 3.0+, Opera 9.6+, 和 Safari 4.0+ 。 Facebook已经使用了这个功能,用postMessage支持基于web的实时消息传递。

otherWindow.postMessage(message, targetOrigin);
otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.open的返回值;通过name或下标从window.frames取到的值。
message: 所要发送的数据,string类型。
targetOrigin: 用于限制otherWindow,“*”表示不作限制

a.com/index.html中的代码:


b.com/index.html中的代码:

(6)利用flash

这是从YUI3的IO组件中看到的办法,具体可见http://developer.yahoo.com/yui/3/io/。
可以看在Adobe Developer Connection看到更多的跨域代理文件规范:ross-Domain Policy File Specifications、HTTP Headers Blacklist。

4、Jquery最核心的部分是什么?

答:Jquery选择器

5、冒泡排序、快速排序、选择排序、堆排序、插入排序各写一例?说说冒泡排序和快速排序的核心思想

答:略

6、当前的web应用程序的网络协议都有哪些?

答:HTTP(超文本传输协议)、TCP/IP(传输控制协议/网络互联协议)、SMTP(邮件传输协议)、POP3(邮局协议第三版)、FTP(文件传输协议)等等

7、谈谈session和cookie的概念?并说说其各自的实现原理

8、nginx是什么?与linux的区别?

答:nginx(发音同 engine x)一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。linux是一种操作系统,两个根本不属同一类

9、jsonp和json有什么区别

答:JSON(JavaScript Object Notation)是Douglas Crockford提出的。他是一个轻量级的数据交换格式,基于JavaScript对象字面量。

    使用JSON的优点在于:

  (1) 比XML轻了很多,没有那么多冗余的东西

   (2)JSON也是具有很好的可读性的,但是通常返回的都是压缩过后的。不像XML这样的浏览器可以直接显示,浏览器对于JSON的格式化的显示就需要借助一些插件了

   (3)在JavaScript中处理JSON很简单

    (4)其他语言例如PHP对于JSON的支持也不错

    JSON也有一些劣势:

  (1) JSON在服务端语言的支持不像XML那么广泛,不过JSON.org上提供很多语言的库

  (2) 如果你使用eval()来解析的话,会容易出现安全问题

   尽管如此,JSON的优点还是很明显的。他是Ajax数据交互的很理想的数据格式。

  JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问

  区别:JSON没有实现跨域,JSONP可以实现跨域

10、谈谈tinyint int smallint mediumint的 字节数 和长度范围

答:类型 字节 最小值(带符号/无符号) 最大值(带符号/无符号)

TINYINT 1 -128 / 0    127 / 255

SMALLINT 2 -32768 / 0 32767 / 65535

  MEDIUMINT 3 -8388608 / 0 8388607 / 16777215

   int 4 -2147483648 / 0 2147483647 / 4294967295

11、说说对面向对象的理解?

答:面对对象就是: 把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。

面向对象有三个特征:继承、封装、多态

12、varchar和char的区别,各能存多少字节?

答:char(n) 定长 索引效率高 程序里面使用trim去除多余的空白 ,n 必须是一个介于 1 和 8,000 之间的数值,存储大小为 n 个字节
varchar(n) 变长 效率没char高 灵活 ,n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节

13、一个汉字在utf-8编码下占多少字节?

答:3个字节,用mb_strlen($str,’utf8′)函数可以测试出,一个汉字在gbk编码下占两个字节

14、说说mysql 水平分区和垂直分区?

答:数据库分区: 数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果, 但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
水平分区,垂直分区
  分区主要有两种形式:这里一定要注意行和列的概念(row是行,column是列)
水平分区(Horizontal Partitioning)
这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。
所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。
举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。
一定要通过某个属性列来分割,譬如这里使用的列就是年份
垂直分区(Vertical Partitioning)
这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。
举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,
在保证它们数据相关性的同时还能提高访问速度。

15、谈谈你对memcache的了解?

答:memcached 是高效、快速的分布式内存对象缓存系统 ,通过在内存里维护一个统一的巨大的Hash表,能够用来存储各种格式的数据。主要用于加速 WEB 动态应用程序。

  工作原理:首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

16、有一只猴子,旁边有100根香蕉,他离家有50米远,每次只能搬50根香蕉,不然就会被压死,每走一米就要吃掉一根,问最多能将几根香蕉搬回家?

答:16根.
  问题简化成走最短的路,背更多的水果.但路和水果之间有限制! 题目已经限制,猴子最多背50,我们计算其消耗仅剩下50根的米处,
  假设猴子第一次背了50根,走了X米,在回来搬第2个50根,就有:
  100-3X ……… 剩下的香蕉数(先走X,往反2X)
  50-X ………… 剩下的米处
  问题就明白了:
  (100-3X)-(50-X)=50-2X ……..回到家时的香蕉数
  问题就简化为在条件: (100-3X)<=50的情况下,求
  (50-2X)的最大值!
  得到: X=17时, 50-2X 最大值 16

17、dir/upload.image.jpg请写出至少五种以上方法,获取文件类型,必须使用php内置函数,可以封装成方法,方法不能明显重复。

<?php
$string= ‘dir/upload.image.jpg’;
$tok = strtok($string, ‘.’); //使用strtok将字符串分割成一个个令牌
while ($tok)
{
  $arr[]= $tok;
  $tok = strtok(‘.’); //该函数会保持它自己的内部指针在字符串中的位置,
                        //如果想重置指针,可以将该字符串传给这个函数.
                        //所以当第二次调用strtok()函数时,如果对上一次的已分割的字符串进行分割,第1个参数可以省略
}
$count= count($arr);
$i= $count-1;
$file_type= $arr[$i];
?>  

<?php
$string= ‘dir/upload.image.jpg’;
$arr= explode(‘.’, $string); //使用explode()函数分割字符串,返回值是一个数组
$count= count($arr);
$count-=1;

$file_type= $arr[$count];//利用数字索引
$file_type = array_pop($arr);//将数组最后一个单元弹出(出栈),用一个变量接住
?>

<?php
$string= ‘dir/upload.image.jpg’;
$i= strrpos($string, ‘.’);   //得到指定分割符在字符串的最后一次出现的位置
$file_type= substr($string, $i);//截取字符串
?>

<?php
$string= ‘dir/upload.image.jpg’;
$file_type= strrchr($string, ‘.’); //取得某字符最后出现处起的字符串。
?>

<?php
$string= ‘dir/upload.image.jpg’;
$arr= pathinfo($string);  //返回文件路径的信息    print_r($arr);
$file_type= $arr['extension'];
?>

<?php
$string= ‘dir/upload.image.jpg’;
eregi(‘^["."]+$’, $string, $arr);//用正则表达式来分割
$count= count($arr);
$count-=1;
$file_type= $arr[$count];
?>

18、使用索引的好处和坏处都有哪些?

答:如果表上没有索引.在对表进行相关操作时会对表执行表面扫描.表越大,扫描时间越长.主要是扫描时需要顺序的存取数据的每一行.在做简单的查询时索引可以有效地提高速度.
如果在做巨复杂的查询时.表基本上会进行表扫描操作.索引的存贮主要是包含一个索引搜索键值跟一个指向包含该值行的一个指针还有行值.所以索引内存部分比表空间少.使用操作语句时,索取索引时间比表扫描快.

索引也有坏处(小坏处,忽略不计).对一个表进行的INSERT或者是DELETE时 操作都需要对表上的每个索引进行额外的更新,增加了处理时间.单索引跟联合索引对于update 更改索引操作也是如此

作者:AngryFox 分类: Uncategorized November 30th, 2011 暂无评论
static只有第一次执行到
function fun_static(){
    static $a = 1;
    echo $a ++."<br>";
}

fun_static();
fun_static();
fun_static();
/* the out result
* by AngryFox
1
2
3
*/
作者:AngryFox 分类: Uncategorized November 19th, 2011 暂无评论

PHP中类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此 就引入了类的接口技术。使用关键字 interface 来定义,并使用关键字 implements 来实现接口中的方法,且必须实现所有接口中所定义的方法。接口里面不能声明变量,但可以声明常量,而且所有成员都是public权限的。
定义接口
interface 接口名{
……….

}
实现接口
class 类名 implements 接口名{
……….

}

下面两个例子分别是从简单到复杂化。

//简单定义实现接口
interface UserInterface{ //定义user接口
function getname();
}
interface TeacherInterface{ //定义teacher接口
function getLengthofService();
}
class User implements UserInterface{ //实现user接口
private $name="nostop";
public function getName(){
return $this->name;
}
}
class Teacher implements TeacherInterface{ //实现teacher接口
private $age=23;
public function getLengthofService(){
return $this->age;
}
}
$user=new User();
echo $user->getName().’
‘;//nostop
$teacher=new Teacher();
echo $teacher->getLengthofService().’
‘;//23

//继承类实现接口
class GraduResultudent extends User implements TeacherInterface{ //继承User类 实现接口
private $teacher;
public function __construct(){ //定义构造函数
$this->teacher=new Teacher(); //实例化Teacher对象
}
public function getLengthOfService(){ //实现TeacherInterface接口的方法
return $this->teacher->getLengthOfService();
}
}
class Result{
public static function getUserName(UserInterface $_user){ //注意:这里面的类型变成接口类型
echo “Name is “.$_user->getName().’
‘;
}
public static function getLengthOfService(TeacherInterface $_teacher){ //注意:这里面的类型变成接口类型
echo “age is “.$_teacher->getLengthOfService();
}
}
$object=new GraduResultudent();
Result::getUserName($object); //Name is nostop
Result::getLengthOfService($object); //age is 23
echo “
“;

//接口实现用户的折扣
interface People{ //定义接口
function getUserType();
function getCount();
}
class VipUser implements People{ //实现接口
//用户折卡系数
private $discount=0.8;
function getUserType(){
return “VIP用户”;
}
function getCount(){
return $this->discount;
}
}
$vip=new VipUser(); //实现化对象
echo $vip->getUserType().’商品价格:’.$vip->getCount()*100; //VIP用户商品价格:80
class Goods{
var $price=100;
var $member;
function run(People $member){ //注意:这里面的参数类型是接口类型
$this->member=$member;
$discount=$this->member->getCount();
$usertype=$this->member->getUserType();
echo $usertype.”商品价格:”.$this->price*$discount;
}
}
$display=new Goods();
$display->run(new VipUser);//VIP用户商品价格:80
?>

实现多个接口
class 子类 extends 父类 implements 接口1,接口2,……..{
………

}
抽象类和接口的区别
接口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:
1. 一个子类如果implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。
2. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。
3. 抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。

作者:AngryFox 分类: Uncategorized November 14th, 2011 暂无评论

1、下载mongodb 1.8.2 安装包,并解压到
  wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz
  tar zxf mongodb-linux-i686-1.8.2.tgz
2、将mongodb移动到/usr/local/mongdb文件夹
  mv mongodb-linux-i686-1.8.2 /usr/local/mongodb
3、创建数据库文件夹
  mkdir /usr/local/mongodb/data
4、将mongodb启动项目加入rc.local保证mongodb在服务器开机时启动
  echo “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data” >> /etc/rc.local
5、启动mongodb
  sudo /usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data

作者:AngryFox 分类: Uncategorized November 13th, 2011 暂无评论

1。__construct()

  实例化对象时被调用,

  当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

  2。__destruct()

  当删除一个对象或对象操作终止时被调用。

  3。__call()

  对象调用某个方法,

  若方法存在,则直接调用;

  若不存在,则会去调用__call函数。

  4。__get()

  读取一个对象的属性时,

  若属性存在,则直接返回属性值;

  若不存在,则会调用__get函数。

  5。__set()

  设置一个对象的属性时,

  若属性存在,则直接赋值;

  若不存在,则会调用__set函数。

  6。__toString()

  打印一个对象的时被调用。如echo $obj;或print $obj;

  7。__clone()

  克隆对象时被调用。如:$t=new Test();$t1=clone $t;

  8。__sleep()

  serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

  9。__wakeup()

  unserialize时被调用,做些对象的初始化工作。

  10。__isset()

  检测一个对象的属性是否存在时被调用。如:isset($c->name)。

  11。__unset()

  unset一个对象的属性时被调用。如:unset($c->name)。

  12。__set_state()

  调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

  13。__autoload()

  实例化一个对象时,如果对应的类不存在,则该方法被调用。

  魔术常量

  1。__LINE__

  返回文件中的当前行号。

  2。__FILE__

  返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

  3。__FUNCTION__

  返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  4。__CLASS__

  返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  5。__METHOD__

  返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

作者:AngryFox 分类: Uncategorized November 7th, 2011 暂无评论

以下的文章主要就是对MySQL语句优化的正确方法与其基本原则的具体描述。
1、使用索引来更快地遍历表。
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;

b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。

2、在海量查询时尽量少用格式转换。
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。

4、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

5、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT

6、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。
7、尽量少用VARCHAR、TEXT、BLOB类型

8、如果你的数据只有你所知的少量的几个。最好使用ENUM类型

9、索引的建立原则:
如果一列的中数据的前缀重复值很少,我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短,占用的 磁盘空间越少,在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。

在很多场合,我们可以给建立多列数据建立索引。
索引应该建立在查询条件中进行比较的字段上,而不是建立在我们要找出来并且显示的字段上

10、索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间.
有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; 这个视实际情况而定,通常情况下索引是必需的.

11、在对查询效率有怀疑的时候,接用Mysql的Explain来跟踪查询情况.

作者:AngryFox 分类: Uncategorized November 7th, 2011 暂无评论

首页的程序结构是最后才载入html模板,只有将载入模板前的所有输出信息都去掉就可以避免php调试信息:
在index_Out.php文件第一行
ob_start();
在载入模板前清除,

    if ('debug'!=$_GET['dg']){
    $debug = ob_get_clean();
    unset($debug);
    ob_clean();
    ob_end_clean();
    }
    tpl::display("_index_2011.tpl.php");

php调试信息可以避免了。
首页的html有2千多行,真正需要写在模板的可能1千行左右,不能担保一直不出错误,写少li或者多写li可能就把首页页面搞乱了。
所以需要验证html,如果有错误,不能输出。引入php插件tidy,新加一个htmlcheck类,用于html的检查
class.htmlcheck.php:

    <?php
    /**
    * 使用tidy检查html完整性
    *
    * @author kend dengjm@corp.56.com
    * @example
    *      $htmlcheck = new htmlcheck($html,1,'utf8');
            $rs = $htmlcheck->check_err();//获得错误信息
            if (!$rs){
                echo $htmlcheck->gethtml();
            }else{
                var_export($rs);//输出错误
            }
    */
    class htmlcheck{
        private $config = array();//tidy配置文件,以便以后扩展,配置选项:http://tidy.sourceforge.net/docs/quickref.html
        private $str = '';//需要检查的html内容
        private $tidy;//保存tidy句柄
        private $error = array();//错误信息
        private $warning = array();//警告信息
        private $encode = 'utf8';//编码

        function __construct($str, $type = 1, $encode = 'utf8'){
            if(!extension_loaded('tidy')){
                die('tidy no loaded');
            }
            $this->str = $str;
            $this->encode = $encode;

            switch ($type){
                case 1:
                default:
                    $this->config = array(
                       'indent'         => true,
                       'output-xhtml'   => true,
                       'wrap'           => 1000);
                    break;
            }

            //tidy检查html
            $this->tidy = new tidy;
            $this->tidy->parseString($this->str, $this->config, $this->encode);
            $this->tidy->diagnose();
            self::split_errorinfo();
        }

        /**
         * 返回错误信息
         * @author kend
         */
        function check_err(){

            $c = count($this->error)+count($this->warning);
            if ($c<=0) return false;

            //@todo 显示错误和行信息
            return $this->error;

            $tidy->repairString();

            echo $tidy->errorBuffer . "\n";

            //$tidy->diagnose();
            //echo $tidy->errorBuffer;

        }
        /**
         *
         * 返回警告和错误信息
         * @author kend
         */
        function check_all_wo(){
            $c = count($this->warning)+count($this->error);
            if ($c<=0) return false;

            return array_merge($this->warning,$this->error);
        }
        /**
         *
         * 返回警告信息
         * @author kend
         */
        function check_warn(){
            $c = count($this->warning);
            if ($c<=0) return false;

            return $this->warning;
        }

        /**
         * 返回错误信息
         */
        function check_error(){
            $c = count($this->error);
            if ($c<=0) return false;

            return $this->error;
        }

        /**
         * 把tidy返回信息分成错误和警告
         * @author kend
         */
        function split_errorinfo(){
            $string = nl2br($this->tidy->errorBuffer);
    //        if($_GET['dg'] == 'ml'){
    //            echo '<pre>';var_export($string);echo '</pre>';
    //            exit;
    //        }
            $data = explode('<br />', $string);
            if (!empty($data)){
                foreach ($data as $key =>$val){
                    if (strpos($val,'Warning')!==false){
                        $a = preg_match_all('/line\040([0-9]*)\040/i', $val, $t);
                        $s = $a?$this->num_line($t['1']['0']):'no value';
                        $this->warning[] = $val.",\nThe html is:\n".$s;
                    }else if (strpos($val,'Error')!==FALSE){
                        $a = preg_match_all('/line\040([0-9]*)\040/i', $val, $t);
                        $s = $a?$this->num_line($t['1']['0']):'no value';
                        $this->error[] = $val.",\nThe html is:\n".$s;
                    }
                }
            }
            return true;
    //        echo '<pre>';var_export($this->warning);echo '</pre>';
        }

        /**
         * 返回结构树
         */
        function getnodes(){
            $rs = self::dump_nodes($this->tidy->root(), 1);
            return $rs;
        }

        /**
         * 循环获得结构树
         * @param unknown_type $node
         * @param unknown_type $indent
         * @author kend
         */
        function dump_nodes($node, $indent) {
            $str = '';
            if($node->hasChildren()) {
                   foreach($node->child as $child) {
                       $str .= str_repeat('.', $indent*2) . ($child->name ? $child->name : '"'.$child->value.'"'). "\n";

                      $str .= self::dump_nodes($child, $indent+1);
                    }
             }
            return $str;
        }
        /**
         * 循环获得对应行号,html值
         */
        function get_line_value($node, $line){
            $str = '';
            if($node->hasChildren()) {
                   foreach($node->child as $child) {
                           if ($child->line == $line ){
                               $str = $child->value. "\n";
                               return $str;
                           }
                      $str = self::get_line_value($child, $line);
                      if (!empty($str))return $str;
                    }
             }
             return  false;

        }

        /**
         * 返回html
         * @author kend
         */
        function gethtml(){
            //echo '<pre>';var_export($this->tidy->html()->child);echo '</pre>';
    //        foreach ($this->tidy->html()->child as $key=>$val){
    //            echo var_export($val);echo '<pre>'.$val->line.':'.$val->value;echo '</pre><br\>';
    //        }
            return $this->tidy->html()->value;
        }
        /**
         * 返回指定行信息
         */
        function num_line($line){
            $line = intval($line);
            $s = $this->get_line_value($this->tidy->html(), $line);
    //        echo '<pre>';var_export($s);echo '</pre>';
    //
    //        exit;
            return $s;
        }
        /**
         * fix html
         * @author kend
         */
        function fixhtml(){
            return $this->tidy->repairString($this->str, $this->config, $this->encode);
        }
        /**
         * 取状态
         * Returns 0 if no error/warning was raised, 1 for warnings or accessibility errors, or 2 for errors.
         */
        function get_status(){
            return $this->tidy->getStatus();
        }

    }

也是需要利用ob_start();获得html内容,使用htmlcheck进行检查:

    ob_start();
    include $tpl;
    $html=ob_get_clean();
    ob_end_clean();
    $htmlcheck = new htmlcheck($html,1);
    $rs = $htmlcheck-&gt;check_err();

    if (!$rs){
    echo $html;
    }else{
    var_export($rs);
    }
作者:AngryFox 分类: Uncategorized November 7th, 2011 暂无评论

经常听中国移X和某讯卖靓号,以为网上没程序也有个算法吧,google一下,一篇都没……
简单来说,就是匹配数字之间关系的权重。
总结如下:
①位数权重:4位数肯定要比5位数要贵
②数字权重:2、3、6、8比4、7权重高
③同号权重:先来简单的,11111和222222这种都比较容易,权重随着位数增加而增加。
2002002这种需要按照数字间的权重加减,例如第2、3位0这个的权重是1*1.5,那么第1、4、7位的2的权重是1*1.2*1.2
然后到第5、6位的0,权重应该是比1高,但比1.5低,换句话说同号的如果中间有别的数字,继续同号权重会减少。

<?php
权重 = 1;
k = 2;
if("前一个数字"=="后一个数字")
{
    权重 *= 权重[k] ;
    k ++;
}else{
    if(k>2)
    {
        k --;
    }
}

④连号:如123456,原理跟③类似
⑤年号:号码含有1950-2012的都权重都高一点
⑥特殊号码:号码含有520、168等

作者:AngryFox 分类: Uncategorized November 7th, 2011 暂无评论

获取鼠标的关键代码是

e = e || window.event,
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
} else if (e.clientX || e.clientY) {
posx = e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
posy = e.clientY + document.documentElement.scrollTop + document.body.scrollTop;
};
但是有点不明白 上面和左边为什么加15像素
# tip.style.top = +posy + 15 + ‘px’;
#tip.style.left = +posx + 15 + ‘px’;