linux下latex中文配置小记

好久没有更新blog了,又得开始啦,不然传不习乎都忘记了。这里主要记录下vim下配置latex的一些经过,整个过程还是比较快可以上手的。 这里没有去手动下载安装texlive2015,而是采取直接apt安装。 Read on →




sqoop导出hive数据到mysql

现为apache项目的sqoop是原来是一款hadoop第三方开源模块,通过使用sqoop可以使进行hadoop(hive)的数据与传统关系型数据库(mysql、pgsql)交互。可以把关系型数据库导入hdfs,也可以把hdfs的数据导入关系型数据库。这里我用实例记录的方式讲一下怎么通过它把hive中的数据导入到mysql结果表中。 Read on →


hiveserver2的maven配置,使用cdh版本

hadoop2.0下开发软件我目前主要采用maven做项目构建管理,但要注意要使生产环境的版本和开发的版本一致。可以做的就是先了解生产环境的版本,然后给自己的软件指定相同的版本,避免兼容问题的发生。以下是方法记录。 Read on →



编译cdh47下hive的contrib源码

进入hive的src/contrib目录,开始编译,提示需要这几个包得加到classpath中

1
2
/home/hadoop/software/hadoop-2.0.0-cdh4.7.0/share/hadoop/common/hadoop-common-2.0.0-cdh4.7.0.jar
/home/hadoop/software/hadoop-2.0.0-cdh4.7.0/share/hadoop/mapreduce1/hadoop-core-2.0.0-mr1-cdh4.7.0.jar
Read on →


hadoop2.x本地库安装

运行hadoop cli时会出现

14/07/25 14:45:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...

using builtin-java classes where applicable

虽然表面上看来不影响工作结果,但是放着警告不处理太不科学了,想办法解决,过程还是比较漫长,要解决的要有耐心看下文了。 Read on →


zookeeper伪分布配置安装

场景

我的开发机是在vmware的centos6.5上搭建了一个hadoop节点来做开发,现在想在项目中加入zookeeper做HA的功能(一个leader,多个follower),一开始想到的是再搞一台机器实现完全分布,为了一个zookeeper其实不用再搞一台机器节省资源,后来考虑了下其实还有个伪分布的概念,所谓伪分布就是在一台机器上启动多个实例。下文详细描述如何在一台机器上启动多个zookeeper实例实现伪分布zk集群。

Read on →


centos7配置静态IP

centos7按照初始安装时候的developer类型一路装好,在vmware里已经设置为bridge模式,按理说是会自动按照DHCP联网成功的,结果却发现连网卡都没有激活,这里记录下。

Read on →

rrdtool的socket通讯接口rrdsrv

原来以为rrdtool只是个本地数据库,这次写java程序看了几个rrdtool的java实现的源码,在其中一款中发现原来rrdtool居然还支持inetd超级服务器的用法,也就是rrdsrv。以下以freebsd下rrdsrv的配置为例,介绍使用方法:

Read on →

mysql复制同步修复工具

采用mysql双主同步这种架构时要格外注意数据同步的问题,如果没有解决好不同步的问题,那就像《网站运维:保持数据实时的秘技》中提到的,简直就是期待数据不同步。所以对于实际使用过程中还是要紧密监控,对于数据不同步的状况,需要及时报警和处理,不然就等着数据异常吧!下文是主从同步的修复,主主的修复,只要把另外一个主看成从,互相修一下就可以了,见下文:

Read on →

mysql主主配置

由于在项目中使用采用mysql的双master来实现关系型数据库的HA,以下配置的步骤记录一遍。

Read on →


freebsd和linux上安装中文字体

使用中文字体及其安装

首先说明,因为需要在不同的平台下让rrdtool显示的图片看起来舒服点,考虑安装中文字体。这里搜罗下方法。(这种方式仅仅是为了程序工作正常,需要使自己的KDE或者GNOME系统中文显示正常可以不用看本文了。) Read on →



maven使用小记

介绍

maven是java的一个比较有名的项目构建工具,类似的工具还有ant、gradle等,采用vim+maven构建java项目需要了解maven的基本操作,以下是项目收集到的一些使用套路和细节注意点。

Read on →

git分支学习

主要学习的内容:git默认分支是什么,如何创建分支,如何查看所有分支,如何查看当前分支,如何提交分支,如何切换到分支,以下简单给出答案: Read on →




win7下cocos2d-js3.0 alpha生成android项目

折腾了比较长的时间,主要是从cocos2d-html5入门开始做demo,然后到jsb的部分,发现走不通,于是又去研究了cocos2d-x3.0 v3.0 rc0如何生成android项目,发现发布是可以的,但是安装到模拟器又是闪退。花了两三天时间(间断)终于完成,放这里共享下。

Read on →

使用CocoStudio创建骨骼动画(二)

上次的《使用CocoStudio创建骨骼动画》讨论到了如何创建骨骼和绑定骨骼关系,这节开始谈怎么创建帧动画。

我把上次的每个图层命名成每个骨骼后,更新后的:<a href=”http://pan.baidu.com/s/1mg0UXJi” target=_blank>工作cocostudio源文件下载</a>

Read on →





导入nginx日志并采用hive进行统计

公司的日志本来是存成gzip或bz2格式直接导入到hdfs里去然后用程序直接mr的,速度是比较慢的。领导要求采用hive来计算,而在hive里建textfile表的这种方式,textfile是无法进行并行计算的,而且gzip和bz2做mr的速度是很慢的。所以准备采取先导入hdfs和textfile表,然后再转换为rcfile格式的表的策略。实际试验下来,如果一开始转换为文本或者是lzo格式,而不是采用gzip或bz2的格式的textfile的表,再转换为rcfile的方式会快很多,mr的速度也是比较快的。

下面描述一下过程 Read on →


centos下hadoop0.20的LZO压缩支持

首先安装lzo库

1
2
3
4
5
6
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz
tar xzf lzo-2.04.tar.gz
cd lzo-2.04
./configure --enable-shared
make
sudo make install

安装完成后拷贝/usr/local/lib目录下的lzo库文件到/usr/lib(32位平台)或者/usr/lib64(64位平台)

Read on →

hadoop报错:Incompatible namespaceIDs

今天在修改hadoop主机名重新格式化namenode之后,重新启动hadoop,发现datanode无法启动起来。

报错:HADOOP报错 Incompatible namespaceIDs

查看报告发现没有启动一个datanode Read on →


hive初试–导入数据和查询

hive虽然是基于hadoop的map/reduce进行云计算,但是自身需要依赖一个元数据表,要么是derby,要么是mysql,相同点总归是要先导入数据,然后才能进行处理。其原理是把结构化的数据文件映射为一张数据库表,然后将SQL语句转化为MapReduce任务进行运行,以绕过专门开发MapReduce这样一个逆向思维的产物。

Hive不可以改写、插入和删除数据,换句话说hive完全就是用来进行计算的。

Hive的数据是存在hdfs上的,所以数据导入之后除了元数据之外,还有另一份本体数据(通常比较大的)存在hdfs上。

有了基础概念之后,开始正题了。

Read on →

centos5.8下基于hadoop0.20.203的hive0.7安装

什么是hive

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

hive使用场景

