[原] SQL 查询优化,子查询

场景

假设表 table_snapshot 表 为一个电商系统库存的快照表,里面有 goods_id,num,time 等字段。快照数据大约为50W。其中 goods_id 字段,其上未加索弓丨,不同的goods_id有大约3000个。 

要求

指定了 250个goods_id,要求判断其中多少个在 table_snapshot 表中出现过。 

Continue reading

MySQL | wwpeng | | (0) |

[原] PHP 踩坑实战第二坑:empty

    最近在同事在实践中踩到的一个 empty 坑。关于 empty 的判断类型,就不赘述了,网上解释有很多。例如:0, ”, false, null 等都会被判定为 true。

    这次的坑是 empty 对于对象私有属性的判断。我们来直接上代码:

     Continue reading

PHP | wwpeng | | (0) |

[原] MySQL 如何让一个字段的值不能被减为负数

当用数据库存储一个数值,并且这个数值需要被增减的时候,比如物品的数量。

在这种场景下,物品的数量是不能为负数的。那如何确保在扣减这个数量的时候,不会被扣成负数呢。

假设表数据如下: 

sku num
a 10
b 20

假设现在 a 的 num 要 减少10个。

用程序在操作之前判断? num 是否足够扣减 ? 这明显是不靠谱的。因为有并发的情况存在。

在并发的情况下,a 的 num 会变成 -10 当然,前提你的 sql 是这么写的:

UPDATE table SET num=num-10 WHERE sku="a"

绝对不能用程序去计算 num 的值,在赋值到 sql 中,在并发情况下  num 会变成 0,错误示例:

$data = 'select * from table where sku="a"';
$num = $data['num'] - 10;
UPDATE table SET num=$num WHERE sku="a"

Continue reading

MySQL | wwpeng | | (0) |

[原] PHP 踩坑实战第一坑:双等号

    PHP 的双等号比较,不会比较类型,只会比较值是否相等,但是这第一坑其实是双等号其中非常隐蔽的一个隐式转换。之前遇到过这个问题,找到原因后没太在意,昨天,,就在昨天。。。NND 又掉进去了。。

    首先先看几个实例代码:

<?php
var_dump( 0 == "a" );
var_dump( "0" == "a" );

 请想想这两个比较的返回结果。

Continue reading

PHP | wwpeng | | (0) |

[原]使用结巴分词提供分词服务

    在之前的文章《关于“啊哦”这个图片分享的小站》有提到过,那里面实现了一个提取用户输入关键词的服务,用来作为分享的tag。

    之前没有这个功能的时候,tag必须要手动输入。我觉得这样没意思,不好玩。就在github上找到了结巴分词这样一个工具,原作者是用python实现的,现在也有许多其他版本的实现,比如java,C++。

    最开始我想选用C++版本的,因为这个版本提供了http服务,可以直接用PHP调用,但是后来读他的说明和联系作者,发现只提供了分词的服务,而没有提取关键词的服务。(虽然作者后来帮忙加上了提取关键词的http服务)。所以只能自己动手丰衣足食了。

    结巴分词的关键词提取功能相对简陋,不过感谢作者。提取关键词的时候会先分词,然后 使用 TF/IDF排序方式 来计算这些词的排名。最近有在考虑用完成以下结巴分词PHP版,先不论PHP性能对比其他的怎么样。至少自己能学到很多。

    最原始python实现的代码没有对外提供服务,所以对于这种我自己玩的小应用随便实现一个常驻进程提供服务就可以啦。应该是很容易的。于是我找到了能让python提供http服务的框架 tornado。只要几行代码,就可以成功启动服务,简直酷炫。    

Continue reading

Code | wwpeng | | (0) |

关于“啊哦”这个图片分享的小站

    想做一个个人的站点,来实现莫名其妙蹦出来的各种奇怪的想法,这是一年前想做的东西,啊哦 (我不怎么会起名字,就选了个象声词来代表了) 已经运行了将近一年了,虽然没什么用户,也没什么流量,这不重要,这里有点像是一个私人的试验田,时不时的改动和新想法在实现。

    网站的整体UI都是我一个搞后端的人自己搞的。尽情的吐槽吧,一年前设计成这样,就不想大改了,那时候还没有用过bootstrap等等类似的框架,完全手写的UI。打开PS的那个时候。。我觉得我跟这个软件格格不入。

  啊O – 简单图片分享

    这LOGO看着眼熟嘛?你猜对了。。当时刚刚热映完的泰囧的那个囧字。。被我弄来了~~~

    这个站的目前也实现了点有点意思的功能,比如现在已经实现了的自动提取关键词的服务等,用户分享图片后数据的一段话,如果用户没有输入关键词的话,可以程序调用服务自动获取服务来提炼这一段话的关键词。

    图片的来源我会写一些python的爬虫去别的网站抓取,然后在过滤。。

    还做过一些验证图片唯一性之类的时间。。有时间在博客里面一一聊聊。

    我还有好长的TODO list 没有完成。比如,badwords屏蔽,人脸识别,等等这样的有趣的功能我都想尝试下。come on~

    服务器是阿里云的乞丐版,满足个人的需求是问题不大的。    

    关于这个小东西,欢迎大家留言,意见也好,吐槽也好,觉得这玩意好像没啥用都好。。。欢迎留言,我会认真考虑大家的意见

