Category: tech

How to remove/reinstall MySQL

How to remove/reinstall MySQL

For years, remove and reinstall MySQL has been one of the hardest work for me. However, I’ve found a good solution. Based on http://askubuntu.com/questions/763534/cannot-reinstall-mysql-server-after-its-purge and http://askubuntu.com/questions/760724/16-04-upgrade-broke-mysql-server Back up your my.cnf file in /etc/mysql and remove it Remove the folder /etc/mysql/mysql.conf.d/ Verify you don’t have a my.cnf file stashed somewhere else (I did in my home dir!) or in…

Read More Read More

B站官方群和B站的弹幕连接

B站官方群和B站的弹幕连接

【完成!】 稀里哗啦直传反馈群的日常 http://www.bilibili.com/video/av2594921/ 给那些好奇的从B站来的小伙伴们截图     解释一下为什么B站到QQ和QQ到B站都有延迟——   为啥B站到QQ延迟非常大? 因为B站的弹幕都是XML文件,因为B站用户有很多,所以这些文件都要在全世界每一个B站缓存服务器缓存一下,到指定时间再更新。这个时间经常是好几分钟,也就是说有了新弹幕之后需要好长好长时间之后才会反应在弹幕文件里。我这儿每五秒钟抓取一次查看是否有最新的弹幕好能发送到QQ群里,但是也奈何不了B站官方3-4分钟更新一次弹幕文件……所以造成了很多时候B站弹幕到QQ群里需要3-4分钟。 为啥QQ到B站有少量延迟并且有吞消息情况发生? 因为B站只允许间隔至少5秒发一条弹幕,否则会封号。我们已经尽量压缩消息了,但是由于源消息(直接发送弹幕到B站)经常掉节操(因为群里的人一般都没有节操),所以我们改用了类似Base64的“加密”方法防止掉节操。Base64的加密是3个8字节的字符转换为4个6进制的。由于B站一条弹幕最多允许100字节,所以说理论100字节的弹幕最多可以装加密前消息(100/4) * 3 = 75字节。一个汉字3字节,于是乎经常会有消息排队等待发送。为了防止消息过快发送导致账号被封,我们设置的是6秒发送一次弹幕。 另外,若消息队列或发送队列超过100条消息,那么会把前面的50条消息删掉(虽然到现在为止这个情况还没出现过)。 另外,B站的播放器获取最新弹幕使用了TCP,我通过抓包发现(底下有说)这个很不稳定,B站不会给播放器传过来所有的新弹幕(10条新弹幕大概传6-7条左右),所以导致了有的时候QQ上说话发送到B站吞了消息。 综上原因导致了B站到QQ和QQ到B站均有很大的延迟,并且B站端经常吞消息。 希望大家理解吧,毕竟这不是我能控制的——我完全是用B站的协议完成的,若是B站协议不支持那些东西那我也就没有办法……   7月下旬的时候,突然脑洞大开,跟好基机友 B站@多鲁基X铃 突发奇想,想到了一个pipe,来连接B站弹幕和QQ群聊天;让B站弹幕版聊可以同步到QQ群里,QQ群里的聊天也可以同步到B站上。 说干就干。 刚开始就有一个自己写的目前来讲比较稳定的,基于SmartQQ协议的机器人(SmartMiao,在我当初的博客中有提到过)。这个机器人可以根据不同的群来进行不同的操作,并且对不同的请求可以给出不同的回答。最重要的是,支持随时添加Python(当然用C++写Python插件也没问题)编写的模块——这是这个作品最需要的可扩展性。 现在,要对B站开刀了。 首先,先对B站的登录进行模拟。 这个跟当初搞QQ协议比简直是小菜一碟,真是不值得一提…… 再然后,就是B站各种协议的事儿了。 接着抓网页,发现B站是两个东西——一个是avid,另一个是c(omment)id. 抓起来也方便,页面读读就明白了。 再之后,发两条弹幕,看看发送弹幕协议是啥样的。 仍然是那样的,不值得一提…… 总之就是把开发者工具一开开,所有东西就真儿真儿的映现在眼前了……   之后做了一个bilimiao,负责一切后台的东西,可以想象为*nix的Kernel内核层。不是不可以直接访问,而是因为各种各样的原因访问起来不方便。 然后做了个QtoBPipe(负责QQ发过来的消息队列加密和队列,因为B站每次发源数据都会掉节操,毕竟B站Q群里没有什么节操……队列是因为B站只能每5秒发送一次弹幕,否则么……这个号就Byebye了)和BtoQPipe(负责处理B站传过来的消息,查看其发送时间,若大于之前的发送时间则发送到Q群;另,只取最后的最多不超过5条弹幕发送到Q群),负责进行双向的交流——它们都是值守进程,构筑在bilimiao上,作为一个Shell层。 之后就是最上层的SmartMiao的模块了。只要有消息,就会触发发送消息模块发送消息到QtoBPipe进行处理;同时这个模块也隐含了一个模块使其从BtoQPipe获取消息进行处理。这个模块是While True的死循环,并且同时只会有一个存在(通过非阻塞判断是否成功获得锁,若获取成功则为Chosen One进行死循环,若不成功就不是Chosen One退出。换句话说,第一次获取到消息之后的触发的那个程序模块就是Chosen One)。 然后就是你们看到的东西啦~ 两方互相聊(zhuang)天(bi),互相进行友(feng)好(sheng)坦(shui)诚(qi)地交流。   但是呢,有个很严重的问题。 B站的弹幕是有缓存的。 每次从XML获取到弹幕都可能得最多卡住10分钟才能获取到最新的弹幕。 有的时候1分钟,有的时候10分钟,谁受得了啊。 于是乎,开始研究B站黑科技。 通过抓包(说得简单,花了我N个小时找包然后读明白协议,毕竟不知道B站到底发送包到哪个IP里面去了)得出来B站的Flash播放器会使用TCP来跟B站的服务器进行通讯获取最新一条弹幕。 抓来抓去,发现了B站这个更不稳定,经常丢消息。 我看了一眼,10条消息至少能丢3-5条……算了就弃用了,毕竟这个要的是稳定为先。 总之,现在就大概是这样了~…

