垃圾邮件的“进步” | Advance of Spam Mail

2017-07-07 作者:

#A seems-quite-tech-oriented spam mail, as precise strike, from fake addr geofferygreener@gmail.com, but really sent by geoffreygreener946@gmail.com.

收到这么一封邮件,大概瞟了一眼,随手删了

然后不依不饶又给我回了一封,引起了我兴趣

我心说“可以啊,够用心啊”,BOA高管这么瞧得起小弟。。。

不仅告诉我是Linkedin找到我,还是精准打击,不是脚本群发呀

更为关键的一点,这个email地址可信度很高,域名是原装gmail,名字后没有杂七杂八。

如果不是benefit both families而是both business的话,没准哥就着了道呢?

好吧,看看详情 – 

原创文章,转载请注明链接: 垃圾邮件的“进步” | Advance of Spam Mail(注:本站图像可单击浏览大图)

完整阅读本篇»

Python Thread Pool传参只一个怎么破?

2017-06-09 作者:

作为批量化操作的method,map比apply要方便简洁一些,至少不用for循环一堆东西
【注1】apply现已不用,因为实际使用基本等价于单进程操作
【注2】至于map之于map_async,及apply之于apply_async,是另外一个话题,可以参考这里
回到之前的话题,apply传参 – 可以清晰的看到,apply可以随意带args,多少个都没关系

#格式: apply(func[, args[, kwds]])
#比如
pool.apply(func=f, args=(20,30,))

而map传参 – 函数f只允许带一个参数,就是iterable里可以迭代的list
#格式: map(func, iterable[, chunksize])
#比如
pool.map(func=f, iterable=[1,2,3])

那么我们如何保留map这样的代码简洁性,同时也可以传多个参数呢?
这就用到了partial,把函数的定参放在partial内去传,变参依然iterable – 至少不需要把定参做成全局变量直接传给insert_and_process函数了
【注】对python2而言,partial只在2.7版本后支持 – 关于partial的说明在这里
from multiprocessing.dummy import Pool
from functools import partial

def insert_and_process((file_to_process,db)):
    db.table.insert(**parse_file(file_to_process))
    return True

if __name__=="__main__":
    file_list=os.listdir(".")
    db = DAL("path_to_mysql" + db)
    P = Pool(processes=4)
    P.map(partial(insert_and_process, db=db), file_list) #定参放在partial内,变参按照map标准写法去传
    P.close()
    P.join()
    print 'Done.'

有的同学可能要问 –
Q: 那如果两个(或多个)参数都是变参呢?
A: 开动一下脑筋吧 – 一起打进iterable里可好?
Q: 如果变参B与A不具备同样的iterable特性呢?
A: 擦的咧 – 那还map个毛啊。。。

原创文章,转载请注明链接: Python Thread Pool传参只一个怎么破?(注:本站图像可单击浏览大图)

完整阅读本篇»

CentOS 6.x安装新版RabbitMQ

2017-04-06 作者:

看了大半天的文章,尝试各种build(erlang,RabbitMQ),不是build不通,就是依赖不对,或者启动服务失败

完全用CentOS 6.x的默认吧,erlang是R14,RMQ版本是3.1.5,未免太老了

如何是好呢?

其实RabbitMQ官网提供了免依赖的erlang安装包,位于http://www.rabbitmq.com/releases/erlang/

wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm 
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el7.noarch.rpm 
yum localinstall erlang-19.0.4-1.el6.x86_64.rpm 
yum localinstall rabbitmq-server-3.6.9-1.el7.noarch.rpm

我是用马云家的CentOS镜像yum update到最新做的

安装完成后
使用6.x最常用的service rabbitmq-server start即可启动服务

rabbitmqctl  add_user userNew passNew
rabbitmqctl  set_user_tags  userNew  administrator
rabbitmqctl list_users

然后就可以使用userNew登入

http://公网IP:15672/

对MQ进行管理了

同时官网的hello world代码做简单更改,就可以在本地使用公网端MQ进行通信

credentials = pika.PlainCredentials('userNew', 'passNew') 
connection = pika.BlockingConnection(pika.ConnectionParameters('公网IP',5672,'/',credentials))

打完收工

原创文章,转载请注明链接: CentOS 6.x安装新版RabbitMQ(注:本站图像可单击浏览大图)

完整阅读本篇»

微信公号调试遇到Nginx错误499 | Nginx Code 499 on Wechat OAuth debugging

2017-01-25 作者:

最近弄了个公号测试号,尝试一下腾讯OAuth,用的还是习惯的nginx+uwsgi+flask

注意【开放平台】和【公众平台】的OAuth有差别,跳转的auth地址,及scope都是不同的;前者主要用于浏览器app(微信内置浏览器也可兼容),后者跟公众号绑定的更紧密(不关注不能auth)

这货调试蛮坑的 –

  • 首先得有公网IP,这个简单,买个按小时付费的美团云(阿里云)就行,1核1G,不要数据盘,带宽1M;一个小时0.1元多一点,一天也不到3块钱,不需要了随时可删。
  • (带备案)域名一个。这个有点难度,买云主机备案不要钱,但两周时间等的着实有点心焦。如果有现成域名,可以开个二级域名(端口依然要80),nginx转发一下,这样也是ok的。

木有用域名的时候,我尝试直接用云主机ip接测试号,一共有3处配置,都配了IP(而非域名)

  • 接口配置信息
  • JS安全域名
  • OAuth授权回调域名(关键)

但实际在微信浏览器中访问时,页面无法正常展示,这个提示很关键(转换成手机预览模式)

于是在OAuth的过程中,uwsgi经常报如下错误(而且还是在auth成功之后):

500ms的请求不算慢啊,为啥会broken pipe呢?

并且明显uwsgi返回了code 200,请求没啥问题噻?

Wed Jan 25 16:54:43 2017 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 (ip 103.37.140.18) !!! 
Wed Jan 25 16:54:43 2017 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 296] during GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 (103.37.140.18) 
IOError: write error 
[pid: 24226|app: 0|req: 11/19] 103.37.140.18 () {38 vars in 892 bytes} [Wed Jan 25 16:54:42 2017] GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 => generated 0 bytes in 468 msecs (HTTP/1.1 200) 3 headers in 0 bytes (0 switches on core 0)

开始时,丈二和尚摸不着头脑,鉴于uwsgi是nginx的upstream,那就找一下nginx看人家说啥呗

一看不要紧,同一个请求,nginx code是499;google后,表明499是“客户端主动关闭连接”,那么uwsgi送给nginx的200自然木有什么卵用了 – 客户端不要了

而且这一条log是在access.log而非error.log,说明nginx并木有怪罪uwsgi

103.37.140.18 - - [25/Jan/2017:16:54:43 +0800] "GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.9 TBS/036903 Safari/537.36 MicroMessenger/6.5.3.980 NetType/WIFI Language/zh_CN" "-"

who to blame right now?

我开始怀疑没有域名导致的转码,找了一个备案后没用过的域名,指向这个ip,不到一分钟就生效了

然后把测试号那三处配置都改成域名,再试。。。搞定了,同一个链接,uwsgi和nginx log都是code 200.

123.151.38.94 - - [25/Jan/2017:21:17:02 +0800] "GET /qrScanToTemplateMsg/6?code=0011MCQf1s8UTv0ZMHTf1CcRQf11MCQ3&state=1 HTTP/1.1" 200 480 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.9 TBS/036903 Safari/537.36 MicroMessenger/6.5.3.980 NetType/WIFI Language/zh_CN" "120.221.74.188"

同时网页访问也展示正常了,不需要什么“转换成手机预览模式”(截图就不贴了)。

究其本质,这个nginx code# 499(以及uwsgi的broken pipe),也即客户端主动断开连接,就是ip访问状态下,微信浏览器为了安全防护,拒绝直接渲染前端页面造成的。

原创文章,转载请注明链接: 微信公号调试遇到Nginx错误499 | Nginx Code 499 on Wechat OAuth debugging(注:本站图像可单击浏览大图)

完整阅读本篇»

让树莓派用上移动LTE | RaspberryPi Connect TD LTE

2016-02-18 作者:

很多人用树莓派接联通3G(WCDMA),这样的话,E261量很大很足

还有电信网络(CDMA2K),可以用EC122

可是移动3G/LTE,google找不到相关资料

其实huawei的USB adapter基本都复用了ID,所以基本上只要能买到华为的货,支持哪家的网都不是问题(甚至不需要升级usbmodeswitch版本,不需要自己build代码)

Fisherworks选了E3276s-861,为数不多的支持移动TD 2G/3G/4G/LTE的卡

注意不要随便选那种号称3网的usb卡,对移动的支持恐怕只限于2600MHz,1900不覆盖,到二三线地区估计够呛


 

树莓派wheezy/jessie系统,使用sudo apt-get install ppp usb-modeswitch来安装关键的usb-modeswitch,还有sakis3g/umtskeeper(这个就不写怎么装了,一搜一大把)

随便找一个接联通E261的教程就行,要改的有以下两点~

  1. 设备ID,E261被usbmodeswitch切换过ID后是12d1:1346,而E3276s-861切换后是12d1:1506
  2. CUSTOM_APN,联通是3gnet,移动是cmnet

然后就没有然后了,拨号接通享受网络

pic

 

原创文章,转载请注明链接: 让树莓派用上移动LTE | RaspberryPi Connect TD LTE(注:本站图像可单击浏览大图)

完整阅读本篇»