adt18 ClassNotFoundException

更新了android  sdk后,导致ClassNotFoundException:

 

以下是解决方案:

1.从项目中移除jar:Right click on the project name > Properties > Java Build Path > tab Libraries > remove everything except the “Android X.X” (2.3.3 in my case) and the “Android Dependencies”

2. 将lib文件夹改为libs文件,lib将会自动依赖进入Android Dependencies

参考ref:

1. http://stackoverflow.com/questions/9831019/updated-sdk-version-getting-classnotfoundexception-android-support-v4-view-vie

Nagios安装与配置小记

大公司都会有自己的监控软件,例如淘宝有自己的哈勃等等,能及时监控到系统的运行情况,并给予及时的报警,可小公司就只能倚仗opensource了。

前些天,线上出现了机器中断。每次都是服务适用方发现的。给客户一个极其恶劣的错觉。

好在有了nagios,虽说让上手,可功能颇多,sms提醒,邮件提醒,自定义功能(例如:服务可7×24。)

说说主要步骤:

下载所需要文件

安装nagios core

  • 解压nagios.

tar zxvf nagios-2.6.tar.gz

  • 配置nagios.

cd nagios ;

./configure -prefix=/usr/local/nagios

  • 编译nagios.

make all

  • 安装nagios
  1. 执行make install安装主要的程序、CGI及HTML文件
  2. 执行 make install-commandmode 给外部命令访问nagios配置文件的权限
  3. 执行 make install-config 把配置文件的例子复制到nagios的安装目录。按照安装向导的提示,
  4. 执行 make install-init的步骤,它的作用是把nagios做成一个运行脚本,使nagios随系统开机启动,这是一个很方便的措施。
  •    文件结构如下:

bin

Nagios执行程序所在目录,这个目录只有一个文件nagios

etc

Nagios配置文件位置,初始安装完后,只有几个*.cfg-sample文件

sbin

Nagios Cgi文件所在目录,也就是执行外部命令所需文件所在的目录

Share

Nagios网页文件所在的目录

Var

Nagios日志文件、spid 等文件所在的目录

安装nagios-plugin

      ./configure  -prefix=/usr/local/nagios ,接着编译安装 make ; make install即可。

安装apache

      ./configure  -prefix=/usr/local/apache

     编译安装: make ; make install 。

创建用户

      useradd -s /bin/false nagios

    /bin/fasle设置无登录权限

设置文件及文件夹own

    chown -R nagios:nagios /usr/local/nagios

配置apache


ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
# SSLRequireSSL
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user

Alias /nagios "/usr/local/nagios/share"
# SSLRequireSSL
Options None
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user

创建安全验证文件

/usr/local/apache/bin/htpasswd -c /usr/local/nagios/etc/htpasswd admin

切换至/usr/local/nagios/bin,测试配置文件是否有效:

./nagios -v ../etc/nagios.cfg

显示为:

Total Warnings: 0
Total Errors: 0
即为成功,便可启动服务,
./nagios -d ../etc/nagios.cfg
再重启一次apache。输入登录名/密码即可登录。

ps:

phpapache安装

./configure –prefix=/usr/local/php  –with-apxs2=/home/admin/3gie/apache/bin/apxs

动态跟踪分析工具-Btrace

过程

一台线上的zookeeper client连接断开了,通过netstat发现端口(2182)的连接也不存在了。由于程序内部做过zookeeper连接状态检查。通过jstack查看线程信息:

发现线程依然在运行,后台线程的代码为:
private final Thread deamonThread = new Thread() {
public void run() {
while (true&&hasConnectZookeeper) {
try {
if (!checkZookeeper()) {
log.info("zookeeper disconnet ,reconnect...");
restart();
}
TimeUnit.SECONDS.sleep(5);
} catch (Exception e) {
log.error("deamonThread error", e);
}
}
}
};

btrace是通过编写脚本(java写的),将脚本动态挂接到运行时来获取运行细节的。使用方法:通过分析运行状态,怀疑是checkZookeeper()返回为True,可代码已经在线上运行,无法debug,出现问题的第一反应就是保持现场。若重新修改代码,在部署,然后再观察。那又会是无数天之后才会发生(这个jvm进程运行了10+天)。于是就需要靠Btrace来获取程序运行的更多细节。

btrace -cp build ${PID} TraceMethodArgsAndReturn.java

TraceMethodArgsAndReturn.java代码如下:
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self;

