@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
二进海底,龙宫那边新多出一个海螺,进去就是龙宫密道,里面有DOMO组员杨志豪,把他弄走,就在原地来回跑,会定期出现一大鱼一大虾,殴之,每次法宝加40点。我在这里练蓝格怪衣,这个每用一次也加5点。
posted @
2014-05-10 21:21 哈哈的日子 阅读(476) |
评论 (0) |
编辑 收藏
等到符鬼很饿(能喂2个东西的时候),找到两个相同的喂食物,比如2个狮子精【有一个“狮子吼”技能】,设此时的符鬼有一个技能是“强音波”,点击“狮子吼”两次,符鬼的那个技能就变成了“无” !@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
为了成功,保存好,多来几次!
posted @
2014-05-05 21:43 哈哈的日子 阅读(423) |
评论 (0) |
编辑 收藏
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
在
月河村的客栈,一直向右,到不能再右,向下一步,然后再点宝物就可以了。
posted @
2014-05-05 21:34 哈哈的日子 阅读(474) |
评论 (0) |
编辑 收藏
人成熟与不成熟跟年龄没有关系。人成熟不成熟,就是你能不能站在对方的角度去看待事物,就是能不能把我的世界变成你的世界。这个社会有很多的成年人,还没有脱离幼稚的行为。一点小事情就跟别人争来争去。
人不成熟的第一个特征:就是立即要回报。
他不懂得只有春天播种,秋天才会收获。很多人在做任何事情的时候,刚刚付出一点点,马上就要得到回报。(学钢琴,学英语等等,刚开始就觉得难,发现不行,立即就要放弃。)很多人做生意,开始没有什么成绩,就想着要放弃,有的人一个月放弃,有的人三个月放弃,有的人半年放弃,有的人一年放弃,我不明白人们为什么轻易放弃,但是我知道,放弃是一种习惯,一种典型失败者的习惯。所以说你要有眼光,要看得更远一些,眼光是用来看未来的!
对在生活中有放弃习惯的人,有一句话一定要送给你:"成功者永不放弃,放弃者永不成功"。那为什么很多的人做事容易放弃呢?美国著名成功学大师拿破仑希尔说过:
穷人有两个非常典型的心态:
1、永远对机会说:"不";
2、总想"一夜暴富"。
今天你把什么机会都放到他的面前,他都会说"不"。就是今天你开饭店很成功,你把你开饭店的成功经验,发自内心的告诉你的亲朋好友,让他们也去开饭店,你能保证他们每个人都会开饭店吗?是不是照样有人不干。
所以这是穷人一个非常典型的心态,他会说:"你行,我可不行!"。一夜暴富的表现在于,你跟他说任何的生意,他的第一个问题就是"挣不挣钱",你说"挣钱",他马上就问第二个问题"容易不容易",你说"容易",这时他跟着就问第三个问题"快不快",你说"快"!这时他就说"好,我做!"呵呵,你看,他就这么的幼稚!
大家想一想,在这个世界上有没有一种:"又挣钱,又容易,又快的",没有的,即使有也轮不到我们啊,所以说在生活中,我们一定要懂得付出。那为什么你要付出呢?因为你是为了追求你的梦想而付出的,人就是为了希望和梦想活着的,如果一个人没有梦想,没有追求的话,那一辈子也就没有什么意义了!
在生活中你想获得什么,你就得先付出什么。你想获得时间,你就得先付出时间,你想获得金钱,你得先付出金钱。你想得到爱好,你得先牺牲爱好。你想和家人有更多的时间在一起,你先得和家人少在一起。
但是,有一点是明确的,你在这个项目中的付出,将会得到加倍的回报。就象一粒种子,你把它种下去以后,然后浇水,施肥,锄草,杀虫。最后你收获的是不是几十倍,上百倍的回报。
在生活中,你一定要懂得付出,你不要那么急功近利,马上想得到回报,天下没有白吃的午餐,你轻轻松松是不可能成功的。
一定要懂得先付出!
人不成熟的第二个特征:就是不自律。
不自律的主要表现在哪里呢?
一、不愿改变自己:
你要改变自己的思考方式和行为模式。你要改变你的坏习惯。其实,人与人之间能力是没有多大区别,区别在于思考方式的不同。一件事情的发生,你去问成功者和失败者,他们的回答是不一样的,甚至是相违背的。
我们今天的不成功是因为我们的思考方式不成功。一个好的公式是:当你种植一个思考的种子,你就会有行动的收获,当你把行动种植下去,你会有习惯的收获,当你再把习惯种植下去,你就会有个性的收获,当你再把个性种植下去,就会决定你的命运。
但是如果你种植的是一个失败的种子,你得到的一定是失败,如果你种植的是一个成功的种子,那么你就一定会成功。
很多人有很多的坏习惯,如:看电视,打麻将,喝酒,泡舞厅,他们也知道这样的习惯不好,但是他们为什么不愿意改变呢?因为很多人宁愿忍受那些不好的生活方式,也不愿意忍受改变带来的痛苦
二、愿意背后议论别人:
如果在生活中,你喜欢议论别人的话,有一天一定会传回去,中国有一句古话,论人是非者,定是是非人
三、消极,抱怨:
你在生活中喜欢那些人呢?是那些整天愁眉苦脸,整天抱怨这个抱怨哪个的人,还是喜欢那些整天开开心心的人。如果你在生活中是那些抱怨的,消极的人的话,你一定要改变你性格中的缺陷。如果你不改变的话,你是很难适应这个社会的。你也是很难和别人合作的。
生活当中你要知道,你怎样对待生活,生活也会怎样对待你,你怎样对待别人,别人也会怎样对待你。所以你不要消极,抱怨。你要积极,永远的积极下去,就是那句话:成功者永不抱怨,抱怨者永不成功
人不成熟的第三个特征:经常被情绪所左右。
一个人成功与否,取决于五个因素:
学会控制情绪
健康的身体
良好的人际关系
时间管理
财务管理
如果你想成功,一定要学会管理好这五个因素,为什么把情绪放在第一位呢?把健康放在第二位呢?是因为如果你再强的身体,如果你情绪不好,就会影响到你的身体,现在一个人要成功20%靠的是智商,80%靠的是情商,所以你要控制好你的情绪,情绪对人的影响是非常大的。人与人之间,不要为了一点点小事情,就暴跳如雷,这样是不好的。
所以在生活中,你要养成什么样的心态呢?你要养成"三不","三多":
不批评、不抱怨、不指责;
多鼓励、多表扬、多赞美。
你就会成为一个受社会大众欢迎的人。如果你想让你的伙伴更加的优秀,很简单,永远的激励和赞美他们。
即使他们的确有毛病,那应该怎么办呢?这时是不是应该给他们建议,在生活中你会发现有这样一个现象,有人给别人建议的时候,别人能够接受,但是有建议的时候别人就会生气。其实建议的方式是最重要的,就是"三明治"赞美,建议,再赞美!
想一想,你一天赞美了几个人,有的人可能以为赞美就是吹捧,就是拍马屁。赞美和吹捧是有区别的,赞美有四个特点:
1、是真诚的
2、是发自内心的
3、被大众所接受的
4、无私的
如果你带有很强的目的性去赞美,那就是拍马屁。当你赞美别人时候,你要大声的说出来,当你想批评别人的时候,一定要咬住你的舌头!
人不成熟的第四个特征:不愿学习,自以为是,没有归零心态。
其实人和动物之间有很多的相似之处,动物的自我保护意识比人更强(婴儿与小猪)但是,人和动物最大的区别在于,人会学习,人会思考。人是要不断学习的,你千万不要把你的天赋潜能给埋没了,一定要学习,一定要有一个空杯的心态。我们象谁去学习呢?就是直接向成功人士学习!
你要永远学习积极正面的东西,不看,不听那些消极,负面的东西。一旦你吸收了那些有毒的思想,它会腐蚀你的心灵和人生 的。在这个知识经济的时代里,学习是你通向未来的唯一护照。在这样一个速度,变化,危机的时代,你只有不断的学习你才不会被这个时代所抛弃,一定要有学习,归零的心态。去看每一个人的优点,"三人行,必有我师也"!
人不成熟的第五个特征:做事情不靠信念,靠人言。
我们说相信是起点,坚持是终点。很多人做事不靠信念,喜欢听别人怎么说。对自己所做的事业,没有100%的信心,相信和信念是两个不同的概念,相信是看得见的,信念是看不见的。
信念是人类的一种态度,但是很多的人他们做事,不靠信念的,而是要听别人怎么说,你要登上山峰,要问那些爬到山顶的人,千万不能问没有爬过山的人。
这里不是说别人的建议不要去听,你可以去参考,但是你要记住,你来做这个生意是为了实现你的梦想,实现你自己的价值。其他的人是不会关心你的梦想的,只有你自己关心你自己的梦想,只有你自己关心你自己能否真正的成功。这才是最重要的!
只要你的选择是正确的,永远不要在乎别人怎么说,以上的人不成熟的五个特征,你们自己去对照,那一个特征是你有的,你一定要在最短的时间里改正,只要你相信你自己能够战胜自己的不成熟,你就会逐渐的成长,成熟起来,你就会得到你想要的那种生活。你就会实现你时间自由、财务自由、精神自由的人生梦想!
posted @
2013-11-20 16:17 哈哈的日子 阅读(233) |
评论 (0) |
编辑 收藏
设置了 scanPeriod 之后,过了好长时间,都不生效,后来 debug 代码。发现了下面这段。
private volatile long mask = 0xF;
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,
String format, Object[] params, Throwable t) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
// for performance reasons, skip change detection (MASK-1) times out of MASK.
// Only once every MASK calls is change detection code executed
// Note that MASK is a variable itself.
if (((invocationCounter++) & mask) != mask) {
return FilterReply.NEUTRAL;
}
long now = System.currentTimeMillis();
synchronized (configurationWatchList) {
updateMaskIfNecessary(now);
if (changeDetected(now)) {
// Even though reconfiguration involves resetting the loggerContext,
// which clears the list of turbo filters including this instance, it is
// still possible for this instance to be subsequently invoked by another
// thread if it was already executing when the context was reset.
disableSubsequentReconfiguration();
detachReconfigurationToNewThread();
}
}
return FilterReply.NEUTRAL;
}
这行 if (((invocationCounter++) & mask) != mask) {
mask = 0xf,其实要每循环 0xf 次,也就是 15 次,才会去 check 一次是否要更新,也就是说,不管过了多久,如果没到这 15 次,也不会去检查是否更新配置。
也就是说,我多打几次 log,配置文件就生效了。
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2013-11-12 14:25 哈哈的日子 阅读(1602) |
评论 (0) |
编辑 收藏
spring security(下简写为 ss)控制的安全主要有两方面,Web 和 Method Call,这两个方面的权限控制有比较多的相通的设计,也有一些特别的功能。比如 Method Call 可以做 After Invocation 控制,而 Web 可以做 Ip 地址控制。
这里面有两个最基本的概念:authentication manager 和 access decision manager,前者控制认证,后都控制鉴权。
1. 在 ss 的认证系统中,默认的实现帮助我们提供了三个概念,用户(user),角色(authority,一般存 role)和组(group),三者的关系是,组、角色与用户都是多对多关系,组和角色间没关系,默认是不启用组的。后续,在 Acl 权限管理中,可以看到角色之间,是可以有包含(树形?)关系的。
2. 在 ss 的鉴权系统中,明显会比认证复杂得多。有 AccessDecisionManager, AccessDecisionVoter(前置), AfterInvocationProvider(后置), RoleHierarchy, SidRetrievalStrategy, LookupStrategy, PermissionGrantingStrategy, SecurityExpressionHandler, AclService, MutableAclService, AclCache 概念过多了,要一个一个解释
a) 中心是 AccessDecisionManager,主要负责 AccessDecisionVoter 的管理,默认提供了3种实现:1. AffirmativeBased 如果有任何一个投票器允许访问,请求将被立刻允许,而不管之前可能有的拒绝决定。2. ConsensusBased 多数票(允许或拒绝)决定了结果,平局的投票 和空票(全是弃权的)的结果是可配置的。3. UnanimousBased 所有的投票器必须全是允许的,否则访问将 被拒绝。
AccessDecisionManager 在用于 Web 和 Method Call 两种情况下,可能是不一致的,因为功能也不一致。
b) Method Call 除了使用 AccessDecisionManager 进行权限判断外,还可以增加 AfterInvocationProvider 来进行出口数据的判断,默认提供了 3 种。
1) PostInvocationAdviceProvider: 需要提供一个 PostInvocationAuthorizationAdvice,默认实现只有一个,就是 ExpressionBasedPostInvocationAdvice,可以通过 spel 来进行权限判断。注意 ExpressionBasedPostInvocationAdvice 中需要提供一个 MethodSecurityExpressionHandler,能够创建出一个 MethodSecurityExpressionOperations,放到 spel context 中,供 spel function 调用,这样的方式,在后续很常见。
2) AclEntryAfterInvocationProvider 和 AclEntryAfterInvocationCollectionFilteringProvider : 这两种都差不多,主要依赖 AclService, ObjectIdentityRetrievalStrategy, SidRetrievalStrategy 来配合,检查返回值的权限。Collection 版本的,可以把无权限的数据去掉,只留下有权限的数据。
c) RoleHierarchy 提供了角色之间的关系,提供了两个实现,一个是没关系的,直接把 user 的 role 返回,另外一个是有继承关系的。继承关系实现挺有意思的,能够处理多级的 include 关系,比较好用。
RoleHierarchy 的使用比较复杂,会被 AccessDecisionVoter, SidRetrievalStrategy, SecurityExpressionHandler 用到,SecurityExpressionHandler 又会被 AccessDecisionVoter 用到,所以还是有点儿混乱。
具体的说 SecurityExpressionHandler 会用到 PermissionEvaluator 和 RoleHierarchy,PermissionEvaluator 的一个实现 AclPermissionEvaluator 会用到 SidRetrievalStrategy。
d) SidRetrievalStrategy 和 RoleHierarchy 的功能比较接近,比 RoleHierarchy 高一个抽象层次,功能上也有所区别,是从一个 authentication 拿到所有相关的 Sid(包括 Role(GrantedAuthoritySid) 和 User(PrincipalSid)),而 RoleHierarchy 只包括了 Role(GrantedAuthoritySid)的继承关系。
e) LookupStrategy 通过 ObjectIdentity 和 Sid 把相关的 Acl 查询出来。可以在 LookupStrategy 扩展 Acl 和 Ace 的功能,比如在 Ace 上面加上时间的条件限制,就需要自己定义 LookupStrategy,把时间条件从数据库查询出来,并放到自定义的 Ace 当中。
但这件事情非常麻烦,因为默认实现的 BasicLookupStrategy 是个 Final 的类,所以只能自己直接实现接口,无法使用现有的功能。
LookupStrategy 会生成 Acl,而最终的权限验证是由 Acl 完成的,如果想验证带时间条件的 Ace,需要给 Acl 设置自定义的带有检查时间功能的 PermissionGrantingStrategy,实际上,这个 PermissionGrantingStrategy 会首先设置给 LookupStrategy,LookupStrategy 在创建 Acl 的时候,再放到 Acl 中去。
f) SecurityExpressionHandler 能够执行 spel,得到是否可以访问的结果,它的子类都是继承自 AbstractSecurityExpressionHandler 的,有一个非常重要的方法是 SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, T invocation),创建一个 SecurityExpressionOperations 放到 EvaluationContext 中去,提供 spel 中执行的方法实现。比如 SecurityExpressionOperations 的一个抽象实现 SecurityExpressionRoot 中,就包含了大量的权限验证方法,如 hasRole, hasPermission 等常用的功能。
g) AclService, MutableAclService, AclCache 概念比较简单,AclService 是通过 LookupStrategy 查询 Acl,自已可以查询 ObjectIdentity 的父子关联关系,MutableAclService 提供了修改的能力,AclCache 为 AclService 提供缓存,默认的实现了一个 EhCacheBasedAclCache。
3. ss 的鉴权模型 Sid, ObjectIdentity, Acl, Ace, Permission
a) Sid: 是中心,所有的授权会关联在 Sid 上面,Sid 和之前的 Role Base Permission 会有些相同的地方,但也明显不同,Sid 默认实现情况下,分为 GrantedAuthoritySid 和 PrincipalSid,其实就是 Role 和 User,通过 SidRetrievalStrategy 拿到一个 Authentication 的 Sid。
b) ObjectIdentity: 可以理解成 Resource,就是可访问的目标资源,有 id 和 type 两个字段,默认实现的 ObjectIdentityImpl 会直接调用目标 domainObject 的 getClass 和 getId 方法拿到两个参数。在 PermissionEvaluator, AfterInvocationProvider 中,会用到 ObjectIdentityRetrievalStrategy 和 ObjectIdentityGenerator,ObjectIdentityRetrievalStrategy 会根据 domainObject 拿到 ObjectIdentity,然后使用 Acl 进行鉴权,ObjectIdentityGenerator 会在系统提供的不是 domainObject,而是 type, id 的时候,拿到 ObjectIdentity,然后进行 Acl 鉴权,这两个接口有一个共同的实现 ObjectIdentityRetrievalStrategyImpl,如果需要在 ObjectIdentity 进行新的抽象,需要用新的实现,到得不同的 ObjectIdentity,比如将业务对象分类鉴权这样的需求。
c) Acl, 每个 ObjectIdentity 最多对应一条 Acl,Acl 中包含了很多,包括 parental,说明 Acl 是有继承关系的?其实不是,呵呵,是 ObjectIdentity 有继承关系而已。有一个 ObjectIdentity,有很多 Sid,还有一个叫做 Owner 的 Sid,有从 LookupStrategy 传过来的 PermissionGrantingStrategy,进行实际的鉴权,还有 AclAuthorizationStrategy 检查有没有权限进行 Acl security check。实现时间条件检查,就扩展 PermissionGrantingStrategy。
为什么没有 RoleHierarchy 或是 SidRetrievalStrategy 存在呢?是因为调用 Acl 进行权限检查之前,已经把相关的 Sid 得到了,再给 Acl 的。
d) Ace, Permission: Ace 存储 Sid, Permission,提供给 Acl 鉴权用。增加时间条件的话,最基本的,就是要在 Ace 中,增加时间条件字段。Permission 是用二进制存储的,但默认实现的数据库存储并不是,是一个一条,存在数据库里面的。
好吧,概念还是非常多的,不过鉴于权限控制本身就是个复杂的话题,ss 这些设计的我觉得已经非常好,也基本够用了。
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2013-11-12 14:25 哈哈的日子 阅读(649) |
评论 (0) |
编辑 收藏
Security.setProperty("ssl.SocketFactory.provider", "com.datayes.cloud.util.TrustAllSSLSocketFactory");
package com.datayes.cloud.util;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class TrustAllSSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public TrustAllSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[]{tm}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket(String host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port, localHost, localPort);
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(address, port, localAddress, localPort);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
@Override
public String[] getDefaultCipherSuites() {
return new String[0];
}
@Override
public String[] getSupportedCipherSuites() {
return new String[0];
}
}
posted @
2013-09-10 12:30 哈哈的日子 阅读(1584) |
评论 (0) |
编辑 收藏
主要是遇到的一些问题吧,顺便感谢一下帮助了我的人。安装之前,听说安装正式环境的 OpenStack 挺麻烦的,所以,出发点就是安装一个能测试使用的 Dev 环境就可以了,不求全,时间紧张,能用就行。所以,定位到 devstack(http://devstack.org),一键安装 OpenStack
问题
1. 想用 CentOS 来着,没原因,习惯了,后来发现,devstack 默认支持 ubuntu,为了简单,改用 ubuntu
2. 安装过程中,需要大量的网络下载,网速如果不快,挺急人的。
3. 安装到 stack.sh 的 191 行,会报错 [ERROR] ./stack.sh:191 g-api did not start,这个问题折腾了我好久,最后按照 https://answers.launchpad.net/glance/+question/231020 办法解决了,非常感谢 Marc PINHEDE (pinhede-marc) ,但在 https://bugs.launchpad.net/devstack/+bug/1119428 里,有人说只要修改 /etc/default/locale LANG="POSIX",就可以了,其实我两个都改了,也不知道是哪个产生了作用。但,第一种方法,需要安装到一半,失败了,才会有提到的 /opt/stack/glance/glance/notifier/notify_kombu.py 文件,但第二种方法,刚开始就可以尝试,所以我如果下次安装的话,会先把第二种配置修改好,如果安装失败了,再使用第一种方法继续。
posted @
2013-08-06 10:19 哈哈的日子 阅读(616) |
评论 (0) |
编辑 收藏
在 compile hadoop-common 的时候,提示 protobuf 出错,查了一下,需要安装 protobuf(是一个非 Java 的组件)
先到 homebrew 上找到安装 homebrew 的方法 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
然后不能直接 brew install protobuf,因为会安装 1.5.0,也没办法编译过的,我试了。
需要先 brew versions protobuf,然后 cd `brew --prefix`(我默认的是 cd /usr/local),直接招待刚才 brew versions 出来的那个 git clone 方法。
然后再次 brew install protobuf ,就安装 1.4.1 了,继续 maven 就没有问题了。
posted @
2013-07-24 13:24 哈哈的日子 阅读(369) |
评论 (0) |
编辑 收藏
在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了。
posted @
2013-07-24 13:20 哈哈的日子 阅读(380) |
评论 (0) |
编辑 收藏
一直以来,总有人说 IDEA 这个 IDE 要比 Eclipse 好。中间也做过几次尝试,均告放弃。原因虽然各种各样,但归结起来,就是没时间,毕竟熟悉一个 IDE 是要时间的,项目中很少会有这么轻松的时候,又不愿意过多使用业余时间,就这样放下了。
最近有了一些时间,又把这东西拾起来看了看。不得不说,有些地方,做得还是很好的,当然,也有比 Eclipse 差的地方,我估计已经有无数人对比过了,我也不再比了,focus 在我的关注点上:“快捷键”
IDEA 因为使用的是原生的 Java 而不是 swt,对于平台集成方面,不如 Eclipse。
比如在 Eclipse 中,可以设置 Option + B 这样的快捷键,而 IDEA 不行,因为 Option + B 在 Mac 下是有输出字符的。
为了解决这个问题,我到 KeyRemap4MacBook 中,把 Option + B 改成 Option + Left,同理,把 Option + F 改成 Option + Right
这时,在 IDEA 中比较常用的快捷键 Command + Option + B 就变成了 Command + Option + Left,成了后退了。
还需要在 KeyRemap4MacBook 中把 Command + Option + B 恢复成他自己,而且一定要放在 Option + B 前面,否则就没用了。
最终,我得到了这样的 private.xml
<?xml version="1.0"?>
<root>
<item>
<name>haha</name>
<identifier>private.haha</identifier>
<autogen>--KeyToKey-- KeyCode::P,VK_CONTROL, KeyCode::CURSOR_UP</autogen>
<autogen>--KeyToKey-- KeyCode::N,VK_CONTROL, KeyCode::CURSOR_DOWN</autogen>
<autogen>__KeyToKey__ KeyCode::F,VK_OPTION, KeyCode::CURSOR_RIGHT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION,VK_COMMAND, KeyCode::B,VK_OPTION,VK_COMMAND</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION, KeyCode::CURSOR_LEFT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::D,VK_OPTION, KeyCode::FORWARD_DELETE,VK_OPTION</autogen>
</item>
</root>
posted @
2013-07-22 13:22 哈哈的日子 阅读(325) |
评论 (0) |
编辑 收藏
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {
// load next
}
});
posted @
2012-12-19 18:10 哈哈的日子 阅读(430) |
评论 (0) |
编辑 收藏
把这个文件放到 WEB-INF/classes 下面,随便申请一个临时 License 就可以了,会变成 Enterprice 的,其它信息保留。
posted @
2012-12-14 17:23 哈哈的日子 阅读(549) |
评论 (0) |
编辑 收藏
今天想在 log 里加上当前机器的 ip,找了一些文档,logback 支持 MDC(Mapped Diagnostic Contexts),可以很容易的把 ip 放到 log 中。
方法:
1. 先在代码中加上一行 MDC.put("ip", InetAddress.getLocalHost().getHostAddress())
2. 然后在 logback 的 pattern 中加上 %X{ip} 即可
posted @
2012-12-14 14:58 哈哈的日子 阅读(5134) |
评论 (0) |
编辑 收藏
vi /etc/yum.conf 将exclude=kernel* 去掉
posted @
2012-12-14 13:45 哈哈的日子 阅读(360) |
评论 (0) |
编辑 收藏
1. 建立 winexe 环境,build winexe 并不麻烦,只不过官方文档比较少,下载到 source 之后,也不知道要如何 build。后来找到一个文档,介绍了过程
cd winexe-1.00/source4
./autogen.sh
./configure
make
./bin/winexe -U “<user>%<password>” //<windows system> cmd.exe
2. 如何远程执行,命令比较很简单,但又是环境问题,我们在 windows 下面建立了一个 administrators 组的用户,但无法执行,后来打开了 administrator 这个用户,终于命令可以执行了。
我们的脚本有两个步骤,1. 杀掉旧进程,2. 启动新的进程,如下:
winexe -U "administrator%admin" //172.16.107.243 "taskkill /F /T /im java.exe"
cat < /dev/null | winexe -U "administrator%admin" //172.16.107.243 "java -jar c:\agent\job-agent.jar" >> /home/glodon/logs/agent243.log 2>&1 &
启动新进程的时候,遇到了非常麻烦的事情,只能前台执行,nohup , & 这些完全不灵,如果 nohup,就会报错,后来得到了一个方法,cat < /dev/null | winexe 解决了这个问题。
3. jenkins 执行,jenkins 使用 Post Shell Plugin 来调用这个脚本,调用的时候一定要 nohup start.sh > /dev/null &,否则在执行完之后,会发个 sign,会把进程结束掉。
注意,还必须要 > /dev/null,否则就会出错,实在搞不明白原因。
弄好了这个,以后就方便了,心情也挺好。
posted @
2012-12-14 13:25 哈哈的日子 阅读(441) |
评论 (0) |
编辑 收藏
呵呵,有图有真相。
用 ipad 发的 imessage,挺有意思的,不知不觉,孩子已经这么大了。
@import url(/css/cuteeditor.css);
posted @
2012-11-21 16:24 哈哈的日子 阅读(645) |
评论 (0) |
编辑 收藏
主要完成了下面4个工作
1. 创建一个本地的目录结构,以存放 rpm 包
2. 启动一个 apache,使这些文件能够远程访问
3. 写一个 spec,并且用 rpmbuild 做成一个安装包,用来在机器上安装新的 repository 位置
4. 使用 yum downloadonly plugin 将需要的 rpm 包放到本地目录下,然后使用 createrepo 命令创建 metadata
本来是希望能有一个类似于 nexus 这样的 proxy host server 将远程的 package cache 下来,找来找去,也找到了一个 nexus yum plugin,但这个 plugin 只支持手工的 deploy rpm package 到 nexus 上面,不能做 proxy 方式的。
写写步骤和遇到的问题吧。
准备工作
- 安装 createrepo, yum install createrepo
- 安装 yum download only plugin, yum -y install yum-downloadonly
- 安装 rpmbuild, yum -y install rpm-build
- 确认已经安装了 apache nginx 之类的 http server
服务器步骤
- 首先是创建目录结构,比如 mkdir -p /data/yum/centos/6/x86_64
- 先增加 chef 的源,rpm -Uvh http://rbel.frameos.org/rbel6
- 然后是通过 yum -y install rubygem-chef-server –downloadonly –downloaddir=/data/yum/centos/6/x86_64
- 这时,已经可以去掉 chef 的公共源了,rpm -e rbel6-release
- 创建本地库的 metadata,createrepo /data/yum/centos/6/x86_64,还有一些参数可用,比如 -p, pretty xml, -d create sqlite database files
- 配置 apache,修改 /etc/httpd/conf/httpd.conf,修改 DocumentRoot 和 Directory 位置,改为 /data,并启动 httpd -k start,也可以使用 chkconfig –level 3 https on,每次开机启动
客户端步骤
- 首先要制作安装 repository 位置的 rpm 包
- 创建文件 haha.repo,放到 /root/rpmbuild/SOURCES 目录下,这个是将来 copy 到客户端的 /etc/yum.repos.d/ 目录下的配置文件,内容为
[haha]
name=haha
baseurl=http://192.168.157.131/yum/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
- 再创建文件 build spec 文件,放到 /root/rpmbuild/SOURCES 目录下,是为了创建 rpm 包用的,haha.spec
Summary: haha
Name: haha
Version: 0.1
Release: 1
Source0: haha
Group: Applications/Internet
License: GPLv2+
URL: http://192.168.157.131/yum/
#BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildArch: noarch
%description
The haha yum repo
#%prep
#%setup -q
%install
mkdir -p $RPM_BUILD_ROOT/etc/yum.repos.d
install -m 0644 -p %{SOURCE0} $RPM_BUILD_ROOT/etc/yum.repos.d
%clean
rm -rf ${RPM_BUILD_ROOT}
%files
/etc/yum.repos.d/haha.repo
- 使用 rpmbuild -ba haha.spec,做出一个 rpm 包,位置在 /root/rpmbuild/RPMS/noarch 下面
- 制作一次 rpm 后,就可以一直使用了,rpm -ivh xxx.rpm 就可以了
参考了
1. 自建yum源与制作RPM安装包yum源
2. yum只下载rpm包不自动安装方法
3. Installing Chef Server 0.10 in RHEL 6
posted @
2012-11-07 21:39 哈哈的日子 阅读(315) |
评论 (0) |
编辑 收藏
最近很少用鼠标了,触摸板还是没有鼠标灵活的,所以,很大希望都寄托在键盘上面了,快捷键就变成了优先级最高的关注点。
Sublime Text 的快捷键总是零零散散记了一些的,今天才发现,原来在 Preferences -> Key Bindings - Default 里面有全部的快捷键定义,以后不知道什么的时候,来看一眼就好了。
posted @
2012-10-26 15:47 哈哈的日子 阅读(270) |
评论 (0) |
编辑 收藏
想了好久好久了,终于买到了。老婆送的生日礼物,老婆大人实在是太体贴了!
之前给朋友买了一个红轴的机械键盘,只玩了几把 dota 就给人了,也没感觉到什么,反正我玩 dota 的水平提升了 10%,呵呵。
先说说拿到 hhkb 的感觉吧。
1. 个头,比想象的还要小,60 键的小键盘实在是太小了,喜欢!
2. 键盘包,我还顺便买了一个放 hhkb 的包,也是从日本带回来的(最近因为某人钓鱼的问题,搞得我怪紧张的),拿回来了才发现,made in china,nnd,这东西国内居然还买不到!实在是无语
3. 键位,刚开始的时候,对 Delete 的位置很不习惯,大概用了一个小时左右,大概习惯了。Ctrl 的位置是之前一直在用的,所以非常舒服。比较纠结的是方向键,我之前还以为左边会有一个 fn 键给我组合,没想到 pro 没有,只有 lite 才有,pro 只有右边有一个 fn,只好在需要方向键的时候,手离开主键盘区了。
4. 手感,手感实在是无与伦比了,用了这个打字之后,就不太愿意回到 mac 的巧克力键盘上了,差别的确有些大。
5. 声音,这玩意声音还有点儿大啊,比我之前想得还要大一些,在办公室的环境下,应该是不会影响到什么的,之前还是有点儿心虚,怕影响到别的,后来渐渐习惯了,发现别人根本就听不到,也就慢慢的放心了。呵呵
工作中遇到问题吧
因为主要是 Java 开发,所以 IDE 主要用的是 Eclipse,Eclipse 里面用 hhkb 有两个比较麻烦的地方:
1. 经常要用到方向键,比如语法提示之后,需要用上下来选择你要的那个,这个我用 keyremap4mac 把 Ctrl + N 和 Ctrl + P 直接改成上下了,可以用了。
2. Eclipse 经常要用到 Fx 键,这个相当麻烦,比如,切换 Editor 要 Cmd + F6,换 View 要 Cmd + F7,换视图要 Cmd + F8,执行最后执行的程序要 Cmd + Shift + F11,这时候,我就会发现,我已经有点儿搞不定了,没办法,我估计我要去修改 Eclipse 的快捷键了,因为那个 Cmd + F11 实在是太常用了。
遇到开心的事儿
在 Terminal 下面,用起来非常舒服的,这个键盘本来就是为了 vi , emacs 之类的东西存在的,在 Termial 标准的 Emacs 快捷键下,用起来非常好,基本不用想什么,就一切都很顺利了。
在 OS X 系统下,大部分时候 Emacs 的快捷键 Ctrl + fbnpaek 这些快捷键都是好用的,也是比较舒服的原因之一,但 Option + fbd 这类的快捷键经常不能用,比较郁闷。
无论如何,这个键盘还是带给了我不少的快乐,首先达到了 Happy 的效果,以后慢慢的来体会 Hacking 的感觉吧。
加油!
posted @
2012-10-13 09:33 哈哈的日子 阅读(1723) |
评论 (1) |
编辑 收藏
http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
ResultSet
By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and cannot allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.
To enable this functionality, create a Statement
instance in the following manner:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE
serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.
There are some caveats with this approach. You must read all of the rows in the result set (or close it) before you can issue any other queries on the connection, or an exception will be thrown.
The earliest the locks these statements hold can be released (whether they be MyISAM
table-level locks or row-level locks in some other storage engine such as InnoDB
) is when the statement completes.
If the statement is within scope of a transaction, then locks are released when the transaction completes (which implies that the statement needs to complete first). As with most other databases, statements are not complete until all the results pending on the statement are read or the active result set for the statement is closed.
Therefore, if using streaming results, process them as quickly as possible if you want to maintain concurrent access to the tables referenced by the statement producing the result set.
posted @
2012-06-29 13:15 哈哈的日子 阅读(471) |
评论 (0) |
编辑 收藏
在 Mac 上配置 Apache 和 SVN 极其方便。
序:
之前在 Windows 上,因为心里美的原因,配置过 Apache 和 SVN 集成,使用 http 协议来访问 SVN。配置过程有些麻烦,也容易出错。
后来,一直使用 svnserve -d,在 windows 上一般还会用 sc 命令做成 service,因为简单方便。
后来因为试验的目的,在 Mac 上配置了 Apache 和 SVN,我的 OS X 是 10.7 Lion
居然极其简单,只要在“系统偏好设置” -> “共享” 中,把 Web 共享打开,然后把个人网站点开(仅仅是不想修改全局配置文件)
然后修改文件 /private/etc/apache2/users/你的用户名.conf ,里面加上
# svn module
LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so
<Location /svn>
DAV svn
SVNListParentPath on
SVNParentPath "/repository/svn/path"
</Location>
就可以了,
两个 svn 相关的 module 已经放好了,只要 load 一下就行。
配置方面还可以增加认证等等。为了权限管理得更细致,也可以使用 SVNPath 而不是 SVNParentPath。
唉,真是方便,Mac 用来开发,不错!
posted @
2012-05-10 14:43 哈哈的日子 阅读(235) |
评论 (0) |
编辑 收藏
ssh 免密码登录,需要使用公私钥来认证@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
首先通过 ssh-keygen 生成一对公私钥,默认在 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_rsa,前面的是公钥。
认证就是要把这个文件加到远程用户目录 ~/.ssh/authorized_keys 文件中,而且这个文件的权限不能被其它人访问。
下面的脚本能够自动把这个文件放到远程,方法是 ./addpk ip username password
#!//usr/bin/expect
set host [lrange $argv 0 0]
set user [lrange $argv 1 1]
set passwd [lrange $argv 2 2]
proc ssh {cmd} {
global user host passwd
spawn ssh $user@$host "$cmd"
expect {
"*conne*" {
send "yes\n"
expect "*password*"
send "$passwd\n"
expect eof
}
"*password*" {
send "$passwd\n"
expect eof
}
}
}
proc scp {src dest} {
global user host passwd
spawn scp $src $user@$host:$dest
expect {
"*conne*" {
send "yes\n"
expect "*password*"
send "$passwd\n"
expect eof
}
"*password*" {
send "$passwd\n"
expect eof
}
}
}
ssh "mkdir -p ~/.ssh"
scp "/home/user1/.ssh/id_rsa.pub" "~/.ssh/id_rsa.pub"
ssh "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys"
ssh "uniq ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp"
ssh "mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys"
ssh "chmod 700 ~/.ssh"
ssh "chmod 600 ~/.ssh/*"
posted @
2012-05-08 09:38 哈哈的日子 阅读(733) |
评论 (0) |
编辑 收藏
在 Eclipse 中执行下面代码。
byte[] bytes = new byte[]{-16, -97, -116, -70};
String s = new String(bytes, "UTF-8");
System.out.println(s);
结果打印出了一朵花,呵呵,实在是太有意思了。
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2012-04-17 15:25 哈哈的日子 阅读(173) |
评论 (0) |
编辑 收藏
Picasa 像册真的很给力,2048 像素以下(包含)的照片不计算空间,据说 15 分钟以内的也不算空间,除了这些,有1G的空间可以使用。
我现在用的 Aperture 或者是 iPhoto 都有 Picasa Plugin,上传照片非常方便,除了需要fanqiang外,没什么其它问题了。
虽然 Aperture 和 Facebook, Flickr 好像集成的更好,可实际上,Facebook 像素低,还不能选,Flickr 空间有要求。
posted @
2012-02-27 10:54 哈哈的日子 阅读(260) |
评论 (0) |
编辑 收藏
这个文件已经在 /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar
这里了,我在混淆代码的时候会用到,只要做个 link 就好了,如下:
sudo ln -s /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/lib/rt.jar
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2012-02-10 10:48 哈哈的日子 阅读(2370) |
评论 (0) |
编辑 收藏
目前有一个 10 台机器的小网,只有其中一台机器能够通过外网访问,其它机器需要先 ssh 到外网机器,然后再 ssh 一下,才能访问到,很麻烦,一些 scp 之类的软件也没法使用。之前,我一直是用 secure crt 端口转发来做的,也算方便,缺点就是一直要开一个 secure crt 窗口,还不能断,否则就全断开了。
后来同事告诉了我一个办法,叫 iptables,利用这台外网机器自己来进行转发,试了一下,的确要更方便一些。
iptables 本身是用来做 linux 防火墙的,还有一些转发功能。
配置起来比较方便。iptables 的配置文件是放在 /etc/sysconfig/iptables 下面的,缺省是没有这个文件的,需要先执行
外网机器:
外网 ip: 202.118.1.125
内网 ip: 111.111.111.111
端口: 8112
内网机器:
ip: 111.111.111.112
命令:
iptables -t nat -A PREROUTING -d 202.118.1.125 -p tcp --dport 8112 -j DNAT --to-destination 111.111.111.112:22
iptables -t nat -A POSTROUTING -d 111.111.111.112 -p tcp --dport 22 -j SNAT --to 111.111.111.111
iptables -A FORWARD -o eth0 -d 111.111.111.112 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0 -s 111.111.111.112 -p tcp --sport 22 -j ACCEPT
然后再 iptables-save 这个文件就出来了。
通过 service iptables restart 就可以启动 iptables 服务。
奇怪的是 111.111.111.111 这台机器并没有 listen 8112 的端口,但你只要 ssh 202.118.1.125 8112,就真的能够连到 111.111.111.112 这台机器上,算是留下一个疑问吧。
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2012-01-29 16:04 哈哈的日子 阅读(1409) |
评论 (0) |
编辑 收藏
L-Larry_Lau@163.com#24777-1i8da63tvtyl2#1119
L-Larry_Lau@163.com#61624-1dvrt8wj18v1#6260
L-Larry_Lau@163.com#50028-se4zkrr1m6t1#10246
L-Larry_Lau@163.com#15600-189y158nwwvuk#339
L-Larry_Lau@163.com#30640-1lklqdbcjmhxs#4016
L-Larry_Lau@163.com#57474-53b2wr1311gnz#10228
L-Larry_Lau@163.com#19667-11r2awc10nqelb#4016
L-Larry_Lau@163.com#60353-pphob7wraf0y#515
L-Larry_Lau@163.com#65157-1ae6ytp7ygj8m#0012
L-Larry_Lau@163.com#16226-1n5h5951019s7s#7343
posted @
2011-12-27 21:04 哈哈的日子 阅读(1521) |
评论 (1) |
编辑 收藏
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
问题:
1. centos 5.5 通过 yum 安装 mysql,启动,一切正常。但是,修改 my.cnf 中的 datadir 到自定义目录,并初始化好数据库,使用原来的 mysql 文件就无法启动了。
2. 通过 heartbeat 启动 mysql 遇到同样的问题。
解决:
修改 /etc/selinux/config 文件中的 SELINUX=disabled,就可以运行了。
过程:
定位问题的过程中,发现,只要 copy 出来的 mysql 脚本,就可以执行,原来的依然不可以。或者 mysql 数据库文件放到 /var/lib/mysql 下,就可以,其它位置,就不行。
猜测,文件属性有什么不一样的?通过 ls -l 看权限,和 lsattr 看属性,都一模一样。
但,知道原因后,使用 ls -Z 可以看到 selinux 相关的属性,这些文件是不一样的。
原因:
不太清楚原因,但肯定的是,selinux 相关属性影响的,有空仔细看看相关文档。
下面这篇写得不错:
http://www.linux.gov.cn/netweb/selinux.htm
SELinux简介
SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,据称相当于B1级的军事安全性能。比MS NT所谓的C2等高得多。
应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。 SELinux vs Linux 普通Linux安全和传统Unix系统一样,基于自主存取控制方法,即DAC,只要符合规定的权限,如规定的所有者和文件属性等,就可存取资源。在传统的安全机制下,一些通过setuid/setgid的程序就产生了严重安全隐患,甚至一些错误的配置就可引发巨大的漏洞,被轻易攻击。
而SELinux则基于强制存取控制方法,即MAC,透过强制性的安全策略,应用程序或用户必须同时符合DAC及对应SELinux的MAC才能进行正常操作,否则都将遭到拒绝或失败,而这些问题将不会影响其他正常运作的程序和应用,并保持它们的安全系统结构。
SELinux的相关配置文件
SELinux的配置相关文件都在/etc/selinux下,其中/etc/selinux/targeted目录里就包含了策略的详细配置和context定义,以下是主要文件及功用:
/etc/selinux/targeted/contexts/*_context 默认的context设置
/etc/selinux/targeted/contexts/files/* 精确的context类型划分
/etc/selinux/targeted/policy/* 策略文件
Apache under SELinux
Apache under SELinux - 让Apache跑得顺起来!
对于刚使用Redhat Enterprise Linux 4 或Fedora Core 2以上/CentOS 4的用户,一定会为Apache经常无法正常运转,报以"Permission denied"等错误而大为不解,甚至大为恼火。
其实这是因为这些系统里激活了SELinux,而用户的apache配置与SELinux的配置策略有抵触产生的,只有通过适当调整,使apache的配置和访问符合策略才能正常使用。
现在下面来分析一下SELinux中有关httpd(apache)的context定义(略有删节)
/home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t
/var/www(/.*)? system_u:object_r:httpd_sys_content_t
/var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t
/var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t
/etc/vhosts -- system_u:object_r:httpd_config_t
/usr/sbin/httpd -- system_u:object_r:httpd_exec_t
/usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t
/usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t
/var/log/httpd(/.*)? system_u:object_r:httpd_log_t
/var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t
/var/log/cgiwrap\.log.* -- system_u:object_r:httpd_log_t
/var/cache/ssl.*\.sem -- system_u:object_r:httpd_cache_t
/var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t
/var/run/apache(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
/var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t
/var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t
/etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t
/usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t
/usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t
/var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t
/var/run/apache-ssl(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
/var/run/gcache_port -s system_u:object_r:httpd_var_run_t
/var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t
/usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t
/usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t
/var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t
针对上述的内容,可以对如下的几个常见问题进行简单处理:
1.phpmyadmin在非默认/var/www/html目录下无法运转
通常类似的情况都是在配置了虚拟主机时,访问/phpmyadmin等提示403访问拒绝,日志里也提示Permission denied,这是因为phpmyadmin防止的目录及文件本身属性不符合context要求。
假设phpmyadmin放在/web目录下,那么执行:
chcon -R -t httpd_user_content_t /web
则会令/web及其下所有子目录/文件,包括phpmyadmin文件都获得了httpd_user_content_t的属性,如果其传统的Unix属性对httpd来说是可读的话,再重新访问一下就应该可以了。
2./home目录下的虚拟主机无法运转
与问题1也是类似的,不过根据上文中context的定义,/home目录下必须是用户的$HOME/www或public_html或web目录才是 httpd_user_content_t类型,因此建议将要作为web页面的内容放置在用户的$HOME/www或web或public_html里,并确保其属性是httpd_user_content_t,使用如下命令查看:
ls -Z /home/abc/
drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp
drwxrwxr-x abc abc user_u:object_r:httpd_user_content www
如不是,则可通过chcon来逐级目录及文件更改,直至最后能访问:
chcon -R -t httpd_user_content_t /home/abc/web
chcon -t user_home_dir_t /home/abc
3.CGI程序无法运行
如果cgi程序放在/var/www/cgi-bin/里也无法执行,遇到403或500错误的话,可以检查cgi程序的属性,按SELinux contexts文件里定义的,/var/www/cgi-bin/里必须是httpd_sys_script_exec_t 属性。通过ls -Z查看,如果不是则通过如下命令更改:
chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi
如果是虚拟主机里的cgi,则参考问题2使之能正常使用普通的功能后,再通过chcon设置cgi文件的context为httpd_sys_script_exec_t即可。
4.Setuid/gid 程序无法运行
例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下这将受到严格限制。第一种方法是比较彻底的办法,能保留系统的安全性,通过:
audit2allow -l -i /var/log/messages
将SELinux拒绝的信息转换为相应的policy allow指令,将这些指令添加到SELinux policy 的src里相应的配置文件,重新生成policy并加载。但这样做相对比较麻烦。
另一个方法最简单,但将使apache得不到保护。首先确定SELinux 类型是targeted的:
cat /etc/selinux/config|grep SELINUXTYPE
然后,使apache脱离SELinux保护:
setsebool -P httpd_disable_trans 1
然后重启动apache:
/etc/init.d/httpd restart
这样所有apache强制的检查都失效,需要setuid/gid的程序可以正常使用。但这样带来了增加漏洞的危险,对于迫切需要运行而又很急的情况,本方法是一个最大限度减少系统安全缺失的最后办法。对于取消SELinux 未必是一个好方法。
SElinux的几个相关命令
一.
ps -Z
ls -Z
id -Z
例:
[root@ljj cgi-bin]# ls -Z
-rwxrwxrwx root root root:object_r:httpd_sys_script_exec_t a.cgi
-rw-r--r-- root root root:object_r:httpd_sys_script_exec_t a.txt
二. chcon
修改文件的属性 fild1:fild2:fild3
chcon -u fild1 file
chcon -l fild2 file
chcon -t fild3 file
例:
chcon -u root file1
三.getsebool
获取se相关的bool值
例:
[root@ljj cgi-bin]# getsebool -a | grep httpd
httpd_builtin_scripting --> inactive
httpd_disable_trans --> active
httpd_enable_cgi --> active
httpd_enable_homedirs --> active
httpd_ssi_exec --> active
httpd_tty_comm --> inactive
httpd_unified --> inactive
得到了一些与httpd相关的bool值,配置httpd.conf中的user_dir时,要保证这里的httpd_enable_homedirs是 active的,还要保证:
chcon -R -t httpd_sys_content_t ~user/public_html;
- httpd与selinux之间的关系更多详见:man httpd_selinux
四. togglesebool
给se的相关bool值取反
例:
togglesebool httpd_enable_homedirs
posted @
2011-12-22 18:41 哈哈的日子 阅读(605) |
评论 (0) |
编辑 收藏
本次操作环境:
Ubuntu Server 10.10
SCSI Harddisk:/dev/sda 500GB
U盘:/dev/sdb 8GB(模拟成USB Harddisk,安装OS)
介绍2种分区表:
MBR分区表:(MBR含义:主引导记录)
所支持的最大卷:2T (T; terabytes,1TB=1024GB)
对分区的设限:最多4个主分区或3个主分区加一个扩展分区。
GPT分区表:(GPT含义:GUID分区表)
支持最大卷:18EB,(E:exabytes,1EB=1024TB)
每个磁盘最多支持128个分区
所以如果要大于2TB的卷或分区就必须得用GPT分区表。
Linux下fdisk工具不支持GPT,得使用另一个GNU发布的强大分区工具parted。
fdisk工具用的话,会有下面的警告信息:
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.
下面是用parted工具对/dev/sda做GPT分区的过程:
root@node01:/mnt# parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk
will be lost. Do you want to continue?
Yes/No? yes
(parted) print
Model: DELL PERC 6/i Adapter (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted)mkpart primary 0KB 500GB
Warning: You requested a partition from 0.00B to 500GB.
The closest location we can manage is 17.4kB to 500GB.
Is this still acceptable to you?
Yes/No? yes
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) print
Model: DELL PERC 6/i Adapter (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB primary
(parted)quit
Information: You may need to update /etc/fstab.
root@node01:/#fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/sda: 499.6 GB, 499558383616 bytes
255 heads, 63 sectors/track, 60734 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sda1 1 60735 487849983+ ee GPT
root@node01:/#mkfs.ext4 /dev/sda1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
30490624 inodes, 121962487 blocks
6098124 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=4294967296
3722 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@node01:/#mount /dev/sda1 /export/glusterfs01/
root@node01:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/node01-root
6.8G 987M 5.5G 16% /
none 7.9G 208K 7.9G 1% /dev
none 7.9G 0 7.9G 0% /dev/shm
none 7.9G 32K 7.9G 1% /var/run
none 7.9G 0 7.9G 0% /var/lock
/dev/sdb1 228M 21M 196M 10% /boot
/dev/sda1 458G 198M 435G 1% /export/glusterfs01
root@node01:/#vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
/dev/mapper/node01-root / ext4 errors=remount-ro 0 1
# /boot was on /dev/sdb1 during installation
UUID=c21707ff-ba0f-43ee-819a-8e72fa0f8500 /boot ext2 defaults 0 2
/dev/mapper/node01-swap_1 none swap sw 0 0
/dev/sda1 /export/glusterfs01 ext4 defaults 0 2
重启就可以自动挂载了!至此完成。
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2011-12-21 15:56 哈哈的日子 阅读(16442) |
评论 (0) |
编辑 收藏
1. cross join 就是笛卡尔积
那看起来好象和 inner join 是一样的,在 SQL 标准中定义的是 cross join 就是没有条件的 inner join。在 mysql 中,不区分,这两个等价。
2. natural (left) join 是把两个表名字一样的列,做相等条件处理,比如:
t1
id1 name
t2
id2 name
那么 select t1.id1, t2.id1, t1.name from t1 natural join t2 就等价
select t1.id1, t2.id1, t1.name from t1 join t2 on (t1.name = t2.name)
自动把一样名称的列(name)做了个相待条件处理,多列也会同时处理。
所以,这两种 join 没人用是有原因的。
cross join 没意义,一般用逗号就可以了。
natural 降低了可读性,不建议使用。
posted @
2011-10-13 18:06 哈哈的日子 阅读(621) |
评论 (0) |
编辑 收藏
一个好软件,会让人觉得赏心悦目
会让人心旷神怡
会开心
会……
H2DB 就是这样的一个好软件,就一个感觉----舒服!
比如:group by sort 的实现
private void queryGroupSorted(int columnCount, ResultTarget result) {
int rowNumber = 0;
setCurrentRowNumber(0);
Value[] previousKeyValues = null;
while (topTableFilter.next()) {
setCurrentRowNumber(rowNumber + 1);
if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {
rowNumber++;
Value[] keyValues = new Value[groupIndex.length];
// update group
for (int i = 0; i < groupIndex.length; i++) {
int idx = groupIndex[i];
Expression expr = expressions.get(idx);
keyValues[i] = expr.getValue(session);
}
if (previousKeyValues == null) {
previousKeyValues = keyValues;
currentGroup = New.hashMap();
} else if (!Arrays.equals(previousKeyValues, keyValues)) {
addGroupSortedRow(previousKeyValues, columnCount, result);
previousKeyValues = keyValues;
currentGroup = New.hashMap();
}
currentGroupRowId++;
for (int i = 0; i < columnCount; i++) {
if (groupByExpression == null || !groupByExpression[i]) {
Expression expr = expressions.get(i);
expr.updateAggregate(session);
}
}
}
}
if (previousKeyValues != null) {
addGroupSortedRow(previousKeyValues, columnCount, result);
}
}
看着太舒服了。
posted @
2011-10-12 13:52 哈哈的日子 阅读(259) |
评论 (0) |
编辑 收藏