HIVE 不适合用于联机(online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

Read on →


SpringMVC搭建篇

最近有项目要求必须用java,于是想到了spring,前几天花了一天时间也算调通。这里简单记录下先(其实很详细,我自己要看,哈哈),其实更喜欢idea,人家都是google官方android开发推荐ide,有专门插件。嗯,扯远了,下面是搭建的过程小记:

Read on →

VS2010 LINK:fatal error LNK1123

因为要看cocostudio的实例代码,在原有vs2010的基础上又安装了vs2012,出现了项目不能编译的问题OMG ` LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 ` 以下为解决方法:

Read on →



cocos2d-html5-2.2.2初探

准备用最新的cocos2d-html5 2.2.2的框架作为游戏开发引擎,整个引擎还是逻辑相当清晰好理解。

本文部分参考v2.1.1这篇分析文章 http://blog.csdn.net/honghaier/article/details/8642553

翻了几篇官网几篇文章,发现对应的教程没有同步起来,比如说这篇: http://www.gamefromscratch.com/post/2012/06/08/Cocos2D-HTML-Tutorial-3All-about-sprites-and-positioning.aspx

Read on →


android webview helloworld分析

加载示例代码

官方示例代码 https://code.google.com/p/apps-for-android/source/browse/#git%2FSamples%2FWebViewDemo

运行Eclipse(本文提到的eclipse版本是Eclipse ide for java developer KEPLER),选择File->Import…->Android->Existing Android Code Into Workspace,Next,在Root Directory中选择解压的目录下的Samples文件夹下的WebViewDemo。

如果直接run,会出现错误 Project has no project.properties file! Edit the project properties to set one.。 这时只要右键项目属性properties -> android -> Project Build Target 把里面的Androidx.x改为对应的google APIs版本。google APIs是android apis的超集,Android只是其中一个用于移动设备的OS,可以有限的调用一些google api。

分析app部分代码

请看示例java代码 Read on →




cocos2d-x初心者阶段学习之一

序言

通过一个阶段的cocos2d-iphone的学习,对Objective-C(以下简称oc)做到基本了解,也有一个游戏小demo。但在摸索的过程中,发现这门语言稍让人感觉不爽的是oc里实例变量的绑定,除此之外oc基本上是一门比较优雅的语言。试水已经告捷,考虑到市面上大多采用cocos2d-x,还有cocostudio这一套的东西,应该是时候投入该框架的学习。

Read on →

win7上搭建cocos2d-x2.2.2开发环境

在win7上搭建cocos2d-x的开发环境,主要用到的开发IDE为visual C++2010,为什么不再使用vc6?第一,cocos2d-x本身不支持。第二,支持C++0x的特性。对于现代游戏游戏引擎来说,这是必要的。安装vc 2010这里就不再讨论。

Read on →

freebsd上手动编译boost的boost-regex库

Boost这玩意用起来容易,安装起来却很麻烦,如果按照默认安装很庞大臃肿,原因是bjam搞得太复杂了。对于只使用其中某几个模块而采用整体安装的方式时间和空间上都是划不来的。如果只需要连接其中的正则表达式模块regex的话,可以采取单独安装的方法。

Read on →



hbase连zookeeper瞬断

问题

今天修理hbase问题的时候发现,监控的60010端口的master.jsp就是无法显示,进入log查看发现zookeeper连上了之后马上就断开。

[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn$Factory@247] ` - Too many connections from /10.10.8.136 - max is 10 `

这种情况在telnet测试中被证实,一连上也是瞬间脱离与服务器的连接。

Read on →

git免密码使用https协议

git支持的协议主要有git、ssh、http、https这几种,国内防火墙对github的作用下,导致长期使用github服务的程序开发人员要忍受缓慢的push和pull速度。现在终于找到了一个比较不错的方法提升工作效率,那就是使用goagent+git/https的方式。 Read on →


centos安装erlang R16b03

起因

原本以为centos上简单敲几个yum install erlang就可以完成,结果事与愿违,没有package,那么只要乖乖下载源码编译,记录若干步骤备查。

Read on →

使用php的snmp模块进行监控数据的获取

简单地根据经验归纳,snmp被叫做简单网络管理协议(Simple Network Management Protocol),是监控业界标准的设备间通讯接口会话层协议,位于OSI的第五层。各类开源软件广泛采用了此协议进行数据的获取,目前已经从明文传输的v1发展到了具有较高安全性的v3版本。与snmp相关的知识有很多, MIB (管理信息数据库), OID (对象标识符),就目前而言,只需要记得有这2个名字就可以了。 通过源码安装php的snmp模块和安装一般php的模块没有本质区别。一共也就2种方式,–enable或者–with静态方式和phpize动态方式。共同点是都需要ext目录下面有snmp这个模块。 下面先论述如以–enable或者–with的方式来把snmp静态编译到php中去。 首先下载php软件包。 Read on →


centos6.4 install cacti0.8

简介

cacti号称一款完全采用rrdtool和snmp实现的监控软件,与同为自由软件的nagios相比,它能够呈现大量直观的监控图表,功能主要体现在了数据的量化上。该软件最初完全采用php写成,采用crontab调用poller.php脚本进行数据的定时收集,如今已经有c语言写成的改良版spine收集器进行数据的收集可供选择。

Read on →

centos6.4下搭建zabbix2.0.6

最近开始研究各款监控系统,和自己的监控系统进行横向比较找差距,就从单位也在用的zabbix开始,先安装后再这里过一遍流程。

Read on →

克隆你的octopress博客到win7

由于之前octopress博客是在公司的机器上搭的,想到在家里笔记本上的win7也搞一个环境,方便及时写写技术博客。参考网文《【像黑客一样写博客之五】博客克隆》进行摸索,终于实践成功。

但我的方法稍微有点区别,这里采用clone的方式比较快,主要省去一个remote add环节:)只要主要注意几个问题,就可以轻松搞定,顺序看就行。

Read on →



如何正确地把带参数的C语言main程序改成so

首先有些标题党吧,不过个人体会修改程序的过程中遇到未知的坑还是比较阴险的,所以整理一下写个博客。

之前尝试把C语言的带参数执行的main程序改成动态链接库,发生了一个问题,主程序调用动态链接库最后获取的结果保持不变,跑了一会儿之后还是和第一次调用的一样。把几乎可能导致问题的static变量全部给改为非静态变量和重置后居然还是无效。最后在痛苦的查询资料之后,终于找到了问题所在。

话说回来,先看怎么把带参main程序改成动态链接库。

Read on →

gvim无法打开交换文件

最近在windows下使用gvim,直接按照之前在freebsd上的配置搬回来,发现问题多多。每次打开文件都会报错E303,非常碍事。

1
2
3
4
5
6
7
:help E303
Unable to open swap file for "{filename}", recovery impossible

Vim was not able to create a swap file.  You can still edit the file, but if
Vim unexpected exits the changes will be lost.  And Vim may consume a lot of
memory when editing a big file.  You may want to change the 'directory' option
to avoid this error.  See |swap-file|.

说是无法创建交换文件。 其实只要这么解决:

1
:set directory=.,$TEMP

或者指定一个实际存在路径。



rebar生成发布包后找不到noodtool

今天用rebar编译出目标文件准备直接部署到目标服务器上,结果报告

1
2
3
4
5
6
[evoup@host63i386 erlang]>sudo rel/madmonitor2/bin/madmonitor2 start
current node: madmonitor2@192.168.216.165
release vm.args file empty,recopy
escript: Failed to open file: /usr/home/evoup/project/madmonitor2/erlang/rel/madmonitor2/erts-

5.9.3.1/bin/nodetool
Read on →


freebsd下安装vmware-tool

公司自建的vmware虚拟机,每当中餐回来后,由于系统处理待机状态莫名其妙地会比当前时间慢一段时间,导致server端保存数据的时间戳滞后。怎么解决呢?

Read on →


HADOOP0.20.203完全分布式搭建(VMware版)

vmware版本8.0.4 build-744019 首先准备3台虚拟机

Alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 ,''''''''''''':'''''''''''''''''':'''''''''''''''''''''''''''''''''''|
 |    usage    |        IP        |             Hostname              |
 |             |                  |                                   |
 |'''''''''''''|''''''''''''''''''|'''''''''''''''''''''''''''''''''''|
 | namenode    | 192.168.174.132  |           mdn2.net                |
 |             |                  |                                   |
 |'''''''''''''|''''''''''''''''''|'''''''''''''''''''''''''''''''''''|
 | datanode01  | 192.168.174.135  |        mdn2datanode1.net          |
 |             |                  |                                   |
 |'''''''''''''|''''''''''''''''''|'''''''''''''''''''''''''''''''''''|
 | datanode02  | 192.168.174.136  |        mdn2datanode2.net          |
 |             |                  |                                   |
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

  (2014-02-27注意取的名不要出现下划线,否则hive会报错)

Read on →






配置nginx支持rrdcgi

开始在web界面上加载监控图表了,用rrdrool graph生成图,但是发现只能够生成。于是想当然地试了一下rrdcgi,本以为能够出图,结果还是创建图片,html来加载图片。最后发现ganglia的图表中居然也是先提取在临时目录生成好的图片,然后用php来生成头,最后再删除图片。不过顺便把nginx下配置CGI程序的知识学会了,权且记一笔。

Read on →

编译rebar项目中单个erlang源文件的vim脚本

本人用rebar写程序总免不了rebar complie和rebar generate一番,项目关联比较多整个过程非常慢,这是很令人沮丧的。有没有什么方法能像C语言的makefile一样,只编译需要的文件呢?答案是没有现成的,就我所知rebar没有这么高端的功能去判断哪些文件是变化过的。那就通过其他方式提高生产效率,想到了erlc,单个文件编译是没有什么问题。 Read on →


[How to]在erlang中使用rrdtool进行监控数据的保存

概述

项目需要保存监控数据,之前用hbase存然后再出图的方式,虽然数据量可以,但整个方式比较落后。

rrdtool是专门为了保存和出图设计的数据库。它的全称为round robin database,我们通常叫它为环状数据库。

关于如何创建rrd数据库的文章可以看这里http://www.cuddletech.com/articles/rrd/ar01s02.html

准备工作

在freebsd上安装rrdtool1.2以上的版本 Read on →


局域网计算机和vmware虚拟机互ping

情景描述

在公司的WIN7电脑上装了vmware进行服务端的开发,通过socket和client端进行通信。现在局域网中有若干台服务器安装了客户端要与vmware虚拟机上的server端进行通讯。由于不是处于一个网段,无法互相ping得地址,进而不能交互,以下为解决问题的过程笔录。 Read on →



erlang版的long2ip函数

工作中参考网络文章整理了一个整形转IP地址的函数。直接看代码了。

erlang代码片段
1
2
3
4
5
%%从整形转换为IP地址元组
long2ip(IpInteger) ->
    Integer_to_ip=fun(Ip)-> {Ip bsr 24, (Ip band 16711680) bsr 16,
        (Ip band 65280) bsr 8, Ip band 255} end,
    Integer_to_ip(IpInteger).

这样子使用 long2ip(3232290954). {192,168,216,138}


octopress添加社会化分享和添加多说评论

社会化分享

社会化分享主要采用的是bshare

在_config.yml中增加bshare:true,在”source/_includes/post”下的share.html中添加如下代码

1
<div class="bshare-custom"><a title="分享到QQ空间" class="bshare-qzone"></a><a title="分享到新浪微博" class="bshare-sinaminiblog"></a><a title="分享到人人网" class="bshare-renren"></a><a title="分享到腾讯微博" class="bshare-qqmb"></a><a title="分享到网易微博" class="bshare-neteasemb"></a><a title="更多平台" class="bshare-more bshare-more-icon more-style-addthis"></a><span class="BSHARE_COUNT bshare-share-count">0</span></div><script type="text/javascript" charset="utf-8" src="http://static.bshare.cn/b/buttonLite.js#style=-1&amp;uuid=&amp;pophcol=2&amp;lang=zh"></script><script type="text/javascript" charset="utf-8" src="http://static.bshare.cn/b/bshareC0.js"></script>

这样就完成了一键分享的功能。

社会化评论

octopress默认采用第三方评论系统disqus,但是国内用户普遍都不使用,可以采用duoshuo。 首先在 source/post/ 下创建duoshuo.html 然后登录duoshuo的网站,进去获得代码后复制到刚刚创建好的html中。 在source/_layouts/post.html中,将对应的disqus代码改为:

1
2
3
4
5
6
{% if site.duoshuo_name and page.comments == true %}
  <section id="comment">
    <h1>发表评论</h1>
    {% include post/duoshuo.html %}
  </section>
{% endif %}

在source/_config/yml中,添加:

1
duoshuo_name: 你在多说创建的站点名称

不出意外,分享和评论就添加完成了,最后不要忘记生成就可以了。


博客搬家到github

之前使用了将近一年的google app engine建博客,GFW间断性地对ghs.googlehosted.com进行屏蔽,同时用google帐号评论也太逊了,换个吧,开篇!


freebsd下PHP的Tokyo Tyrant安装配置测试

简介和横向对比

Tokyo Tyrant(ttserver)是一款分布式nosql数据库,内部主要是用Tokyo Cabinet数据库实现。与memcache相比,其具有持久化存储的特性;与redis相比,这个数据库在记录数上亿时性能会急剧下降,没有redis业界口碑好,当然也可能是因为这是比较早起的nosql产品了,以及没有进行正确的配置导致的。除此之外ttserver还支持memcache兼容协议,仅仅需要注意INCR的操作中,memcache是不返回值,ttserver是返回自增ID的。

Read on →

关于log4erl的localtime_to_universaltime报错

问题症状:

项目遇到编译后运行的一个问题,logerl报错之

1
2
3
4
5
6
7
8
9
10
11
** {appender_died,

       {'EXIT',

           {badarg,

               [{erlang,localtime_to_universaltime,

                    [{ {2013,6,19},{15,52,35} },true],

                    []},

看来是无法进行本地时间和UTC的转换,继续尝试一下这个localtime_to_universaltime函数

Read on →

使用ntpdate同步时间报错: step-systime: Operation not permitted

今天有台虚拟机进行时间的同步报错

1
2
3
ntpdate ntp.sjtu.edu.cn

19 Nov 15:38:54 ntpdate[93376]: step-systime: Operation not permitted

原来许多VPS分给用户的虚拟机也存在类似症状,是宿主机不允许修改时间,最后通知系统管理员修改搞定。


erlang R15B01安装问题

freebsd8.0上安装erlang15B01,报错,可以直接修改vi ./erts/emulator/i386-unknown-freebsd8.1/Makefile的-DUSE_VM_PROBES参数,指定其=0绕过。


【How to】使用basho的erlang-protobuffs和PHP通讯

这几天通过查阅相关资料,终于实现了php和erlang的相互通讯。详细的protocolbuf的入门,可以参见本问最后的参考链接。有文章说google官网实现的protobuf的erlang接口不是很好用,推荐使用basho的erlang-protobuffs修改版本。于是摸索了一番,终于勉强可以使用了,现先介绍如何使用该工具生成消息的erlang源文件。米聊用的分布式数据库riak就是basho公司开发的,其中采用了修改版erlang-protobuffs。

Read on →

[How to]使用rebar构建erlang 项目

rebar这个程序其实是个escript脚本,通过它可以对erlang项目创建、编译、生成和升级。之前一直使用着《Erlang/OTP并发编程实战》EMakefile的方法,进行项目的编译,也很简单,但是后续的又有一套发布的机制。现在很多项目在用rebar,于是我也试了一下,没想到问题还蛮多的,在这里记一下,我只是用了绕过的方法不是很好,因为时间不允许,这里先SORRY一下。我这里的环境为freebsd9.0 amd64 (elrang5.9.1 R15B01),erlang的其他版本,请参看wiki的Release-handling部分调整生成环节的命令。

1)第一步要获取rebar程序,两种方法:自己编译和直接下载。

Read on →

创建ssh信任失败的原因分析和改进

今天在给一台服务器做信任的时候出现了完成之后登录会提示输入密码。经过起初的ssh-copy-id和手工拷贝公钥到对方服务器的authorized_keys文件中,到后来的再次ssh-keygen反复试错无果之后,最终把问题锁定在了权限。

除了authorized_keys文件给予644或者600权限,.ssh文件夹给予755权限,此外用户目录的权限也必须是755或711,最终修改用户文件夹权限完成免密码登录。

由此推断:

一,管理员在开帐号的时候采用的错误的脚本。

二,ssh-copy-id这个工具可以改进。

目前简单的方式就是直接把目录权限做成711或者755。


在操作系统之间迁移二进制程序之一

写在前面

乍一看又标题党了,但以下文章虽然提到了一个过时的软件pcc2.0,实际我们只是用通过研究程序内部的工作机制,进行举一反三,以再今后的工作中能够起到触类旁通、抛砖引玉的功效。
单位有台机器HostA上安装了鲜为人知的软件叫做pcc2.0,这是一个php的编译器,虽然有许多bug,仍旧采用人工hack的方式使用它。但是目前已经找不到安装包了,怎么办?难道要叫运维帮忙克隆系统吗,有没有办法把程序直接移植到另一台机器HostB上去?答案是肯定的。

Read on →

freebsd6.2i386安装subversion1.8.8

一台老的freebsd6.2机器,port中没有subversion(注:千万不要portsnap更新,一更新后就毁了 Could not find bsd.port.options.mk 没救了,因为最新portsnap不向下兼容支持老系统了!)

注意编译subversion的时候会出现 ` configure: error: C++ preprocessor “/lib/cpp” fails sanity check `

Read on →

rrdtool graph报错Cannot parse vname from DEF

今天在创建rrdtool的graph的时候遇到了报错Cannot parse vname from ‘DEF

1
2
3
#/bin/sh
/usr/local/bin/rrdtool graph result.png --lazy --start 1384320009 --end 1384323609 --title "Disk / usage" -v "bytes" --width 320 --height 240 \
DEF:/=/services/rrds/yin2-monitorbeta-arch_ac101eb4/diskused_.rrd:/:AVERAGE AREA:/#444444
Read on →

unix下找回svn密码的小方法

之前有个项目的svn通过svn manager设置了权限访问,采用了不同的密码,在windows端小海龟的密码是看不到的,但庆幸主要更新和提交svn的任务是在freebsd下进行的,经过一番折腾,找回了密码,方法见下: Read on →


freebsd下nginx+Php5.3.8+php-fpm源码安装之二

nginx端的配置 首先创建好web目录,假设在/services/www目录,在其下创建一个php测试脚本,php的脚本简单如下:

1
2
<?php
phpinfo();

安装nginx 安装简单的采用port,然后直接配置/usr/local/etc/nginx/nginx.conf

添加一个前缀test,我们访问http://192.168.216.198/test/index.php 或者 http://192.168.216.198/test/ 即可看到php输出的信息。

默认nginx的fastcgi脚本似乎不直接支持php,需要创建一个文件php_fcgi_params.conf,然后在此文件中加入类似如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#php_fcgi_params.conf                                                                                                                                              
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
#fastcgi_param  SCRIPT_NAME        $request_uri;                                                                                                             
fastcgi_param  PATH_INFO          $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect                                                                                       
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_param       HTTP_X_REQUESTED_WITH       $http_x_requested_with;

在nginx.conf中的server上下文中添加

1
2
3
4
5
6
7
8
    location ~ ^/pma/.*$ {
        #access_log /var/log/access_beta.log access1;
        index index.php index.html index.htm;
        root /services/www/;
        fastcgi_index   index.php;
        include /usr/local/etc/nginx/php_fcgi_params.conf;
        fastcgi_pass 127.0.0.1:9000;
    }

启动nignx

1
$ /usr/local/etc/rc.d/ngnix start

访问浏览器http://192.168.216.198/pma/

Alt text

done!


freebsd下nginx+Php5.3.8+php-fpm源码安装之一

本文在freebsd9.2 i386下进行。选择php5.3.8才能正常编译

pecl扩展(以下的pecl源码改名后放到php源码的ext目录下)

i.memcache-3.0.4->memcache
ii.APC-3.1.4->apc
iii.imagick-3.0.0->imagick
(已经把memcache,apc模块源码放到ext子目录中,名称如上)

1
2
3
4
$ cd /your/phpsrcdir
$ rm configure
$ ./buildconf --force
$ ./configure --help   #(选项出现了!)

预装软件:

ImageMagick

1
$ make WITHOUT_X11=yes install clean

(时间较长,干点别的去) libevent(php-fpm需要,ports)

1
$ make install clean

curl(ports)

1
$ make install clean

libmcrypt(ports)

1
make install clean

手动编译php,每个参数都要知道具体是干嘛的,5.3.3之后,有了php-fpm,

–enable-fastcgi就不再需要了,mysqli以及pdo-mysql都用mysqlnd

1
$'./configure' '--prefix=/usr/local/php5_admin' '--with-layout=GNU' '--with-config-file-scan-dir=/usr/local/php5_admin/etc/php' '--disable-all' '--enable-dom' '--enable-filter' '--enable-hash' '--enable-json' '--with-mcrypt' '--with-curl' '--with-pcre-regex' '--enable-mbstring' '--enable-ctype' '--enable-session' '--enable-libxml' '--enable-simplexml' '--enable-pdo' '--with-pdo-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-mysql' '--enable-sysvsem' '--enable-sysvshm' '--enable-apc' '--enable-memcache' '--with-imagick=/usr/local' '--enable-fpm' --with-zlib --with-bz2 --enable-zip

注意 make时候会报错 解决方法: 修改fpm_sockets.c代码:

1
2
info.tcpi_sacked => info.__tcpi_sacked
info.tcpi_unacked => info.__tcpi_unacked

配置

1
$ cp /usr/local/php5_admin/etc/php-fpm.conf.default /usr/local/php5_admin/etc/php-fpm.conf

几个需要配置的参数

1
2
3
4
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers

编辑启动脚本/usr/local/etc/rc.d/phpfpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
# PROVIDE: phpfpm
# REQUIRE: DAEMON
#
# Add the following lines to /etc/rc.conf to run phpfpm:
#
# phpfpm_enable (bool):   Set it to "YES" to enable {phpfpm}.
#               Default is "NO".
#
# Last-Modified: 2010-09-14 23:30:20
name="phpfpm"
. /etc/rc.subr
rcvar=`set_rcvar`
load_rc_config ${name}
eval ${name}_enable=\${${name}_enable:-"NO"}
eval server=\${${name}_server:-"/usr/local/php5_admin/sbin/php-fpm"}
command=${server}
extra_commands="reload"
sig_reload="USR2"
pidfile="/usr/local/php5_admin/var/run/php-fpm.pid"
#command_args="" 
run_rc_command "$1"

注意:启动脚本的权限555,还有/usr/local/php5_admin/var/run/php-fpm.pid可能需要手动创建

在/etc/rc.conf中加入

1
phpfpm_enable="YES"

然后启动

1
$ /usr/local/etc/rc.d/phpfpm start

备注,其实:上面的phpfpm配置文件是错误的,原因如下: > php 5.3.3以上的php版本源码中已经内嵌了php-fpm,不用象以前的php版本一样专门打补丁了,只需要在 configure的时候添加编译参数即可。 > 但是,php 5.3.3以上版本的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,需要使用信号控制: > master进程可以理解以下信号: > INT, TERM 立刻终止 > QUIT 平滑终止 > USR1 重新打开日志文件 > USR2 平滑重载所有worker进程并重新载入配置和二进制模块

示例: 注意这边的单引号为“esc下面那个键(~)” php-fpm 关闭:

1
$ kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm 重启:

1
$ kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程:

1
$ ps aux | grep -c php-fpm

查看php-fpm进程数:

1
$ ps aux | grep -c php-fpm | wc -l

正确的脚本应该是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
# PROVIDE: phpfpm
# REQUIRE: DAEMON
#
# Add the following lines to /etc/rc.conf to run phpfpm:
#
# phpfpm_enable (bool):   Set it to "YES" to enable {phpfpm}.
#               Default is "NO".
#
# Last-Modified: 2012-11-22 10:27:43
name="phpfpm"
. /etc/rc.subr
rcvar=`set_rcvar`
load_rc_config ${name}
eval ${name}_enable=\${${name}_enable:-"NO"}
eval server=\${${name}_server:-"/usr/local/php5_admin/sbin/php-fpm"}
command=${server}
extra_commands="reload"
sig_reload="USR2"
sig_stop="INT"
pidfile="/usr/local/php5_admin/var/run/php-fpm.pid"
fpmconffile="/usr/local/php5_admin/etc/php-fpm.conf"
command_args="-g ${pidfile} -y ${fpmconffile}"
#run_rc_command $1
run_rc_command $*

下篇讲nginx的配置


php和zookeeper交互获取hbase的master状态

为什么要使用zookeeper扩展

公司用了HHVM这玩意来编译php,其实我要给它NO,因为连zookeeper都没支持,如果要支持,要自己写扩展,这是一个奇葩的节奏。所以我们还是采用php脚本方式来调用pecl扩展来实现php和zookeeper通讯。 Read on →


非常便捷的ssh信任制作脚本ssh-copy-id

ssh-copy-id在版本比较高的freebsd的port中提供了,安装即可。手册一把原来这个工具就是shell脚本,ssh-copy-id这个工具可以方便的把公钥直接拷贝到对方服务器信任列表。比起来回切换服务器拷贝公钥方便多了。

Read on →

erlang调用C库函数(NIF 方式)

新客户端要求节省系统开销,对于监控的项目,如cpu的load不要通过shell的方式(如top)来获取,通过阅读先关开源软件的代码发现了getloadavg这个C标准库函数。考虑erlang三种和C外围程序交互的方式中,如果开发同步程序的话,NIF(本地函数)是在最高效的。但也要注意一下不要把费事阻塞的操作写到NIF中去,否则会vm会一直等待。

好久没写C的动态库了,记得上次还是学习vc的时候去调用dll,还好unix下做动态库很容易。这就开始,拿到《erlang OTP并发编程》翻到十二章,发现该书OTP的版本有R13和R14。我手头的版本是R15,

Read on →

[转]Erlang监测系统CPU、内存和磁盘

os_mon Erlang的os_mon服务中提供了一些用于监测系统信息的服务

(PS:经过测试,freebsd上使用get_disk_data无法获取到磁盘的数据)

cpu_sup:监测CPU负载和使用率(Unix)

disksup:监测磁盘(Unix、Windows)

memsup:监测内存(Unix、Windows、VxWorks)

os_sup:监测系统日志(Solaris、Windows)

Read on →

erlang自带日志写文件的方法

最近读erlang/OTP并发编程介绍第七章的日志,发现居然没有记录到日志的方法。这种方式打印的日志,仅仅是输出到了控制台。自带SASL日志有很多局限,比如没有内置记录到文件的功能。其实还可以考虑一下log4erl,这里先介绍下自带日志的写文件的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-module(x).

-define(LogsLoaction,"/tmp/").

-export([start/0]).

start()->

   FileName = ?LogsLoaction++"log.txt",

   file:write_file(FileName, <<"start to record">>),

   error_logger:logfile({open,FileName}),

   info("[init] log start ~n").

info(String)-> error_logger:info_msg(String).

info(String,Value)-> error_logger:info_msg(String,Value).

error(String)-> error_logger:error_msg(String).

error(String,Value)-> error_logger:error_msg(String,Value).

对于日志文件的轮询还要使用newsyslog等软件进行轮询。本文相对开源的erl日志系统log4erl还是属于比较山寨的解决方案,没有进行系统的测试,仅能使用。:)。


log4erl 安装使用

目前项目急需一套可记录到文件并能自动轮询的机制的日志系统,考虑良久,最后置自带gen_event和标准日志函数于不顾,决定用log4erl。

Read on →

apache Mina 使用小记

apache mina使用小记 简介 Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API。 环境为jdk1.6+freebsd9(64bit)+apache-mina-2.0.7+vim 首先是环境变量的配置

1
2
setenv JAVA_HOME "/usr/local/diablo-jdk1.6.0/"
setenv JAVA_BIN "/usr/local/bin/"

下载mina

1
2
3
4
5
cd /usr/home/evoup/monsrvd-2.1/test/
fetch http://mirror.bjtu.edu.cn/apache/mina/mina/2.0.7/dist/apache-mina-2.0.7-bin.tar.gz
tar xzf apache-mina-2.0.7-bin.tar.gz
cp apache-mina-2.0.7/dist/mina-core-2.0.7.jar .
cp apache-mina-2.0.7/lib/slf4j-api-1.6.6.jar .

除此之外还需要slf4j这个是mina需要使用的日志库

1
2
3
4
fetch http://www.slf4j.org/dist/slf4j-1.7.2.tar.gz
tar xzf slf4j-1.7.2.tar.gz
cp slf4j-1.7.2/slf4j-api-1.7.2.jar .
cp slf4j-1.7.2/slf4j-nop-1.7.2.jar .

设置好JAVA的CLASSPATH

1
setenv CLASSPATH "/usr/home/evoup/project/management/monsrvd-2.1/test/slf4j-api-1.7.2.jar:/usr/home/evoup/project/management/monsrvd-2.1/test/slf4j-nop-1.7.2.jar:/usr/home/evoup/project/management/monsrvd-2.1/test/mina-core-2.0.7.jar:/usr/local/diablo-jdk1.6.0/lib:."

找到mina的TimeServer的例子 http://mina.apache.org/mina-project/userguide/ch2-basics/sample-tcp-server.html 代码最后是这个样子,先不用管细节

MinaTimeServer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import java.util.Date;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

public class MinaTimeServer
{
   private static final int PORT = 9123;

   public static void main( String[] args ) throws IOException
   {
       IoAcceptor acceptor = new NioSocketAcceptor();

       acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
       acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

       acceptor.setHandler( new TimeServerHandler() );
       acceptor.getSessionConfig().setReadBufferSize( 2048 );
       acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
       acceptor.bind( new InetSocketAddress(PORT) );
   }
}

class TimeServerHandler extends IoHandlerAdapter {
    static Logger logger = LoggerFactory.getLogger(TimeServerHandler.class);
   //static Logger logger = Logger.getLogger(TimeServerHandler.class);
   //异常处理
   public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
       cause.printStackTrace();
   }
   //对接收到的数据进行业务处理,在这里我们不管收到什么信息都返回一个当前的日期
   public void messageReceived(IoSession session, Object message) throws Exception {
       String str = message.toString();
       if (str.trim().equalsIgnoreCase("quit")) {
           session.close(true);
           return;
       }
       logger.debug("Rec:" + str);
       Date date = new Date();
       session.write(date.toString());
       logger.debug("Message written...");
   }
   //当连接空闲时的处理
   public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
       logger.debug("IDLE " + session.getIdleCount(status));
   }
}
1
2
3
4
5
6
7
[evoup@myhost]>telnet 127.0.0.1 9123
Trying 127.0.0.1...
Connected to localhost.

Escape character is '^]'.
Mon Jan 14 17:34:04 CST 2013
Mon Jan 14 17:34:04 CST 2013


golang的守护进程化

golang的守护进程化代码,参考了网上的代码,结合自己的项目,去掉了一些没用的代码,增加了fork时候的判断处理,我的机器是freebsd,fork会报errno:0,忽略,原因见代码注释。

Read on →




centos上安装net-snmp

引子

Net-SNMP是一个免费的、开放源码的SNMP实现,以前称为UCD-SNMP。它包括agent和多个管理工具的源代码,支持多种扩展方式。[1]不仅扩展了获取方式,而且对于数据类型也有一定的扩展。

以上文字摘自百度百科。而所谓snmp agent,个人理解就是能够实现snmp的read和snmp和get等标准snmp协议交互操作的容器,它可以提供默认的MIB和自定义的MIB。

centos上安装net-snmp的过程

1
$ sudo yum install net-snmp

配置snmpd

配置的方法有2种,一个是 snmpconf -g basic_setup ,一个如下的方式(注:前一个我由于时间关系没有试过):

安装完成后编辑/etc/snmp/snmpd.conf文件,更改如下配置:

主要是控制那台机器可以访问snmp

1、查找以下字段:

1
2
sec.name source          community
com2sec notConfigUser default       public

将”comunity”字段改为你要设置的密码.比如”public”.
将“default”改为你想哪台机器可以看到你的snmp信息,如127.0.0.1

2、查找以下字段:

1
2
3
# Finally, grant the group read-only access to the systemview view.
#       group          context sec.model sec.level prefix read   write notif
access notConfigGroup ""      any       noauth    exact all none none

将”read”字段改为all. ####3、查找以下字段:

1
2
#           incl/excl subtree                          mask
#view all    included .1                               80

将该行前面的”#”去掉. 保存关闭.

snmpwalk和snmpget的区别

snmpwalk是对OID的遍历,必须从根节点一次遍历,而不能通过某个叶子节点遍历。 而snmpget是取得具体的OID的值,必须是叶子节点。

用snmpwalk进行监控数据的获取

编辑完成之后可以测试,需要用到snmpwalk和snmpget

缺少snmpwalk和snmpget的可以安装

1
$ sudo yum install net-snmp-utils

启动snmpd

1
2
$ sudo /etc/init.d/snmpd start
$ sudo /sbin/chkconfig snmpd on

测试是否开启snmp服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ snmpwalk -v 2c -c public 127.0.0.1 if
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifMtu.1 = INTEGER: 16436
IF-MIB::ifMtu.2 = INTEGER: 1500
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 1000000000
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: 0:c:29:e6:ed:27
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00
IF-MIB::ifLastChange.2 = Timeticks: (0) 0:00:00.00
IF-MIB::ifInOctets.1 = Counter32: 784
IF-MIB::ifInOctets.2 = Counter32: 4216979
IF-MIB::ifInUcastPkts.1 = Counter32: 14
IF-MIB::ifInUcastPkts.2 = Counter32: 5593
IF-MIB::ifInNUcastPkts.1 = Counter32: 0
IF-MIB::ifInNUcastPkts.2 = Counter32: 0
IF-MIB::ifInDiscards.1 = Counter32: 0
IF-MIB::ifInDiscards.2 = Counter32: 0
IF-MIB::ifInErrors.1 = Counter32: 0
IF-MIB::ifInErrors.2 = Counter32: 0
IF-MIB::ifInUnknownProtos.1 = Counter32: 0
IF-MIB::ifInUnknownProtos.2 = Counter32: 0
IF-MIB::ifOutOctets.1 = Counter32: 784
IF-MIB::ifOutOctets.2 = Counter32: 417463
IF-MIB::ifOutUcastPkts.1 = Counter32: 14
IF-MIB::ifOutUcastPkts.2 = Counter32: 3968
IF-MIB::ifOutNUcastPkts.1 = Counter32: 0
IF-MIB::ifOutNUcastPkts.2 = Counter32: 0
IF-MIB::ifOutDiscards.1 = Counter32: 0
IF-MIB::ifOutDiscards.2 = Counter32: 0
IF-MIB::ifOutErrors.1 = Counter32: 0
IF-MIB::ifOutErrors.2 = Counter32: 0
IF-MIB::ifOutQLen.1 = Gauge32: 0
IF-MIB::ifOutQLen.2 = Gauge32: 0
IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.2 = OID: SNMPv2-SMI::zeroDotZero