Read More Read More

票.今天的数据抓取

票.今天的数据抓取

好久没写博客了。 回国了,放假了,也是时候写篇博客散散心了。 作为一个抓取数据的网站,抓取数据是最重要的一个环节。 piao.today是如何做到稳定抓取数据的呢? 余票趋势和实时余票功能 他们抓取数据的难点都分别在哪里呢? 让我们来盘点一下。   首先,说说余票趋势。 余票趋势最重要的是后台抓取,不可避免地需要谈到Worker进程。 本站的抓取分任务分发者和工作者。分发者负责从数据库中查找需要抓取的区间,然后分发给抓取的工作者。 在实践过程中,男性朋友们会遇到worker进程由于控制不当系统问题而提前射x停止工作(被系统莫名kill掉)。 所以,我们需要用crontab来进行一个小脚本,每隔一段时间查看worker数量,若不足则增加worker数量到一个数值。 这些脚本的用途就是用来获取当前运行了多少worker,若不足则重新添加。 因为Python的稳定性(而且作为后台运行的程序来说,只要内存足够,不管多少worker进程都放得下),所以没啥大问题。 但是,最近将实时余票功能升级了一下,改成允许用户抓取多日(预售期)余票(比如),发现服务器经常出现502(Bad Gateway)或者504(Gateway Timeout)错误。 这说明,我的php-fpm和Nginx的设置有问题,没有考虑到大并发和长连接的问题。 如果用户中途关闭了窗口,经常一个fpm进程就会卡在那里不知所措,被水淹没。 那么会导致整个站点因为fpm数量不够而卡死。 现在分散到多个vps上——四个服务器,三个在香港一个在日本,避免了把整个站带坏。 因为这些服务器距离国内都不远,所以抓取实时余票反馈给用户会很快。 以后应该研究一下对于这种情况的根本解决措施。 最近有时间先把筛选搞了吧。 总之吧,先mark下。 等着过两天驾照下来了好好研究研究。

科学上网入门&基本网络知识科普

科学上网入门&基本网络知识科普

科学上网是一个永恒的话题…… 在读本文之前,为了能让您的电脑脱离和谐的环境,请先卸载360危险安全系列软件。 自从第一次接触x片之后,这个问题就一直伴随着我…… 或者说因为有了x片所以导致了我现在成为了一个geek……   言归正传,大概介绍一下各种翻墙技术吧。 目前常见的翻墙技术有:传统的VPN方式(Virtual Personal Network,虚拟个人网络);SOCKS5(比如如今如火如荼的ShadowSocks);GoAgent;https加密等。 如果算上广义的翻墙,也可以选择搞一个国外的服务器当做一个自己的电脑使用,直接远程桌面(有命令行基础的同学也可以使用命令行)到服务器,更安全更放心。 让我来讲讲以上这些东西的异同以及优缺点吧。 G♂F♀W使用以下几种方法让我们的世界和♂谐: (啥?问我什么是GFW?算了洗洗睡吧) 1)DNS劫持/污染; 2)封锁IP; 3)链路层劫持,结果之一为返回虚假RST(Reset)包。 当我们连接到国际互联网时,我们肯定是要走我们的ISP(Internet Service Provider)的。他们给我们提供的互联网服务,所以在经过他们的道路时,他们有能力修改任何我们(本机客户端)和远端(远程服务端)的信息。 为了使上面的概念通俗易懂,我在这儿用一些例子来说明。 DNS的用途是将域名(人类比较好记的,如google.com, baidu.com。可以理解成信箱地址,比如“北京市万寿路27号信箱”)转换成IP地址(比如74.125.224.147,也就是比较难记住的门牌号,比如“北京市房山区XX镇XXX小区X区X号楼X单元XXX室”)。我往这个地址发信之后,准备获取它(服务器)给我回复的信息。GFW的一个功能是DNS劫持,也就是说将“北京市万寿路27号信箱”本来真正的映射地址“北京市房山区XX镇XXX小区X区X号楼X单元XXX室”改为一个并不存在的地方,比如“北京市南开区鞍山新村89号楼64单元”,然后我的电脑因为无法收到对方给我的信息,告诉我“我们无法从这个地方获取到你想要的信息”,这就是DNS劫持。   封锁IP比较好理解,就是禁止发信到指定门牌号,看到就拒收信件。就这么简单。   再说说链路层劫持。假设说我现在投递一封信给美国的朋友。我交给了中国的邮差(中国的ISP),之后中国的邮差会交给美国的邮差(美国的ISP)继续投递。但是,中国的邮差他们的品行素质不是那么好;他们喜欢偷偷拆开我的信,看里面有没有对他们不利的消息。如果里面有不利的消息,那么他们便会给我偷偷篡改掉信件的内容(链路层劫持)然后发给对方,或者告诉我查无此人(发送RST包)。有的时候中国的ISP也会在链路层干一些别的事儿,比如插广告——网络那头的收件人给回信了,这个邮差为了自己的利益于是在信最后加上了别人付费要求他打的广告,最后用户看见的是收件人回信+邮差做的广告。 于是,我们需要一些方法,让中国的邮差无法拆开我们的信件,或者拆开也无法读取:比如说用特殊材料制作信封使其只能用特定的锁打开(加密隧道,如VPN),或者让我们的信件用只有我和收件人知道的方法加密(加密内容,比如ShadowSocks/HTTPS)。   VPN 正如其名虚拟个人网络,其本来目的是为了能够让多个处于不同网络的电脑构成一个局域网,就像这些电脑真正地在同一个路由器下一样,拥有一个局域网IP地址。这个网络算是一个局域网,大家的电脑虽然物理上不在一起,但是他们在网络中是“在一起”的。这个时候,服务器就像家里的路由器一样,用户的一切流量都会从那里走。 于是乎,当用户连上VPN的时候,用户就跟那个服务器处于同一个网段,用户就相当于在国外有一个路由器,用户作为一个客户机属于这个路由器,便翻出去GFW了。本机所有流量都会从这个加密的隧道通过。 但是,GFW毕竟一年拿着不知道多少的经费,这点儿雕虫小技目前也是要完蛋。为了能够让VPN服务器认出来这是VPN,这个发送连接VPN的报文头部会遵循一定的标准(也就是信封遵循一定的标准)。为了不让用户连上VPN,ISP会直接向客户端(我)以及服务端(收件人)发送RST包(邮差告诉我查无此人,告诉远端收件人这封信发件人不寄了,同时欺骗两方)。因为现在的GFW已经能够识别出这种协议,所以导致这种翻墙方法逐渐日渐式微。但是翻墙率也是取决于用户的ISP——如果用户的邮差比较好,可能封都不封,直接该怎么给用户送过去就怎么给送过去(这点电信和联通比较靠谱);但是如果这个邮差就是贱(比如移动),那么看见这个信封立刻就告诉用户收件人查无此人。这个其实也是要看心情的(当前政♂治♀环♂境,比如18大时候就不太靠谱了)   下面让我们看看别的翻墙方法。 首先是最近常用的Shadowsocks(国内已被墙,请翻墙后访问)。这真心是个好东西。它使用的是SOCKS5协议,将支持这个协议的软件的流量转发到远程服务器上。用户可以选择加密方式,而且默认的加密方式是非常安全可靠的(AES-256)。但是这个东西有一个坏处:并不是所有的app都支持这个协议。但是目前无论是Mac版本还是Windows版本的Shadowsocks客户端均支持全局翻墙(其实Mac系统自带本功能,允许全系统的流量均经由SOCKS流向互联网。)但是,不越狱的iOS系统是不能使用全局翻墙的(没有root权限什么都白搭)。 其工作原理大概如下:我在我电脑上开启了一个SOCKS5路由,其功能是将我要发送给远端服务器的内容加密。这个程序将我的内容加密了之后发往远端的翻墙服务器。翻墙服务器进行了解码之后,再继续发送给真正的提供内容的服务器。 通俗一点解释:我有个机器能够帮我加密我要发送的内容。加密后,我将信放入普通的信封里面。邮差一如既往打开信封,但是看见里面东西看不懂,于是乎就重新封回去,交给在可靠位置的(墙外)自己的机器解码。自己的机器解码后将信交给当地邮差继续处理。 因为Shadowsocks没有特征,无法被GFW识别,于是乎成为了大家翻墙的不二之选。GFW对此暂时束手无策,唯一能干的就是限制不认识的包的流量。另外,由于Shadowsocks在本地存的配置文件为明文,所以某些无良厂商(我才不告诉你是奇虎公司的360系列软件呢)会搜索Shadowsocks的配置文件(里面包含服务器IP和密码等敏感信息),然后上报给☭,之后世界就可以和谐了呢~   GoAgent算是一个非常老的翻墙方法了。由于GoAgent很多服务器都是架设在谷歌的云上,而最近谷歌的云又被☭疯掉封掉了,于是GoAgent日渐式微。但是GoAgent其实不光可以架设在谷歌的云上,也可以架设在任何Linux服务器上,所以还是不会死的。其坏处是一般来说只支持指定的软件(比如安装了指定插件的Chrome或者Firefox),并不是所有软件都能支持。   HTTPS加密也是一个加密的方法。有两种方法,分别为访问的网站自己带HTTPS证书;或者是有部分网站会帮助用户抓取然后使用HTTPS协议加密这些东西传到本机上。HTTPS也是一种加密了信件的方法。HTTPS的好处是不容易被封锁(因为HTTPS是一个非常重要的协议,保证网购或者是账号不被链路层的人窃取是非常重要的。很多人连接免费Wi-Fi后各种网上账号被盗的原因之一就是因为这些网页没有https加密。),但是某些网站因为整个网站被禁,所以连不上去。 话说前两天GitHub(世界上最大的代码托管网站)有两个页面被GFW攻击了。这已经不是GitHub第一次被攻击了。上一次GitHub被攻击是使用的https证书中间人攻击,☭伪造了GitHub的https证书,然后进行了劫持。通俗点解释,就是☭假装成一个受信任的加密机器(事实上是一个大骗子,有点儿类似于小红帽里面吃掉了老奶奶的大灰狼说自己是老奶奶),说给用户加密(事实上加密了),但是加密后的内容他们是能够解开的。用户在上面输入了用户名和密码都会被☭截获。同理,iCloud也曾经受到过☭类似的攻击。正常的浏览器(IE/Firefox/Chrome/Safari等)都提示了这个证书不受信任(因为是自颁发证书),而某些无良厂商(我还是不会告诉你是奇虎公司的360危险安全浏览器呢)却告诉用户这个网页是安全的。事实上,我国的CNNIC(互联网主管机构)是有颁发受信任证书的权限的(浏览器里都会有一个列表,里面记载着谁颁发的证书是可信的,也就是白名单制度,除了这个白名单以外的人颁发的证书都被认为是不可信的。CNNIC有颁发受信任证书的权限),但是他们没有使用。GFW的攻击者给自己创造了一个证书,然后进行攻击。如果使用正常浏览器是不会出任何问题的。但是总有人使用360危险安全软件是吧……此事件以后,Chrome等浏览器厂商撤除了CNNIC作为一个可靠的颁发机构的权限。 最近的攻击大概是这样的:链路层劫持,墙外所有访问墙内拥有百度联盟广告(由百度作为广告服务商)的代码中,百度联盟广告代码都会被劫持到GitHub上的两个页面——GreatFire(反审查项目)和NYTimes-CN(纽约时报中文版)。因为墙外有大量中国网民,所以导致GitHub流量暴涨然后服务器无法承受这么大的压力。每一个墙外访问了这些网页的人都成了攻击的一份子。如果你在上网的时候收到了一个窗口提示“WARNING: malicious javascript detected on this domain”,那么你就成为了攻击的一份子(这种攻击叫做DDoS攻击,分布式阻断服务攻击,也就是大量流量洪水一般涌入服务器,导致服务器无法正常应对请求最终瘫痪),因为GFW强制替换了脚本。具体详情可看https://www.v2ex.com/t/179698。 话说GitHub也不是第一次被弄瘫了——上次弄瘫痪是因为中国网民大量去GitHub下载12306抢票插件导致上的人太多了垮掉了……听说这次攻击之前, 说到12306,12306为啥总是提示证书无效呢?原因是他们自己创造了一个颁发机构,而这个机构是不受任何浏览器承认的。他们其实可以从CNNIC拿到很便宜的证书(几十人民币每年,那个时候CNNIC证书还是受到大家承认的),但是懒政思维放在那儿,也就没人愿意干了。 因为https的加密会导致GFW无法识别用户到底是访问敏感网页还是正常网页,所以有的时候GFW会封锁整个域名(比如谷歌就是;之前几年Wikipedia在国内也是,目前https已经解封;GitHub也被整个封锁过,但是因为国内各种大公司和各种开发者用这个用的太多了所以集体对工信部抗议,最后解封) 这个入门知识就讲这么多了。有啥问题么,就留言就好了…… 明天还得两门期中考试呢……以后再写详细点儿……

How to solve MariaDB Plugin ‘unix_socket’ is not loaded problem after upgrade to Ubuntu 15.04

How to solve MariaDB Plugin ‘unix_socket’ is not loaded problem after upgrade to Ubuntu 15.04

——————-Apr 27, 2015 @ 10:45——————- NOTICE!!!! https://bugs.launchpad.net/ubuntu/+source/mariadb-10.0/+bug/1447944/comments/9 said this will cause a problem, which may enables everyone login with root with no password. However, as I tried, access is denied when login without password. So this should not be a problem. After using the script, please try mysql -uroot, and if you can login into mysql with…

Read More Read More