在centos上从源码安装python

在服务器上使用pip安装scrapy的时候,由于自己的用户对/usr/lib的目录没有写权限而安装不成功。然而服务器的root权限不能拿到,申请安装软件特别麻烦。 于是从源码安装python,使用 ./configure --prefix=/your-path 可以安装python到自定义目录,(由于python默认安装的位置是没有写权限的) 执行make一切正常,接着执行make install的时候报错。 zipimport.ZipImportError: can't decompress data; zlib not available 因为是缺少zlib的库函数,因为系统库的目录没有写权限,也只能把安装库函数也自定义的目录,安装完成后修改Modules/Setup文件中: #zlib zlibmodule.c -I$

anyproxy的docker化

由于项目上的需要,需要抓包分析app的请求的url特征,因而就需要在手机上配置代理服务器,项目组的同事一直都是使用fiddle或者wireshark来分析app的请求url,代理服务器则是使用带有无线网卡的电脑提供热点来作为代理服务器或者监听网关。 这种模式需要每个同事都要有安装配置一套环境,会有很多的不便。经过查找资料,得知anyproxy能够满足抓取app的请求url的需求,但是目前anyproxy无法区分多台使用anyproxy代理的设备,无法多个设备使用同一个anyproxy代理服务器。 docker可以很方便的把不同的进程隔离,可以快速的启动不同的代理服务器,于是决定使用docker起多个anyproxy代理服务器的实例。 anyproxy的docker化中遇到了不少问题,这里做个记录: 首先找到一个anyproxy-docker 使用命令 docker run -d --name anyproxy -p "8001:8001" -p "8002:8002"

使用netty构建http服务器

近期需要对得到的搜索关键词做敏感词过滤,本来的想法是自己通过建立敏感词库,然后通过本地词库的匹配来实现,但是查询的效率上不好保证,通过在网上查询找到海鸥api可以实现,由于是在公网上查询,并且查询量也比较大,就考虑把查询过的敏感词存储到hbase中,下次查询如果在hbase中命中的话,就不用频繁调用api去查询了。 使用netty作为服务端接受传递的字符串,首先去hbase中查询,如果命中,直接返回包含敏感词,如果hbase中没有命中,就调用海鸥的接口查询,返回不包含敏感词就返回不包含敏感词,如果返回包含敏感词,解析返回的结果把敏感词存储到hbase中,返回包含敏感词。 在使用netty的过程中,遇到了不少的问题,netty是比较通用的框架,底层使用异步事件处理模型,作为http服务器的时候也只是在channel中添加一个HttpServerCodec的编解码包。 还可以添加自定义的handler来处理request请求,然后根据request中的url来分别处理并且返回response,但是习惯了使用spring开发接口服务,对于使用netty怎么实现类似spring的MVC结构不清楚,开发起来还是很别扭的,这个业务的逻辑比较简单,也只是对外提供一个接口,所以直接就在一个handler中处理了,

angularjs传递json形式参数的问题

在使用angularjs内置的$http的服务时,在js中还是像往常使用jquery的$.ajax的方式在data中放置json对象发送到后台的时候,在spring controller的方法中接收不到js传递过来的参数。 通过查询资料得知,使用$.ajax方法向后台发送请求的时候使用的Content-Type是application/x-www-form-urlencoded;charset=utf-8,然而angularjs的$http请求使用的Content-Type是application/json;charset=utf-8,因此在controller中使用HttpRequestServlet中的request.getParam方法的使用获取不到传递的参数。 有两种方法可以解决这个问题: 通过修改$http服务的配置,使它的Content-Type是application/x-www-form-urlencoded;charset=utf-8 可以通过$httpProvider.defaults.headers.post['Content-Type'] ='application/

spring web项目乱码问题的解决

最近又一次做起了web项目,体验和之前在去年做web项目的时候的感觉是完全不一样的,之前都是在别人搭好的框架上做简单的修改,遇到问题的时候也是直接参照别人的东西修改,对为什么要这么修改不是很明白。 这次的web项目从前台到后台都是自己参照网上的教程一步步搭建起来的,后台使用了spring和mybatis,前端整合了requirejs和angularjs。 在项目框架搭建的过程中遇到的乱码问题主要有下面几个: 1.使用jsp:include指令的使用,include进来的文件显示乱码,这个需要在web.xml中配置 <jsp-config> <jsp-property-group> <url-pattern>*.html</url-pattern> <page-encoding>UTF-8<

