前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做) 这篇还是一些技术的整理,主要是用于备忘,大家如果觉得太简单就一笑而过啦~
一. python通过图片内容判断图片类型
前段时间写了一个小站练手,http://xiangshuguo.com,一个支持自由上传的图片小站。 因为要限制上传图片的格式,所以要做文件类型检测,代码如下:
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)
我直接举一个例子吧
stringstream ss; int x; ss << "190"; ss >> x; cout << x;
这个代码是没有问题的,结果会是:
190
如下的代码:
stringstream ss; string x; ss << "190"; ss >> x; cout << x;
也是没有问题的,输出也是:
190
然而这样的代码:
stringstream ss; string x; ss << "x y z"; ss >> x; cout << x;
输出将会是:
x
好吧,看了文档才发现,当 stringstream将数据导出到一个字符串变量时,它会用空格分割。 但说实话,同一个操作符,意义却不一样,这真挺让人纠结。。
三. stringstream使用陷阱(2)
如果你习惯了C分割的atoi直接将空字符串转成0,那么用stringstream时,千万不要做这种事情,因为如下代码:
stringstream ss; int x; ss << ""; ss >> x; cout << x;
输出将并不一定是0。
四. MySQL多库表的查询方法
腾讯内部使用MySQL数据库都是分库表的,所以在mysql中想手工查询个数据都会变得非常困难,所以这里放个简单的模板,要用的时候,只要用vim对应生成一下就可以了
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操作之前先执行如下备份语句:
create backup.tablename as select * from dbname.tablename where id = 90000; delete from dbname.tablename where id = 90000;
恢复语句:
insert into dbname.tablename select * from backup.tablename;
还有一个习惯, 如果确信自己删的数据只有一条 加个 limit 1 OK,就这样
依云 on #
呃,第一个,我直接调用 file 命令的~
Reply
Dante on #
哈,我就知道发出来是有好处的,依云详细说说说?
Reply
依云 on #
不说,只贴链接 :-P
https://github.com/Vim-cn/elimage/blob/master/main.py#L30
Reply
Dante on #
咦,这个貌似是通过文件名来区分的?这个不太安全吧?
Reply
依云 on #
后边上传时是通过文件名区分的,浏览器访问时是用 file 命令检测的。所以,这里不仅可以上传图片,还可以上传其它东西哦~
记得标记过 FIXME 还是 TODO 的,不过我觉得这样方便啊。
Reply
wujiwh on #
Tested! 我上传了一张Vim_command,很不错的小站,简洁,实用!但是垃圾图片的自动清理也是个问题吧
Reply
Dante on #
哈哈,看到了~~
嗯呢,我也在考虑怎么保证自由的情况下又能减少垃圾。。
Reply
IceQ on #
问下博主 “如果确信自己删的数据只有一条 加个 limit 1” 这种做法有什么依据? 我只是去测试了下查询时间 发现加了貌似还变慢了 求解~
Reply
Dante on #
这个只是为了防止误删多条哈,没别的意思哈
Reply
Zind on #
1. stringstream 使用陷阱 (1)
那个应该不是 stringstream 的问题,而是输入操作符 >> 的问题:
用输入操作符 >> 写 string 对象时,空白字符('' '\t' '\n')将会被忽略
2. stringstream 使用陷阱 (2)
stringstream 是流类型,比较特殊,使用时确实不容易把握
但是,string 类型(即便为空)貌似不能转化为 int 类型使用吧?
下面的用法非法:
<pre lang="cpp">
cout << static_cast(string("hello, vimer!")) << endl;
cout << static_cast(string("")) << endl;
cout << static_cast(string("190")) << endl;
</pre>
Reply
Zind on #
被转义了,再试一次:
<pre lang="cpp" line="1">
cout << static_cast(string("hello, vimer!")) << endl;
cout << static_cast(string("")) << endl;
cout << static_cast(string("190")) << endl;
</pre>
Reply
Dante on #
嗯? 我没有用string直接转int呀,我是用stringstream在转~
Reply
joel on #
图片小站也是用的bottle吗?
Reply
Dante on #
对滴~ 哈哈
结构基本就是这篇文章分享的:
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
Reply
joel on #
能否分享下源码供学习下呀?
Reply
Dante on #
等站完善一些,会考虑开源哈
Reply
joel on #
主要是想看看学习下数据库部分的, 现在这样就可以,不需要代码太漂亮啦
Reply
zhuizhuziwo on #
四. MySQL多库表的查询方法
腾讯内部使用MySQL数据库都是分库表的,所以在mysql中想手工查询个数据都会变得非常困难,所以这里放个简单的模板,要用的时候,只要用vim对应生成一下就可以了
我们部门都使用phpMyAdmin,而且对里面的查询语句进行了一个处理。$i这个符号代表分表的情况如(1-9)。在后台默认进行对多个表处理。
仅供参考。
Reply
moper on #
呼呼,支持分享~我只能来凑热闹了
Reply