获取load信息

1
2
3
4
$ snmpwalk -v 2c 127.0.0.1 -c public .1.3.6.1.4.1.2021.10.1.3
UCD-SNMP-MIB::laLoad.1 = STRING: 0.03
UCD-SNMP-MIB::laLoad.2 = STRING: 0.03
UCD-SNMP-MIB::laLoad.3 = STRING: 0.00

同样可以尝试使用snmp版本1来获取

1
2
3
4
$ snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.10.1.3
UCD-SNMP-MIB::laLoad.1 = STRING: 0.01
UCD-SNMP-MIB::laLoad.2 = STRING: 0.02
UCD-SNMP-MIB::laLoad.3 = STRING: 0.00

对外开放SNMP服务

得知本机已经安装完成,但是根据之前的设置,应该只有本机才有snmp的访问权限。可以通过修改/etc/snmp/snmpd.conf把刚才设置的127.0.0.1改为default

确认本机开放snmp端口,由于snmp协议基于udp,所以采用基于tcp的telnet来测试是不奏效的,可以利用nc来测试,如下

1
2
$ nc -uvz 192.168.216.177 161
Connection to 192.168.216.177 161 port [udp/snmp] succeeded!

如果打开了IPTABLES,确保本机的udp161端口对外开放,或者说入站通讯端口为udp161

1
2
3
$ sudo /sbin/iptables -I INPUT -p udp --dport 161 -j ACCEPT
$ sudo /etc/rc.d/init.d/iptables save
$ sudo /etc/init.d/iptables restart

或者直接在/etc/sysconfig/iptable中增加一行:

1
-A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 161 -j ACCEPT

小结

出于快速分析的目的,本文简单阐述了net-snmp在centos下的安装步骤,更加详细的内容可以参见net-snmp的官方网站


浅谈mysql导入导出csv的几种方法

有几种方法,这里一一列举:

第一种:使用phpmyadmin选择文件上传

此种方式很直观,只是要注意选择正确的换行符。假设我们在mysql的shell中采用如下方式先导出数据

1
2
3
4
select * from test_info
into outfile '/tmp/test_info.csv'
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n';

则需要上传test_info.csv,点击CSV using LOAD DATA,然后按照如下设置进行导入 (其中fields terminated为分隔字段,optionally enclosed为可选包裹字段,escaped为转移字段,line terminated为行终止字段)

Alt text

第二种:mysql shell

其实就是刚刚导出的逆操作。在mysql的shell中操作:

1
2
3
4
load data infile '/tmp/test_info.csv'
	into table test_info
	fields terminated by ','  optionally enclosed by '"' escaped by '"'
	lines terminated by '\r\n';

第三种:php程序解析后插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
echo "开始导入csv数据到工作表\n";
echo "导入test_info...\n";
$mysql_host="172.16.27.55";
$mysql_user="user";
$mysql_pass="pass";
$db="test_info";
$handle = fopen ('/tmp/test_info.csv','r');
$link= mysqli_init();
$link->options(MYSQLI_OPT_CONNECT_TIMEOUT, 8);
$link->real_connect($mysql_host, $mysql_user, $mysql_pass, $db);
$link->query("SET NAMES utf8");
$query="insert into `test_info` (`字段1`,`字段2`) values (";
while ($data = fgetcsv ($handle)) {
    $num = count ($data);
    for ($i=0; $i<$num; $i++) {
        if($i == $num-1){
            $query .= "\"".$data[$i]."\")";
            break;
        }
        $query .= "\"".$data[$i]."\",";
    }

    if (!($result=$link->query($query))) {
        echo $query;
        echo ("[导入失败]\n");
        exit;
    }

$query="insert into `test_info` (`字段1`,`字段2`) values (";

}
?>

需要注意如果fgetcsv出错和到了行尾都是会返回false的。


解决nginx upstream send too big header

遭遇nginx upstream sent too big header while reading response header from upstream

这个问题会导致输出502头信息。

在fastcgi_params中加以下2行

1
2
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;

原因是nginx处理header太大了,还有一个原因就是我写程序的时候发header太多了,只能发一次,调试的时候再去做了。


解决gvim菜单乱码问题

windows下的gvim在使用过程中还有一个问题,就是当我设置了set encoding=utf-8之后,菜单就出现了乱码。如果不设置呢,那么编辑文件就不能是utf-8,网上搜了一圈之后,终于发现比较满意的解决方法。

Read on →


freebsd安装ganglia3.4

Ganglia是什么?

简单的说,这是一个开源的系统监控软件,本身通过rrdtool这个软件作为数据载体,以及SNMP协议采集监控数据,最终在管理界面上呈现出监控图表数据的系统。

Read on →

导入mysql的几种方法

mysql这玩意官方导入的方法我初步估算了一下,有5种。这里不涉及使用第三方软件导入的分析(如phpmyadmin)。且听下文点评各个方案要注意的部分,有错之处还请不吝赐教。

Read on →


nginx报错413问题的解决

今天遇到php myadmin上传文件的2048k限制,页面报错413 Request Entity Too Large 其实只要在任意section加上以下的配置即可。

1
client_max_body_size 500m;

同时针对php.ini加上以下的配置,如果有必要重启php-fpm

1
2
3
4
5
6
file_uploads = On ;打开文件上传选项
upload_max_filesize = 500M ;上传文件上限
post_max_size = 500M
memory_limit = 8M
max_execution_time = 600
max_input_time = 600

可以根据实际情况调整对应参数。


vim在sudo下的使用当前用户的配置文件

部门配备了freebsd做为统一的开发环境,大家登上各自的jail进行软件开发任务。但是发现执行sudo vim之后,居然使用的是root的vim配置文件。

那么有什么办法能够使用自己的配置文件呢?其实再简单不过,使用-E参数

1
2
3
4
   -E  The -E (preserve environment) option will override the env_reset
       option in sudoers(5)).  It is only available when either the match-
       ing command has the SETENV tag or the setenv option is set in sudo-
       ers(5).
1
sudo -E vim file

然后就可以使用自己的配置文件了。


遭遇nginx upstream sent too big header

遭遇nginx upstream sent too big header while reading response header from upstream

这个问题会导致输出502头信息。

nginx配置中要加以下2行

1
2
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;

一加果然就不报错了!原因是nginx处理header太大了,还有一个原因就是我写程序的时候发header太多了,只能发一次,程序还要调整啊。


freebsd下hbase安装

安装JDK补遗,port中该文件已经无法获取。关键是下载到diablo-caffe-freebsd7-i386-1.6.0_07-b02.tar.bz

http://www.freebsdfoundation.org/cgi-bin/download?download=diablo-caffe-freebsd7-amd64-1.6.0_07-b02.tar.bz2

Read on →

C语言变参宏

研究lighttpd1.4.28代码的时候,到缓存调用部分,有这么一句:

1
buffer_copy_string_len(modules->key, CONST_STR_LEN("server.modules"));

而此参数声明的时候是这样的

1
int buffer_copy_string_len(buffer *b, const char *s, size_t s_len);

怎么是三个参?从CONST_STR_LEN入手,这是一个宏

1
#define CONST_STR_LEN(x) x, x ? sizeof(x) - 1 : 0

这不就成了三个参了?记一笔…



C语言宏定义技巧(常用宏定义)(转)

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。

1,防止一个头文件被重复包含 <div class=’bogus-wrapper’>

<figcaption></figcaption><div class=”highlight”><table><tr><td class=”gutter”><pre class=”line-numbers”>1 2 3 4 5 6 7 </pre></td><td class=’code’><pre>#ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif </pre></td></tr></table></div>
</div>

Read on →

shell收集

批量拷贝文件到服务器bash版

1
2
3
4
5
6
7
8
9
#!/usr/local/bin/bash
for hosts in `cat host.list` ;
do
    echo "将处理"$hosts ;
    scp /services/monitor_deal/madmonitor.current root@$hosts:/services/monitor_deal/ ;
    scp /services/monitor_deal/libphp5.so root@$hosts:/usr/local/lib/ ;
    scp /services/monitor_deal/libmysqlclient.so.16 root@$hosts:/usr/local/lib/ ;
    scp /services/monitor_deal/libz.so.6 root@$hosts:/usr/lib/ ;
done

远程备份MySQL数据库

1
2
3
4
5
6
7
8
9
10
11
#备份整个库
mysqldump -uusername -p*** -h 192.168.1.123 dbname > db_backup.sql

#备份单个表
mysqldump -uusername -p*** -h 192.168.1.123 dbname tablename > table_backup.sql