httpclinet在多线程中使用的注意事项

在mapreduce中的reduce阶段使用httpclient发送http请求,之前使用的方式是在执行execute的时候绑定ResponseHandler,在handle里面只返回http status code,程序能够正常运行。 由于提供接口的服务商的性能问题导致请求频繁的时候,系统会返回500错误,但是只返回http status code的话,对方说不能定位错误,必须把返回的错误信息记录下来,所以就修改了http的execute的调用方式,没有绑定responsehandler,在mapreduce运行中,出现了如下的错误: Error: java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the

把域名从godaddy转移到namesilo

由于godaddy在域名安全保护上的不作为,也看了一些在godaddy上的域名被盗的事情,虽然我的域名不是什么抢手的,但是也不希望自己暴露在危险之中。 namecheap不支持支付宝付款,所以选择了namesilo,并且whois privacy也是免费的,按照namesilo的说明,很方便就把域名转移到namesilo中了。整个过程也很顺利。 之前看到@N的域名被盗事情,主要还是使用了自定义的域名邮箱,导致邮箱收不到邮件错过了找回域名的时机,选择gmail是最好的。至少邮箱安全还是有保障的,虽然说使用有些困难。

hadoop client查看mapred job日志的命令

由于hadoop的集群的管理权限不在我手里,没有办法直接在集群上查看mapred的日志文件,之前都是联系集群的管理员让他们手动把散布在不同的datanode上的userlogs文件中的日志copy出来,沟通起来很不方便。 一直就这样忍受着,在网上搜索也没有什么结果,但是这两天在命令行中通过提示的时候突然发现有yarn这个命令可以使用,联想到可以使用mapred命令查看job的相关信息,那么是不是通过yarn就可以得到我想要的日志信息呢。 通过yarn的help命令发现是有logs这个子命令的,运行一个job后,通过命令: yarn logs -applicationId appId 就可以得到运行时的日志

使用命令行模拟maven打包

最近和电信有一个合作的项目。所有得运行环境都必须在电信的一个内部网络环境中运行,这个内部的网络环境是和外网隔离的,操作都是通过一个堡垒机跳转进去,上传文件什么的都非常困难。 本来hadoop的运行是可以通过-libjars指定第三方依赖包,但是在电信的hadoop集群上不能够成功运行。所以每次都只能使用maven打成依赖包上传到环境上执行。 后来我就想着看看maven打包的过程都做了什么,仿照maven的执行过程写一个shell脚本就行了。通过在本地执行maven打包命令的时候打印出debug信息就看到所有的过程。 maven打包的过程(目录结构符合maven的目录结构): 首先把resources目录中所有文件和文件夹copy到将来要打包的classes文件夹中。 编译java文件夹中所有的java文件(自定义mainfest.mf)到classes文件夹中 解压所有的依赖jar包中的class文件到classes文件夹中 4.把classes文件夹打成jar包就行了。 很多时候太依赖工具的话,就会忘了最原始也是最有效的方法。遇到问题的时候不能太惧怕去刨根问底的去理解最基本的实现。 2015-06-02 update 这两天发现使用-libjars不生效的原因可能是使用ToolRunner的时候需要指定configuration。类似 ToolRunner.run(conf, new StatisticsKeyWordsNums(

hbase的一次故障恢复经历

使用hbase有一段时间了,期间经历过几次集群下线的情况,因为刚开始接触,对hbase集群的理解也不够深刻,每次宕机都直接把剩余的hbase进程kill掉,然后直接重新启动集群,一直没有注意到集群运行状态和重启的过程。 用了一段时间之后,我发现在master的管理界面上看到有个表的regions数目很多天都没有发生变化,一直都是8192,按照我的理解,每个region的file.maxSize设置的是128M,如果一直向hbase集群中存储数据的话,数据量增大的情况下,regions的数目是应该会增大的。刚开始想着是hbase集群的每个表的最大regions数目就是8192,担心新增加的数据会把原来存储的数据挤掉。 通过查询网上的资料,有些文章推荐把region的file.maxSize设置大一些,这样regions的数目应该会减少。然后我就参考网上的资料,把region的file.maxSize设置为1G,并且对regionserver的jvm的参数调整了一下。调整完成后重启集群之后,也没有观察集群的运行日志,运行不长时间后,集群中regionserver相继下线。查看regionserver的日志发现和zookeeper建立session之后,集群就下线。 2015-03-18

linux 防火墙的一些误区

昨天线上的服务器由于遭到病毒的入侵,狂往外发包。在服务商的协助下把病毒清除了一下,服务商说最好是把防火墙打开,但是由于对iptables防火墙的理解上有错误,就想着直接把output规则设置为drop。但是因为这个原因导致ssh再也连接不上了。 因为我一直以为只要把input的ssh端口允许通过就没问题了,但是忽略了ssh通信也是交互的。如果output的默认规则是drop的话。必须把到ssh目的端口的打开。 后来终于把防火墙配置好了,但是由于要搭建hadoop集群。安装的时候都说要把防火墙禁用。我就有想当然了,以为iptables -F命令就能把防火墙禁用,但是悲剧的是,ssh连接又断了,后来想想是因为默认的input规则是drop,如果只是iptables -F的话只是把里面的例外规则全部清除了,防火墙并没有关闭。导致有一次让服务商去重启了服务器。 一天就因为防火墙的问题,让服务商重启了两次电脑,自己都觉得有些不好意思,还好那边的人还是比较配合的。谨记下次在自己的服务器上先进行相同的操作。确认无误后再在生产环境上部署,对于不熟悉的知识,不能在武断了,要实践,

通过自定义flume插件读取systcp类型数据中的protobuf格式消息

由于项目中有大量的日志数据需要收集,并且后续需要对日志进行进一步的分析,考虑使用flume进行日志采集,存储到hdfs和hbase上用于后续的分析。 flume自带的有spool、systcp、exec等source类型,刚开始调试的使用。发现日志源通过systcp方式发送到flume的时候,接受不到数据,通过排查得知,日志源产生的日志格式是protobuf格式的。 为了减少日志生产者的响应时间,不能让日志生产者把protobuf格式转换为普通文本方式传输,同时使用protobuf的目的就是跨语言的序列化,和json相比具有文件小等优点,所以就考虑自定义flume的source类型,在得到tcp数据后通过protobuf的解码器对得到的byte数组就行解码,然后封装成flume需要的Event格式。 在此过程中犯了一个很严重的问题,因为日志的产生是由另外一个同事实现的,是用c++封装的protobuf格式,让他提供了一个产生测试数据的测试程序,但是接收到的数据,用protobuf解码器解码的时候,总是报错,说是包含不合法的。不管怎么测试都是报错,我就一直在查看flume中使用的netty获取tcp数据是否不完整的原因,但是一直没有找到netty是如何对获取的数据分段的设置。按说netty获取tcp socket数据应该就是客户端发送一次就会接受一次,

网站被别人恶意绑定了

今天查看nginx的错误日志的时候,发现有个陌生的域名zephor.cn居然是指向我的ip地址的。这样通过这个域名就能访问我的网站内容了,虽说我的网站流量少,只是自己折腾用的,但是也不能让别人恶意绑定域名。 由于之前没有遇到过这种情况,通过搜索得知这就是恶意绑定域名,可以通过修改配置文件解决这种问题,通过nginx的空主机跳转或者空主机拒绝服务来解决。 在nginx的配置文件nginx.conf的server段添加如下内容就可以解决这个问题。 server { listen 80 default; server_name _; return 500; } 或者 server { listen 80 default; server_name _; rewrite ^(.*) yourdomian permanent; } EOF

配置了本博客的发送邮件设置

这两天把博客所在的VPS重新装了一个系统,主要原因是主机商说他们升级了系统,可以使用vnc连接主机,而我的主机安装的系统比较旧,然后我就满心欢喜的把操作系统重新安装了,然后发现vnc还是不能用,有的时候真的是不能太信别人的话。 由于重新安装了操作系统,原来安装的软件都没有了,又是费了不少时间把需要用的软件重新安装了一遍,之前git server一直都是使用gitolite,也没有安装相应的web管理端,趁这个机会,把git server换成了gitlab(有人说不是万能的github吗,但是我就是不折腾会死星人,没有办法的)。但是在这其中又是踩了许多的坑,都是那种走不出来的坑。 为了彰显不折腾会死星人的本性,那是必须对gitlab官方提供的omnibus-gitlab看都不能一样的(我承认我错了),于是乎对照着官方提供的英文文档(这点能力还是有的)一步一步的操作,以为能够很顺利的完成的时候,发现启动的时候连接不上redis的socket连接,明明是按照教程来的,但是死活就是不能成功启动,面对rails on

准备使用mean框架搭建一个自用的视频下载站

有的时候会想下载一些视频,都需要登录到vps上调用脚本下载,下载完之后还要通过ssh远程下载,这样感觉效率很低下的,总是找不到想要做的东西,所以想拿这个练练手。 自己一直都想使用nodejs做一些东西,但是一直以来都没有动力,就是没有强烈的需求。任何事情都是从一点一滴做起的。准备使用nodejs很火的web框架mean(mongodb + express + angularjs + node)做一套下载管理网站,在这个过程应该会遇到很多的问题,在解决问题的过程中,应该在nodejs方面会有一些进步吧

工作两周年感想

最近一直都在念叨着,这马上就工作两周年了,是不是要写些东西,算是对自己这一年来的经历的回忆。今天翻到邮箱里还留着入职的相关事宜的邮件“”在2012年的8月3号早上9点半到公司办理入职事宜“,嗯,是的,整整两年了,怎么还没有一点感觉呢,就两年了,人生就是这样吧,还没感觉呢,不是已经到了三十岁了么。 又看了去年这个时候的日志,这一年来,进步还是有的,其实这就很值得欣慰了呢,我是在成长的,不论是在技术能力上还是心态上,已经很满足了,现在的心态和去年已经不一样了,少了一些无谓的担忧,多了一些实实在在的努力,并且能够有危机感。 这一年,收获还是很多的, 从天津封闭开发归来,自己从一个技术白痴到能够自己做一些功能实现了,这就是最大的成长,自己在技术的道路上已经开始一步步前进了,作为一个码农,甚感欣慰。

JMS-ActiveMQ

最近要使用ActiveMQ做消息队列,由于之前对JMS没有一点了解,对于JMS的使用场景也不是很清楚,由于目前项目中的业务都不明确,也不是很清楚ActiveMQ到底有什么用。 按我自己的理解就是不同的系统之间要进行信息交互,而这些信息又没有时效性的要求。比如在线商城的下订单的行动,客户付款之后对于这个订单还是有很多的后续流程要进行,但是这个流程又不能是同步的,这类问题就是可以用消息队列来实现的。 之前我理解的activeMQ是用于取代类似本来要通过数据库交换信息的想法是不准确的,因为还要有持久化的问题,到底是用queue还是用topic类型也不明确。 ActiveMQ只是JMS的一个实现,主要作用就是用来发送消息的,跟具体的业务逻辑没有什么关系。 如果要通过集群来解决单点故障的问题的话,就要考虑每个broker之间如何共享消息,保证生产者的消息都能够被消费者消费的问题。 ActiveMQ的集群 Shared File System Master Slave JDBC Master Slave 动手实践篇 看了两天的理论之后,对于activeMQ的应用场景和基本理论有了大概的了解,深入的东西还是不太懂,

做错了事就要付出代价

自己判断出现错误的时候,就要勇敢的承担起自己应该负的责任,不管什么损失都要接受,只能说是吃一堑,长一智,以后考虑问题的时候要考虑的更加的全面的吧,不能只是看到一点点好处就贸然的行动,很多的事都是只有自己亲身体会之后才会发现不好,要么及时抽身,要么继续忍受。 发现在错误的道路的时候,最明智的做法是及时折回,重新走上正规,而不是去计较以往的得失,眼睛向前看。