FTP 数字代码的意义

FTP 数字代码的意义
110 重新启动标记应答。
120 服务在多久时间内ready。
125 数据链路埠开启,准备传送。
150 文件状态正常,开启数据连接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制连接埠关闭,可以注销。
225 数据连结开启,但无传输动作。
226 关闭数据连接端口,请求的文件操作成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操作完成。
257 显示目前的路径名称。
331 用户名称正确,需要密码。
332 登入时需要账号信息。
350 请求的操作需要进一部的命令。
421 无法提供服务,关闭控制连结。
425 无法开启数据链路。
426 关闭联机,终止传输。
450 请求的操作未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,无法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件需要账户登入。
550 未执行请求的操作。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。
553 未执行请求的的命令,名称不正确。

PHP语法检查工具

PHP Mess Detector(http://phpmd.org/)

PHP项目体检工具,根据你设定的标准(如单一文件代码体积,未使用的参数个数,未使用的方法数)检查PHP代码,超出设定的标准时报警。

PHP Copy Paste Detector(https://github.com/sebastianbergmann/…)

顾名思义,检查冗余代码的

PHP Dead Code Detector(https://github.com/sebastianbergmann/…)

看名字就知道了,检查从未被调用过的方法

PHP Code Sniffer(http://pear.php.net/package/PHP_CodeS…)

老牌代码格式化工具,PHP写的,Pear包,可自己hack,可集成到命令行里。我一直用的PHP Code Beautifier,只有Windows GUI,Windows CMD很难用,已经打算跳槽到PHP CS了

你还可以用jenkins把上述工具以plugins形式整合起来,做持续集成:http://jenkins-php.org/

你还可以用xinc+phing跟上述工具集成起来做持续集成后的自动化打包发布:http://code.google.com/p/xinc/

 

https://segmentfault.com/q/1010000000119048

JS获取自身所在文件的目录路径

很多时候我们都需要在js文件中获取该文件的详细路径,以便根据其他文件与该js的相对位置计算并设置其他一些文件如图片或样式或脚本的目录路径。我们一般都这样做:

假设外部js文件的文件名为:test.js,则在test.js中都这样写: 继续阅读“JS获取自身所在文件的目录路径”

主流手机设备视口尺寸

  • 浏览器下ipad:768*1024 * 微信下 ipad:768*960
  • 浏览器下iphone6s:414*736
  • 微信下 iphone6s:414*672
  • 浏览器下iphone6:375*667
  • 微信下 iphone6:375*603
  • 浏览器下note3 :360*640
  • 微信下 note3 :360*576
  • 浏览器下iphone5:320*568
  • 微信下 iphone5:320*504
  • 浏览器下 华为:360*604
  • 微信下 华为:360*540
  • 浏览器下 荣耀:360*592
  • 微信下 荣耀:360*528
  • 浏览器下 iphone4:320*480
  • 微信下 iphone4:320*416**

JS实现图片不存在时显示默认图片

每个网站都会有图片的存在,很多时候我们需要在网页上显示各种各样的图片,当图片数量越来越多时,难免会出现图片丢失的情况,当某些图片不存在时,网页上的红叉会显得很难看,这时候我们可以选择显示默认图片来代替,这样会显得非常有人性化。
利用 image 对象的 onerror 事件来判断,出错则更换 image 对象的 src 为默认图片的 URL。

继续阅读“JS实现图片不存在时显示默认图片”

PHP抽奖概率算法


/*
* 不同概率的抽奖原理就是把0到*(比重总数)的区间分块
* 分块的依据是物品占整个的比重,再根据随机数种子来产生0-* 中的某个数
* 判断这个数是落在哪个区间上,区间对应的就是抽到的那个物品。
* 随机数理论上是概率均等的,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。
*/
function get_rand($proArr)
{
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
$proSum = array_sum($arr); // 计算总权重
$randNum = mt_rand(1, $proSum);
$d1 = 0;
$d2 = 0;
for ($i=0; $i < count($arr); $i++) { $d2 += $arr[$i]; if($i==0) { $d1 = 0; } else { $d1 += $arr[$i-1]; } if($randNum >= $d1 && $randNum <= $d2) { $result = $proArr[$i]; } } unset ($arr); return $result; } /* * 使用较多的为这个方法 */ function get_rand1($proArr) { $result = array(); foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
// 概率数组的总概率
$proSum = array_sum($arr);
asort($arr);
// 概率数组循环
foreach ($arr as $k => $v) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $v) { $result = $proArr[$k]; break; } else { $proSum -= $v; } } return $result; } /* * 奖项数组 * 奖品id,名称,比重 */ $arr = array( array('id'=>1,'name'=>'特等奖','v'=>1),
array('id'=>2,'name'=>'一等奖','v'=>5),
array('id'=>3,'name'=>'二等奖','v'=>10),
array('id'=>4,'name'=>'三等奖','v'=>12),
array('id'=>5,'name'=>'四等奖','v'=>22),
array('id'=>6,'name'=>'没中奖','v'=>50)
);

测试结果(10000次):
get_rand():
count_1:0 count_2:490 count_3:1021 count_4:1172 count_5:2172 count_6:5145
特等奖中奖率全为:0
get_rand1():
count_1:92 count_2:477 count_3:1017 count_4:1195 count_5:2264 count_6:4955
总体感觉 get_rand1() 更准确些……

5分钟快速实现一个哈希表(Clang)

哈希表(Hash table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。 也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。 这个映射函数称做散列函数,存放记录的数组称做散列表。 ————维基百科

在一些合理的假设下,在哈希表中的所有操作的时间复杂度可以简单看作O(1) 。它通过计算一个键的哈希值来快速定位键值在哈希表的位置。 实现一个好的哈希表的关键是一个好的哈希算法与一个处理哈希冲突的方法 。常见的简单哈希算法有BKDRHash,APHash,DJBHash,JSHash,RSHash.较复杂有MD5和SHA1之流。哈希算法的好坏直接影响哈希表存取的效率。 而处理哈希冲突的办法有开放寻址法与拉链法。下面示例使用的是拉链法

BKDRHash哈希算法

上述多个哈希算法中 BKDRHash在效率,平衡,均匀分布方面表现突出,并且它的实现也是最容易理解与记忆的。实现如下:

/**  * BKDR hash function in clang * @param key char* 字符串 * @return int hashed value, we will get a int value */int bkdrHash( char *key ){    uint seed = 131;//i can be 13, 131, 1313,131313 etc    uint hash = 0;    while( *key != ‘\n’ && *key != 0 )    {            hash = hash * seed + ( *key++ );    }    return ( hash & 0x7FFFFFFF );}

哈希表(拉链法处理冲突)

示意图:(图片来源:http://blog.csdn.net/v_JULY_v/article/details/6256463)

上图中,左则是一个数组,保存的是每个单向链表的头指针。实际的值就存储在链表中

单向链表中的节点的数据结构与数组定义代码

/** 单向链表的节点的结构体 */typedef struct _htItem{        struct _htItem  *next;        char *key_string;        uint fid;} htItem;/** 取得Key在数组中的映射位置 */uint htIndex( char *key, htItem **ht ){        uint hashedKey = bkdrHash( key );        uint length = (ht[0]->fid-1);        return (uint)hashedKey % length+1;}/** 定义数组 */htItem *item[21]; //为方便后台实现,在定义在数组的时候,我们给多一个长度,第一个数据不存储数据,只存放数组长度,剩余的元素空间

初始化数组元素

/** 有必要对数组元素进行一次0 初始化 */void htInit( htItem **ht, uint length ){         int i;         for( i=0; i<length; i++ ){                 ht[i] = (htItem*)malloc(sizeof(htItem));                  memset( ht[i], 0, sizeof(htItem) );         }         ht[0]->fid = length;}

数据的插入和更新

首先通过哈希函数找到Key对应在数组中的位置,再遍历链表,如果在链表中查到相同的key,就直接把该节点的数据更新,否则malloC一个节点,并把节点放到链表末尾。

/** set hashTable element */uint htSet( char *key, uint fid,  htItem **ht ){         uint i = htIndex( key, ht );         htItem *item = ht[i];         while( item->next )         {                  if( strcmp(key, item->next->key_string) == 0 ){                          item->next->fid = fid;                          return 0;                 }else{                          item = item->next;                 }         }         item->next = (htItem*)malloc(sizeof(htItem));         item->next->fid = fid;         item->next->key_string = key;         return 0;}

获取数据

首先通过哈希函数定位KEY在数组中的位置,再依次对比KEY值,如果命中就返回相应的值,否则返回空值

/** get hashTable elements */htItem* htGet( char *key, htItem **ht ){        uint i = htIndex( key, ht);        htItem *item = ht[i]->next;         htItem *tmp = (htItem*)malloc(sizeof(htItem));         memset(tmp, 0, sizeof(htItem));        while( item )        {                if( strcmp(key, item->key_string) == 0 ){                          printf(“hiting %s\n”, key);                          tmp->fid = item->fid;                          tmp->key_string = item->key_string;                        return tmp;                }                 item = item->next;        }        return;}

删除数据

/** delete one element of hashtable */int htDel(char *key, htItem **ht){        uint i = htIndex(key, ht);        htItem *item = ht[i];        while(item->next){                if(strcmp(key, item->next->key_string) == 0 ){                        htItem *tmp = item->next;                        item->next = tmp->next;                        free(tmp);                        return 0;                }                item = item->next;        }        return -1;}

打印完整hashtable中的元素

void print_hashTable( htItem **ht ){        uint length = ht[0]->fid;        uint i;        htItem *item;        for( i = 1; i < length; i++ )        {                item = ht[i]->next;                while(item)                {                        printf(“%s => %d\n”,item->key_string, item->fid);                        item = item->next;                }        }}

简单几个方法就实现了哈希表的增删查改。

使用示例

/** 定义与初始化 */    htItem *item[101];          htInit(item, 101);                  /** 添加元素 */         htSet(“longmon”,100,item);          htSet(“natalie”, 1000,item);         htSet(“xiaoqiong”,99, item);                  /** 打印 */         print_hashTable(item);                  /** 删除一个元素 */         htDel(“natalie”, item);                  /** 打印 */         print_hashTable(item);                  /** 获取keylongmon的值 */         htItem *tmpitem = htGet(“longmon”, item);                   /** 打印 */         printf(“key: %s => val:%d\n”, tmpitem->key_string, tmpitem->fid);

输出结果

#打印 xiaoqiong => 99natalie => 1000longmon => 100#打印 xiaoqiong => 99longmon => 100#打印 Key: longmon => val: 100

完整代码 https://github.com/longmon/hashTable_in_c

哈希表是PHP内核的基石。

PHP内核中的哈希表是十分重要的数据结构,PHP的大部分的语言特性都是基于哈希表实现的, 例如:变量的作用域、函数表、类的属性、方法等,Zend引擎内部的很多数据都是保存在哈希表中的。而PHP内核中的哈希表处理冲突使用的也是拉链法。

扩展阅读: