最近的一些技术整理(20120109)
前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做)
这篇还是一些技术的整理,主要是用于备忘,大家如果觉得太简单就一笑而过啦~
一. python通过图片内容判断图片类型
前段时间写了一个小站练手,http://xiangshuguo.com,一个支持自由上传的图片小站。
因为要限制上传图片的格式,所以要做文件类型检测,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def get_image_type(pd, is_path=True): ''' 获取图片的类型,支持传入路径和文件内容 ''' if is_path: f = file(pd, 'rb') data = f.read(10).encode('hex') else: data = pd.encode('hex') ftype = None if data.startswith('ffd8'): ftype = 'jpeg' if data.startswith('424d'): ftype = 'bmp' if data.startswith('474946'): ftype = 'gif' elif data.startswith('89504e470d0a1a0a'): ftype = 'png' return ftype |
二. stringstream使用陷阱(1)
我直接举一个例子吧
1 2 3 4 5 6 7 | stringstream ss; int x; ss << "190"; ss >> x; cout << x; |
这个代码是没有问题的,结果会是:
190
如下的代码:
1 2 3 4 5 6 7 | stringstream ss; string x; ss << "190"; ss >> x; cout << x; |
也是没有问题的,输出也是:
190
然而这样的代码:
1 2 3 4 5 6 7 | stringstream ss; string x; ss << "x y z"; ss >> x; cout << x; |
输出将会是:
x
好吧,看了文档才发现,当 stringstream将数据导出到一个字符串变量时,它会用空格分割。
但说实话,同一个操作符,意义却不一样,这真挺让人纠结。。
三. stringstream使用陷阱(2)
如果你习惯了C分割的atoi直接将空字符串转成0,那么用stringstream时,千万不要做这种事情,因为如下代码:
1 2 3 4 5 | stringstream ss; int x; ss << ""; ss >> x; cout << x; |
输出将并不一定是0。
四. MySQL多库表的查询方法
腾讯内部使用MySQL数据库都是分库表的,所以在mysql中想手工查询个数据都会变得非常困难,所以这里放个简单的模板,要用的时候,只要用vim对应生成一下就可以了
1 2 3 4 5 | SELECT * FROM( SELECT * FROM db_app_right0.tb_app_right0 UNION SELECT * FROM db_app_right0.tb_app_right1 )AS t INTO OUTFILE '/tmp/mx'; |
五. MySQL安全删除数据的做法
这个其实是来自公司DBA的建议啦,这里分享一下
关于delete,我这里建议你们 做任何的delete操作之前先执行如下备份语句:
1 2 | CREATE backup.tablename AS SELECT * FROM dbname.tablename WHERE id = 90000; DELETE FROM dbname.tablename WHERE id = 90000; |
恢复语句:
1 | insert into dbname.tablename select * from backup.tablename; |
还有一个习惯, 如果确信自己删的数据只有一条 加个 limit 1
OK,就这样
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=2457
呃,第一个,我直接调用 file 命令的~
[回复]
Dante 回复:
一月 9th, 2012 at 10:14 下午
哈,我就知道发出来是有好处的,依云详细说说说?
[回复]
依云 回复:
一月 9th, 2012 at 10:33 下午
不说,只贴链接
https://github.com/Vim-cn/elimage/blob/master/main.py#L30
[回复]
Dante 回复:
一月 9th, 2012 at 10:36 下午
咦,这个貌似是通过文件名来区分的?这个不太安全吧?
[回复]
依云 回复:
一月 9th, 2012 at 10:47 下午
后边上传时是通过文件名区分的,浏览器访问时是用 file 命令检测的。所以,这里不仅可以上传图片,还可以上传其它东西哦~
记得标记过 FIXME 还是 TODO 的,不过我觉得这样方便啊。
[回复]
Tested! 我上传了一张Vim_command,很不错的小站,简洁,实用!但是垃圾图片的自动清理也是个问题吧
[回复]
Dante 回复:
一月 10th, 2012 at 10:21 上午
哈哈,看到了~~
嗯呢,我也在考虑怎么保证自由的情况下又能减少垃圾。。
[回复]
问下博主 “如果确信自己删的数据只有一条 加个 limit 1” 这种做法有什么依据? 我只是去测试了下查询时间 发现加了貌似还变慢了 求解~
[回复]
Dante 回复:
一月 10th, 2012 at 12:15 下午
这个只是为了防止误删多条哈,没别的意思哈
[回复]
1. stringstream 使用陷阱 (1)
那个应该不是 stringstream 的问题,而是输入操作符 >> 的问题:
用输入操作符 >> 写 string 对象时,空白字符(” ‘\t’ ‘\n’)将会被忽略
2. stringstream 使用陷阱 (2)
stringstream 是流类型,比较特殊,使用时确实不容易把握
但是,string 类型(即便为空)貌似不能转化为 int 类型使用吧?
下面的用法非法:
[回复]
Zind 回复:
一月 10th, 2012 at 2:05 下午
被转义了,再试一次:
[回复]
Dante 回复:
一月 10th, 2012 at 2:38 下午
嗯? 我没有用string直接转int呀,我是用stringstream在转~
[回复]
图片小站也是用的bottle吗?
[回复]
Dante 回复:
一月 10th, 2012 at 3:51 下午
对滴~ 哈哈
结构基本就是这篇文章分享的:
http://www.vimer.cn/2011/12/bottle%E5%81%9Aweb%E5%BC%80%E5%8F%91%E7%9A%84%E7%89%A9%E7%90%86%E8%AE%BE%E8%AE%A1.html
[回复]
joel 回复:
一月 10th, 2012 at 3:54 下午
能否分享下源码供学习下呀?
[回复]
Dante 回复:
一月 10th, 2012 at 3:55 下午
等站完善一些,会考虑开源哈
[回复]
joel 回复:
一月 10th, 2012 at 3:57 下午
主要是想看看学习下数据库部分的, 现在这样就可以,不需要代码太漂亮啦
[回复]
四. MySQL多库表的查询方法
腾讯内部使用MySQL数据库都是分库表的,所以在mysql中想手工查询个数据都会变得非常困难,所以这里放个简单的模板,要用的时候,只要用vim对应生成一下就可以了
我们部门都使用phpMyAdmin,而且对里面的查询语句进行了一个处理。$i这个符号代表分表的情况如(1-9)。在后台默认进行对多个表处理。
仅供参考。
[回复]
呼呼,支持分享~我只能来凑热闹了
[回复]