@BTrace
public class TraceMethodArgsAndReturn {
@OnMethod(clazz = "com.taobao.bulldozer.component.zookeeper.ZooKeeperWrapper", method = "checkZookeeper", location = @Location(Kind.RETURN))
public static void traceExecute(@Self Object instance, @Return boolean result) {println(strcat("call ", str(instance)));
final Object object = get(field("com.taobao.bulldozer.component.zookeeper.ZooKeeperWrapper", "zooKeeper"), instance);

println(strcat("zookeeper:", str(object)));
final Object object2 = get(field("com.taobao.zookeeper.ZooKeeper", "state"), object);

println(strcat("zooKeeper.getState():", str(object2)));
println(strcat("zooKeeper.getState():", str(classOf(object2))));

printFields(object2);
  }
}

输出如下:

至此,发现zookeeper的连接状态为CONNECTED,完成本次bug的跟踪,剩下的就是修复bug。

 

在这里只使用了监控方法,当然btrace还可以监控内存,线程,使用时间等等。更加深入的资料可参看相关资料

随便拦截任何目标java程序代码并执行其他代码,功能好强大!不过线上使用时,还是要小心、小心再小心,才可以开启unsafe开关,避免造成事故。

 

使用中遇到的一些问题:

提示Operation not permitted

脚本也写好了,代码也写好了。可运行的时候出现Operation not permitted。

java需要同样的帐号启动。

因为线上的机器是使用sudo来执行的。所以启动项改为:

sudo –u admin btrace -cp build ${PID} TraceMethodArgsAndReturn.java

相关资料

  1. http://kenai.com/
  2. http://kenai.com/downloads/btrace/BTrace_BOF-5552_J12008.pdf
  3. BTrace使用简介
  4. btrace一些你不知道的事(源码入手)
  5. 突破 BTrace 安全限制

SSD的物理地址与逻辑地址

Ssd的映射机制一般是基于页的文件存储算法,闪存物理地址和逻辑地址之间并没有一一对应的关系。但固态硬盘收到数据写入请求时,并不会循规蹈矩的按顺序进行写入,而是找到最方便写入的位置进行写入,以提高写入速度。

 

通常检测工作通过片上状态寄存器和特定的硬件来校验写操作和擦除操作是否成功,校验工作通过回读写入数据与用户数据进行比较来完成。系统并不将错误简单的反馈给用户,而是通过块重映射机制,另外分配一个空闲块重新执行写操作,由于ssd在设计的时候,已经预留了一部分flash用于临时存放数据和坏块替换使用,再加上flash芯片对擦鞋次数有限制,读没有限制,这样即使某些块被写坏了。也不会影响整个ssd的使用寿命,因此,ssd通过自动校验来预防错误的发生,个别单元读错误可以通过纠错来恢复数据,确保数据的完整性,逻辑地址与物理地址的映射机制,解决了写物理区块错误的问题,同时在损耗均衡算法中也需要逻辑地址和物理地址映射来完成。

附带操作系统教程:http://goo.gl/iGYn

成长源于改变[转]

年前有个学生困扰于求职,我有幸和她聊了聊,她的困扰就是父母的期望与自己的选择有很大差异,很纠结。她希望能做自己想要的工作,但这种工作可能在别人眼里不光鲜,不像公务员工作会让别人眼里放光:)她的父母就是希望她能找到一份稳定而光鲜的工作,如什么公务员、教师、500强外企之类的工作,而且她的父母总是拿别人的小孩来比较,强调什么样的工作是好工作!这无形中是一种压力。毕竟她是爱自己父母的,不按父母的意愿做可能会让父母不开心!其实很多人都会这样,我们一辈子都在和父母及上一辈人在斗争,因为他们失去的或没有得到的总是想在他们的孩子身上实现,然而这些并不一定是我们想要的!我们一定知道自己不能生活在别人的世界里,但又很难做出改变!

生命中间,我们总是面临改变。不管你愿不愿意。改变总会来的。只是如果你提前准备,是你去改变,如果你不准备,就等着被改变吧。二哥带他的儿子来广州,相处了几天,发现侄儿很怕尝试新鲜事物!就连吃的都要遵循脑海里的存储!为了让他改变,我们偏偏只准备他没有吃过的东西,结果无奈只好应变,尝试了之后他就尝到了甜头。

  • 难以改变的根源

(一)对无法实现别人期望的恐惧

上面提到的学生就是这样的恐惧,因为她很害怕父母的期望,这个期望不是自己想要的幸福。有时我们从小就这样一直恐惧。小时候考试自己觉得考80分足矣,心想终于考到这个分数了,但父母觉得应该考90分,杯具!父母认为“怪”的孩子就是好孩子,所以一打架就怕父母批评甚至一顿暴打,因此有时在委屈和正确之前甚至会选择逃避或沉默,压抑!高考选专业时,父母认为计算机、信息工程等是好专业,能挣大钱,有的人就这样被专业了,我就遇到很多这类的学生,结果到大学后要死要活转专业。父母说先别谈念爱,等以后有了工作稳定后再说,有的人就忍着爱情的冲动,一憋就是四年。有学生想做寒假列车乘务员,但父母觉得很危险,大过年的还飘在火车上,还是回家吧,郁闷,没了一次社会实践和人生经历!