#导入整个库
mysql -uusername -p*** dbname < db_backup.sql

#导入单个表(2014-4-6补充:windows下可以这样c:\> mysql -uusername -p*** dbname < tablename < f:/table_backup.sql)
mysql -uusername -p*** dbname < table_backup.sql

备注:其实也可以用source,不过要进入mysql的shell中操作。

取得fb6的网卡mac

1
ifconfig lo0 | grep '[0-9a-f]\{8\}' | awk '{print $4}'

grep过滤空行

1
grep -e '^$' -v filename

查看目录里的每个子目录的大小

1
2
3
4
#for freebsd
du -h -d 1
#for linux
du -h –max-depth=1

获取文本的第三行

1
sed -n '3p' file

截取字符串

1
echo "abcd" | cut -b 1-3

使用nc访问百度

1
printf "GET / HTTP/1.0\r\n\r\n" | nc www.baidu.com 80

移除UTF-8的BOM

1
 sed -e '1s/^\xef\xbb\xbf//' < bomfile > newfile

无输出在后台静默执行命令

1
2
nohup sh command >> /dev/null
#注意如果command是一个脚本,所在脚本可以写成&后台执行的方式以获得主调代码异步的机制

把僵尸进程杀光

1
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

vim不加载vimrc

1
vim -u NONE

sudo的时候使用本用户的vimrc配置

1
sudo vim -E

调用vim来把文件转换为utf-8格式,注意要和find连用,需加载vimrc不然乱码

1
vim -c 'set fileencoding=utf-8 | wq!' main.cpp

find查找c/c++的源文件和头文件

1
find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.c" \)

获取当前时间戳

1
date "+%s"

不用scp,而使用rsync把本地文件传到远程服务器的一个目录

1
rsync -avze 'ssh -p 2203' logfile user@172.16.30.112:/logfiles/

把时间戳转换成系统时间

1
2
3
4
#linux版本的
date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z"
#freebsd版本的
date -r 1384499085 +"%Y-%m-%d %T %z"

按压缩包内的文件名,从bz2格式精确解压出指定文件

1
2
//解压bz2CompressedFile文件,提取其中的文件fileName重定向到destFile
bzcat bz2CompressedFile | tar xOf - fileName > destFile

在第三行之后插入指定数据

1
awk '{v1="###\n\呵呵呵";if (NR==4)print v1;print}' file > file_translated

参考这里http://club.topsage.com/thread-357787-1-1.html

下面这个等同于find . xargs grep error 但是可以同时打印error和fail为关键字匹配的行
1
awk '/(error|fail)/ { print; }' syslog.log

统计源码总行数

1
2
find . -exec wc -l {} \; | awk '{print $1}'
find . -type f ! -path "*.svn*" -exec wc -l {} \; | awk '{sum=sum+$1}END{print sum }'

如果要给sum来个初值,那么

1
find . ! -path "*.svn*" -exec wc -l {} \; | awk '{sum=0}{sum=sum+$1}END{print sum }'

寻找全部process开头的rrd文件,删除前确认

1
find . -name "process*.rrd" -ok rm {} \;

打印某网卡信息

1
ifconfig | awk '{if(NR==5) print $2}'

curl上传文件

1
curl -X POST -d @/path/to/file.mp4 "http://172.16.25.220:8484/video/create/video/220cf3b6bcac367fe884604efc3a0e56.mp4"

整个文件夹内替换字符串

1
find . -name "*.php" -exec sed -i '' -e 's/checkDigital/validDigital/g' {} +

找到的c头文件放到temp目录下

1
find . -name "*.h" -exec mv {} temp/ \;

把日志的第三个字段去重排序并显示

1
cat engine_23.log | awk -F ',' '{print $3}' | sort | uniq -c

ls详细用法<p> -l代表长格式 -r代表逆序 -t代表按修改时间排序 -h使用长格式后采用人类可读方式

1
ls -lrth

shell获取当前路径

1
$PWD

shell获取脚本所在路径

1
$(dirname $0)

AWK的入门

http://www.chemie.fu-berlin.de/chemnet/use/info/gawk/gawk_3.html

http://blog.csdn.net/eroswang/archive/2009/04/11/4064325.aspx

AWK高级用法

http://blog.csdn.net/eroswang/archive/2010/01/26/5258216.aspx

AWK一句话手册

http://blog.csdn.net/yangyinbo/archive/2010/05/12/5583936.aspx

可以用得到的shell的脚本

http://blog.csdn.net/eroswang/archive/2010/04/16/5494482.aspx

cshell参考

http://tech.it168.com/KnowledgeBase/Articles/4/b/9/4b910acff687a1096011b7ce80d3b59e.htm

数组的定义

1
2
3
4
set array=(a b c d)
居然下标是从1开始
echo ${A[1]}
a

bash下实现的伪多进程(实际是用了&后台执行)

1
2
3
4
5
6
7
8
9
10
  #!/bin/bash

  for ((i=0;i<5;i++));do
  {
      sleep 3;echo 1>>aa && echo "done!"
  } &
  done
  wait
  cat aa|wc -l
  rm aa

bash的fifo实现的多线程

http://www.examda.com/linux/fudao/20101011/132107473.html

多线程的实现是采用了有名管道mkfifo

http://blog.csdn.net/yangyun1981/archive/2007/12/19/1954061.aspx

shell判断文件是否存在

http://hi.baidu.com/hy0kl/blog/item/03737a34aad2795e241f1431.html




C++实现crc32

直接参考如下连接 http://stackoverflow.com/questions/302914/crc32-c-or-c-implementation

或者boost、Crypto++


typedef小结

在头文件里typedef的再inlcude到源文件里,这样就可以省去struct xx obj;直接xx obj;

对于动态分配内存的时候也可以

1
xx * obj= (xx *)malloc(sizeof(xx));


php myadmin1045 error

今天遇到phpMyAdmin错误 #1045 - Access denied for user@localhost的错误

记得在./libraries/config.default.php 已经制定好了需要的变量。

1
2
3
4
5
6
7
8
9
10
11
12
 57 $cfg['Servers'][$i]['host']          = '172.16.27.55'; // MySQL hostname or IP address
 58 $cfg['Servers'][$i]['port']          = '3306';          // MySQL port - leave blank for default port
 59 $cfg['Servers'][$i]['socket']        = '';          // Path to the socket - leave blank for default socket
 60 $cfg['Servers'][$i]['connect_type']  = 'tcp';       // How to connect to MySQL server ('tcp' or 'socket')
 61 $cfg['Servers'][$i]['extension']     = 'mysql';     // The php MySQL extension to use ('mysql' or 'mysqli')
 62 $cfg['Servers'][$i]['compress']      = FALSE;       // Use compressed protocol for the MySQL connection
 63                                                     // (requires PHP >= 4.3.0)
 64 $cfg['Servers'][$i]['controluser']   = '';          // MySQL control user settings
 65                                                     // (this user must have read-only
 66 $cfg['Servers'][$i]['controlpass']   = '';          // access to the "mysql/user"
 72 $cfg['Servers'][$i]['user']          = 'user';      // MySQL user
 73 $cfg['Servers'][$i]['password']      = '%**';          // MySQL password (only needed

同时

1
2
3
4
5
6
 40  * The 'cookie' auth_type uses blowfish algorithm to encrypt the password. If
 41  * at least one server configuration uses 'cookie' auth_type, enter here a
 42  * passphrase that will be used by blowfish. The maximum length seems to be 46
 43  * characters.
 44  */
 45 $cfg['blowfish_secret'] = 's#$dcrnm^9fk2';

这部分也指定完毕。

但是还是会报告1045,最后清除浏览器缓存,终于搞定。


gcc静态编译

制作静态动态库参考这篇文章《Creating a shared and static library with the gnu compiler [gcc]》 http://www.adp-gmbh.ch/cpp/gcc/create_lib.html 编译静态库 先找一下源文件

1
2
3
4
5
6
find . -name "*.c"
./sfhashfcn.c
./test.c
./sfmemcap.c
./sfxhash.c
./sfprimetable.c

生成中间文件

1
2
3
4
gcc -c sfhashfcn.c -o sfhashfcn.o
gcc -c sfmemcap.c -o sfmemcap.o
gcc -c sfxhash.c -o sfxhash.o
gcc -c sfprimetable.c -o sfprimetable.o

生成静态库

1
ar rcs libthash.a sfmemcap.o sfxhash.o sfprimetable.o sfhashfcn.o

最后链接(注意libxx.a,最后链接参数是-lxx)

1
gcc -static test.c -L. -lthash -o statically_linked_test