Code | wwpeng | | (0) |

[原]使用算法放大用户点击坐标数据的粒度

    最近在公司昨做了一个关于用户点击行为的各种统计,其中包括最直观的 点击热点图。   样貌如下: 

    

    我是做后端的,前端肯定直接用写好的库,其中用到的生成热点图的类库是 heatmap,详情参看 github。在此感谢作者。

    关于这个heatmap 还是有一些坑的,之后我在写一个关于heatmap的文章。下面介绍另外的一个问题,就是数据量的问题。一个网站的页面用户的点击量是很大的,即使只有一天。因为用户的每一次点击都会被记录下来。这些数据不论存储在关系数据库里面 还是 nosql里面 都是不小的。效率问题很严重。

    如果这个页面被点击了100W次,再除去坐标重复,因为存储的时候会有一个坐标计数,也就是同一个坐标被点击多次,只有一个记录,但是即使这样,数据量依旧很大,将近100W条记录。这在程序里面直接读出来然后交给JS再画到canvas画布上,服务器内存再大也是吃不消的,

    举个栗子:如果PHP被开的memory limit 内存限制是8G的话,也就能取出10-20W条记录,就爆掉了。而且没有大数据字段,字段数据量都不大。

    比如我们当时的记录是 url:xxxx , x_y:100,200 , count 10 , time:xxxxxx 。就是这样一些简单的字段。

    所以解决方案有两种:

Continue reading

Code | wwpeng | | (1) |

[原]Bash3的key-value数组使用

    平常工作中会遇到很多需要打很多命令的操作,最方便的时写成一个shell脚本让他帮你完成。会懒的程序员才是好程序猿。

    这次我是在写一个需要同步fork库与主库的代码的时候遇到的,首先我需要同步很多个fork库,其次,每次主库都有一个URL,不可能都背下来,每次同步都要运行五六个命名,时间久了以后,自然非常烦。如果在其他语言中,很明显,一个key-value的数组/map之类的就可以直接对应库和url之间的关系了。但是查到bash3的时候居然没有,只能使用数字索引的一维数组。(bash4已经有了),没办法,既然没有自定义key,只能把key放在value里面,自己去解析了。

    上菜。

hgReg=(
	"key1_:_value1" 
	"key2_:_value2" 
	"key3_:_value3"
)
#数组使用 _:_ 这个符号组合来分割,如果有冲突可以替换成别的,前半部分为key,后半部分为value
function process_array() {
	declare -a hash=("${!1}")
	key="${2}"
	for k in "${hash[@]}"; do
		if [ $key = ${k%%_:_*} ];then
			echo ${k##*_:_}
		fi
 	done
}
#调用方式 结果是:value1
echo $(process_array hgReg[@] "key1")

 

Code | wwpeng | | (0) |

[译] PHP5.6的新特性

    原文链接:http://www.sitepoint.com/new-features-php-5-6/

    前面两段是作者吐槽PHP核心开发者的。。我们看重点。。此处省略500字。。。

    CLI服务器中得MIME类型

    MIME类型在php中用于输出其他非PHP类型的内容,也就是说你可以输出一个不是text/html类型的内容。当你执行一个PHP页面,默认输出的是text/html,但是你能用headers去设置他。例如PDF和生成PDF,因为通常的服务器都是HHVM,nginx,apache等,所以当服务器知道是一个不同的MIME类型,服务器知道怎样去根据文件的后缀去给他一个默认类型。而不必跑到PHP中去确认。从PHP5.4的命令行服务器只有几个MIME至今,这个版本将要扩充到几十个。可以肯定的说,所有的MIME类型都将内置在PHP服务器当中了。

    内建运算符重载

    这个功能对于用PHP来做web开发的开发者来说应该接触不到,因为是“内部”的。内部的意思是:非用户空间中得,用户空间是PHP开发者们使用的区域。只有内部类使用他,以使开发更加简洁和可读性更好。在这里有更详细的解释。

    现在可以上传超过2G的文件    

    知道5.6,之前所有的PHP版本上传文件都不可以超过2G,这已经是过去式了。新版的changelog表明,现在已经支持上传任意大小的文件了。

    POST数据的内存使用量下降

    POST数据的内存使用量已经下降了2-3倍,并且取消了这两个设置:always_populate_raw_post_data 在 php.ini 里面的设置,以及 $HTTP_RAW_POST_DATA 这个超全局变量。这意味着你不能再用原来的方式访问post数据。需要依赖于另一种解决方案:

$postdata = file_get_contents("php://input");

 当这个表单被分成多个部分时,是无法用 ://input 获得POST的数据的(换句话说,如果这个表单中有一个文件域的话,就不行)

Continue reading

师夷长技 | wwpeng | | (0) |

Linux 进程、端口、IP、连接数等查询脚本

1. 查看TCP连接状态

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

 (以上每一行实现的效果基本相同,在此列出不同的写法,方便对脚本写法的更深理解)

2. 查找请求数请20个IP(常用于查找攻来源)

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

 

3. 用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

  Continue reading

Linux/Shell | wwpeng | | (2) |