我们总会听到这样的话,“那个太危险,还是回来吧。”,“那个不是女孩子做的,你别做啦。”,“当初安安稳稳的过日子不是挺好的么?”……是啊!这些其实都是善意的话,但就是阻碍了自己改变!小沈阳今年本来独自单飞上春晚,但节目被毙无奈和师傅再合作,之前媒体热议小沈阳要改变自己的作风,不能在那样女人了,应该怎样怎样,结果虎年春晚完全只是花瓶,还没有光泽,因为这并不是他的特点和长处!

 

(二)对自己失败的恐惧

当我们是孩子的时候,我们从来不害怕梦想。可惜的是,当我们长大,这个小鬼也开始越来越大。每一个伟大的故事都来自于伟大的梦想,飞上天空的莱特、搭建互联网的第一代精英们、登上月球的阿姆斯特朗。我们今天的生活中间,有大半的东西是30年前的人觉得毫无可能。当你使用这些东西的时候,当你发短信、坐飞机、上网的时候,千万别忘记提醒自己,这些成果都是战胜对梦想可能会失败的恐惧的胜利。每个人都会害怕失败,不谈念爱的人其中有一部分就是害怕被拒绝害怕失败,还打着我要好好学习的幌子。我们也许会因为一个东西不够完美就迟迟不动手。很多人觉得国家公务员考试很难,网上都这么说,因此就去裸考试试,结果没过,心理很踏实因为裸考,反正半裸的不裸的人也没考上,其实这些人害怕认真准备也会失败,甚至有的人直接放弃。我们的梦想很完美,但现实往往是不完美的。

  • 如何改变?

悲观主义者说:“哦,没希望了,也不要再努力了。”而乐观主义者说:“不要再努力了,事情总会变好的。”两者一样,因为什么也不会发生。—— 伊冯·乔伊纳德

我是一个老人,听说过相当多的磨难,但是大多数都没有发生。—— 马克·吐温

如果你对作出改变感到不安,或者因为对未来不确定性的恐惧而不断推迟改变,以下就是消除恐惧的好办法!看到问题后,写下你的答案,记住,直接写下你的第一反应,不要反复思考。写下答案后,不要修改——尽量写详细。每一个问题都可以花几分钟。

  1. 描述你所担心的噩梦,如果现在就做你想做的事情,最坏的后果可能是什么?一想到你能够——必须——做出的巨大改变时,脑海中立即显现的是哪些疑虑、恐惧和“推测”?尽可能详尽地把他们描述出来。改变会是你人生的终结吗?如果会带来终身后果,以1-10级的标准来计算,这些后果真的是终身吗?你认为这些后果发生的几率有多大?
  2. 如何弥补损失或者让事情恢复到正常状态,至少是暂时性地?实际情况要比你想象的容易许多。如何让事态重新回到你的掌控之中?
  3. 对于最可能发生的情况,它的结果和好处会是什么,无论是暂时性的还是永久性的?既然你已描述了噩梦,那么无论是对内方面(信心、自尊等)还是在外在方面,更有可能发生的、更确切的积极结果会是什么?这些更有可能发生的结果所具有的影响会是什么级别,1-10级之间?你创造较好的结果的可能性到底有多大?有没有能力比你差的人在你前面成功过?
  4. 如果今天你被解雇了,你会做什么来维持生计?想象一下这种场景,回头看一下你的1-3题的回答。如果为了尝试其他的选择你辞职了,然后有不得不回到原来的工作轨道,你会做什么?
  5. 你因为恐惧而不断推迟的计划是什么?一般说来,我们最害怕做的事正是我们最应该去做的。描述一下最糟糕的情况,接受它,然后去做它。再重复一遍你应该知道的事实:我们最害怕做的事正是我们最应该做的事,就像我曾听说过的那样,一个人的成功与否通常取决于他或者她主动接受令人不快的谈话的次数。下决心每天做一件你所恐惧的事情。我克服恐惧的习惯就是,不断与社会名流和知名商人联系并寻求他们的建议。
  6. 推迟行动的代价是什么?财务上、情感上和身体上?不要只去计算行动会带来的后果。对不行动的惨重代价进行权衡同样重要。如果不去追寻自己有热情的事情,一年以后、五年以后和十年以后你会在哪里?受着客观环境的压制,让自己有限生命中的由一个十年流逝在不喜欢的事情上,那是什么感觉?如果你可以勇望远镜看到十年后的自己,并且百分之百地肯定这是一条充满失望和遗憾的道路,如果我们把风险定义为“出现不可逆转的负面结果的可能性”,那么不行动就是最大的风险。
  7. 你在等待什么?之前,我们已经驳斥了所谓好时机的概念,如果你已不再以此为接口却仍然回答不出这个问题,那么答案很简单:你害怕,就像所有其他人那样。评估一下不行动的代价,想清楚大多数失误发生的可能性和弥补措施,养成那些不断超越并享受人生的最重要的的习惯:行动。