如果c++的项目要使用c的静态库则需要在引用的头文件的外面加上如下的代码

1
2
3
extern "C" {
    #include "header.h"
}

socket服务器开发心得[长连接线程版]

其实也算不上是什么心得,就是一些积累。cs结构的网游和聊天室基本上是在用长连接。

长连接一般会有个心跳包,具体就是确认客户端状态是存活的,这个还没有设计。

QQ其实也用TCP,也有心跳包,也涉及长连接。

P2P一般都是长连接,但是网游一般不设计成UDP数据包,一般都是长连接。

对于多线程阻塞服务器,recv就可以了,然后开个for(;;)或者while(1)死循环,长连接式的recv和send,这样交互,中间使用\n或者其他什么判断接受的一条协议命令;对于http这样的服务器,直接fopen套接字,fstat判断可写状态,则写入后fflush。这个flash也用了个flush函数,具体怎么回事,没做深入研究。


freebsd下如何使用ctags为项目生成tag文件

用vim写代码免不了使用ctags,但是在freebsd下稍稍有点区别,你需要Exuberant Ctags,它是ctags的扩展实现,比freebsd自带的ctags功能更加强大,老实说freebsd自带的ctags一点也不好用,除了不能直接ctags -R *以外,据说vim的taglist还不支持这个语法。

Read on →

单例模式C语言版

Tokyo Cabinet的源码看到的

1
2
3
4
5
6
7
/* Get the global memory pool object. */
TCMPOOL *tcmpoolglobal(void){
    if(tcglobalmemorypool) return tcglobalmemorypool;//如果有全局内存池对象就返回对象
    tcglobalmemorypool = tcmpoolnew();//如果没有就创建啊^_^
    atexit(tcmpooldelglobal);
    return tcglobalmemorypool;
}

而这个tcglobalmemorypool,其实是写在全局的,有

1
2
/* Global memory pool object. */
TCMPOOL *tcglobalmemorypool = NULL;

后记:其实只要把tcglobalmemorypool定义为全局变量,是个人都会创建这种模式的吧…


java关于ConcurrentModificationException异常

如果出现java.util.ConcurrentModificationException

主要原因是使用了叠代器,而且删除了某元素。临时的解决方法是设置1个标记,如果遇到该标记略过!


关于win32程序调用python脚本的发布问题

工作遇到某个项目,要在某个java的软件上模拟输入实现GUI自动化操作,就是类似外挂的功能,过程中遇到要判断图片相似度(因为抓不到java软件的win32句柄,只好判断GUI控件的大致外观来操作),我就想到了python的PIL库来干。原先的思路是这样的,先做个exe,然后直接通过python的capi,调用python脚本工作。后来发现非控制台程序的exe,嵌入python是会有这样那样的问题出现。参见《PyRun_SimpleString的无穷怨念》

http://blog.csdn.net/skyremember/archive/2008/09/17/2941174.aspx

于是在dll里面去嵌入python,dll里面可以用win32线程来调度python脚本的执行状态。

然后就涉及到发布的问题,先是这样子出现 “由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”

查了下资料,http://blog.solrex.cn/articles/py2exe-for-python-26-sucks.html 意思是python2.6是vc++2008编译的,所以要装Microsoft Visual C++ 2008 Redistributable Package。

再来就是csdn上面交流得来的,先把涉及到的python脚本用py2exe发布出来。

这个过程大致如下

1
2
3
4
# setup.py
from distutils.core import setup
import py2exe
setup(console=["hello.py"])

运行setup.py,记得要传一个参数

1
python setup.py py2e

于是生成的dist文件夹里就是发布好的程序了。 按照这个思路,解压library.zip里面的程序到dll目录也就可以运行了,试验发现如果是dll的话, w9xpopen.exe到是不必打包带进去了,这样我的dll连同这些文件都放到一个目录里,exe调用这个 dll就完成任务了。我的dll是Release版本的,因为我带的dll是python26.dll而不是python26_d.dll, 这样客户机再也不必安装python就可以运行带有python脚本的程序了。

总结:这谁想出来的,搞得这么复杂,LUA就没有这么复杂,直接2个DLL就完事了,但是估计调用 库的话也是一样的。

后记:其实非商业项目可以用selenium这类GUI自动化测试软件来干,也就是写写脚本。


关于头文件互相包含的解决方法

写在前面,如果你这么写了,基本上不是很好的写法,以下是我的惨痛经验教训。

我的游戏项目中有2个文件,其中cls_player.h包含cls_enemy.h,而且cls_enemy.h也要cls_player.h,这样子一来就成了重复包含了,虽然用防止重复包含头文件的宏#ifndef #define #endif,还是会报错。解决的方法初步看起来如下:

Read on →

PHP之call_user_func动态调用函数

call_user_func这个函数,可以把函数存到数组之后,在代码的任何位置进行调用,非常方便。 做项目修改a2billing代码时发现了这个函数。

在a2billing/Public/call-log-custoners.php的大约780行

1
2
3
4
5
6
7
8
while...
echo $FG_TABLE_COL[$i][11];
call_user_func($FG_TABLE_COL[$i][11], $record_display);
}else{
echo stripslashes($record_display);
}
...
end while

这里$FG_TABLE_COL[$i][11]其实是放的是函数,设计目的是循环echo一行的每个列,如果 $FG_TABLE_COL[$i][11]里有函数,就用函数去格式化$record_display 把自定义函数都放在数组里,然后用call_user_func,第一个参数设置为 数组,第二个参数设置为自定义函数的参数。这个设计思想很直接借鉴。

后计:这种设计方法,比较适合用在设计restful程序的框架上。


初始化一组C++对象

今天要初始化一组对象

1
2
3
4
5
6
7
8
9
cls_enemy * enemy0[]={
new cls_enemy(),
new cls_enemy(),
new cls_enemy(),
new cls_enemy(),
new cls_enemy(),
new cls_enemy(),
new cls_enemy()
};

像这样初始化也太麻烦了吧,看看有什么对象链表之类的东西。

Read on →

mysql_fetch_array不使用while

原来mysql_fetch_array也可以直接就分配到一个array,不用while 方法是

1
2
3
4
5
6
$num=mysql_num_rows($result);
if ($num==0) return 0;
for($i=0;$i<$num;$i++)
{
    $row[]=mysql_fetch_array($result);
}

STL中string到int的类型转换

STL的string转int的正确方法不是.data() 应该是

1
aoti(obj.c_str());

或者用个别人的string2int函数

1
2
3
4
5
6
int string2int(const string &s)
{
   int a;
   sscanf(s.c_str(), "%d", &a);
   return a;
}

然后int XX[]; 完全可以用vector来实现

1
vector<int > v;

v[]一样可以的用的。

下面有个类似的

1
2
3
4
5
6
int integer(string &s)
{
    int a;
    sscanf(s.c_str(), "%d", &a);
    return a;
}

批量删除CVS目录的cmd

windows下的bat的方法

1
2
3
4
5
6
7
8
9
10
@echo On
@Rem 删除CVS版本控制目录
@PROMPT [Com]#
@echo Find CVS
@for /r . %%a in (.) do @if exist "%%a\CVS" @echo "%%a\CVS"
@echo Find CVS Dir....OK
@pause
@for /r . %%a in (.) do @if exist "%%a\CVS" rd /s /q "%%a\CVS"
@echo Clear CVS Dir Mission Completed
@pause

bash的话可以这么搞,参见http://stackoverflow.com/questions/1330136/script-to-recursively-delete-cvs-directory-on-server

1
2
3
4
5
6
7
8
9
10
#!/bin/sh

if [ -z "$1" ]; then
    echo "Usage: $0 path"
    exit 1
fi

find "$1" -name 'CVS' -type d -print0 | xargs -0 rm -Rf
# or find … -exec like you have, if you can't use -print0/xargs -0
# print0/xargs will be slightly faster.


js获取cookie

直接参考网易的函数

1
2
3
4
5
6
7
8
9
10
11
12
function getCookie(name) {
   var search = name + "="
   if(document.cookie.length > 0) {
      offset = document.cookie.indexOf(search)
      if(offset != -1) {
         offset += search.length
         end = document.cookie.indexOf(";", offset)
         if(end == -1) end = document.cookie.length
         return unescape(document.cookie.substring(offset, end))
      }
      else return ""
   }

后计,直接使用jquery的cookie插件更方便,取一个cookie(name)赋值给foo

1
var foo= $.cookie('name');

JS跳出框架

1
2
3
4
5
6
<script language= "JavaScript">
  <!--Break out of frames
    if (top.frames.length > 0)
    top.location=self.document.location;
  //-->
</script>