改变让自己自由,改变让自己靠谱!泰坦尼克号撞到了冰山,首先触及的不是看到的冰山而是海平面一下的冰山!!改变会让我们认识到非平时的自我,会让自己惊叹自己!改变可能很慢,像中低温一样的程度和感觉,但只要改变就好!!中低温式改变!!

 

Hello 2011

像我这类过旧历生日的人,习惯按照旧历规划自己.

2010年完成了:

1.工作找到了.

2.毕业了,工作了.

3.成长了

2011年马上就到来了.

2011中,更加多的关注分布式方面的,在技术上,Linkedin,Twitter推出了许多自己的框剪,很多框架都用到了脚本语言-Scala,可见这类语言在2011年必成为新宠儿.

Hadoop的持续升温,数据的爆破式增长,给programmer带来了无尽的挑战.从应用的扩展到海量存储,每一点都是技术点.

Zookeeper的融入,从国外国内对他的使用,可见这个框架的火热.


2011年读书清单:

1.Scala程序设计

2.machine learning

3.规则引擎

4.少有人走的路

5.待定(事实变化,唯有拥抱)

2011年新事—-Blog

个人的价值在于别人的认可,2011年底见分晓吧!

数据一致性的一点想法

数据是随着业务量的增长而呈现爆破式的增长.

不久前,单机还能满足数据的完成存储,我们需要做的仅是数据备份安全.

但当一台机器无法完成数据存储的时候,通常是进行数据的拆分,在数据库方面,人们通过对数据库进行拆分以达到目的.

拆分方式:

1.水平拆分

2.垂直拆分

然而,一套基于数据的存储系统,数据的安全及数据的一致性尤为重要.秉着数据安全高于一些的宗旨.以下是一点感想:

数据一致性的保证:

W+R>N

W:成功写操作的最小节点数

R:成功读的最小节点数

N:复制的节点数

只要保证以上公式就能保证数据的一致性.

在这类的模型里,数据之间存在一个矢量锁(vector clock)来保证数据的最终一致性.

这类方案例如:voldemort,Cassandra…

这里讨论的不是这类nosql的读写能力,而是在异常情况下情况,比如在W=3的情况下,若其中一个W的写入出现滞后的情况,会引起全局写入的波动.此时会发现写入严重下降.引起的原因是单台机器的下降.

将以上方案进行一点变形,引入中心化思想-基于M-S架构的集群

写入的请求会先到到Master,再有Master异步分发到Slave机器中,不去关心写入的成功与失败,若系统运行了长时间,此时数据会出现不一致的情况(master绝对正常,slave中的数据开始延时了),此时需要通过数据校验来完成数据的一致性验证,这类方案在Mysql内部有很多.例如:可参看Mysql中半同步复制机制.

SemiSyncReplication

在mysql中,需要至少开启一个半同步的slave,在master提交事务[写]的之后,只有在只有有一个slave已经接受了这个事务,该事务才算成功.此时若master挂掉了,将会切换到slave上,并重新发起事务.这个可满足高可用性的需求,但若此时master挂掉了.恢复后若原有事务已经提交,就会导致复制出现问题.

将以上方案进行一点变形,引入全局时间服务器

机器等级均等,无中心节点,建立全局时间服务器.

写请求进入的时候,成功写入后异步分发给其他机器.同节点中机器间会进行数据校验.应为使用了全局时间,同一条数据在全部集群内只会存在一个版本.每次同步完成后,都会记录checkpoint.

记录散列到点上,可设计新策略进行二次散列,达到节点的优先选择.例如将机器的URL作为选取条件.实时要求的请求通过id得知自己在那台机器最新(相对的,发生错误的时间:在客户端提交到某天机器(A),.A分发到其他机器未成功(比如B),B还未进行本时刻的数据校验.前端请求到B上get数据,B的数据在此时不实时.).

只要保证拥有全局时间戳作为校验依据即可.

数据校验的过程会存在checkpoint,为了数据安全,唯一要做的保证磁盘空间足够,磁盘会记录数据的操作历史(写操作).数据的分类是按照时间来分割的.so,日志还能用于数据的行为跟踪.

以上仅为个人一点观点,欢迎提出意见.