Spring Autowired 故障处理一则

今天下午耽误了很长时间都在处理Autowired的问题,趁没有睡觉赶快写下来,提醒自己以后处理问题不要再走冤枉路。也为大家做个反面教材,不过中间用到的一些shell命令,也可以帮助大家在找类似问题时提高效率。

异常: 很常见
Could not autowire field: private aaa.bbb.PhotoService com.xiaonei.platform.component.application.like.LikeInternalContentService.photoService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.xiaonei.album.service.PhotoService] is defined: Unsatisfied dependency of type [class com.xiaonei.album.service.PhotoService]: expected at least 1 matching bean


检查过程:
-1. 定位到 aaa.bbb.PhotoService 问题,(这是正确的,以为很快会解决
0. 以为自己的pom.xml依赖问题。
反复检查,没有发现问题。(耽误了时间,开始紧张,感到这个问题很麻烦
1. 检查class path下所有的确实包含。
for i in `ls target/web/WEB-INF/lib/*.jar` ; do echo $i ; unzip -l $i | grep aaa.bbb.PhotoService ;done;
判断为没有注入
2. 检查所有applicationContext*.xml没有问题(步骤是对的,但是没有查全,后来就悲剧了)
mkdir aaa; for i in `ls *.jar` ; do unzip -x $i -d aaa/$i/  ;done;
find . -name \*.xml | xargs grep PhotoService
迷惑。。。。
重复1,2 若干次,耽误时间。(这个时候快崩溃了,以为自己遇到了什么高深问题,还找来了别的同学一起帮忙找,结果其他人也被我的紧张给迷惑了。
以为是容器问题,tomcat初始化顺序问题。换resin。(现在想起来,当时纯属是在碰运气

晚上回家冷静后,想起可能是自己工程定义的同名bean问题(当时没有检测自己工程的applicationContext)。检查果然是。

看似一个小问题,背后暴露了很多大问题,从个人到整个框架,就不再这里说了。

Advertisements

解决文件名mp3标签和文本文件内容的乱码问题 – Ubuntu中文

解决文件名mp3标签和文本文件内容的乱码问题 – Ubuntu中文

做个备案

基于命令行的工具

需要用到的工具

sudo apt-get install convmv iconv python-mutagen
sudo apt-get install convmv python-mutagen (iconv 不需要单独指定安装,2011.8.19,wangtai)

要转换文件编码请先进入要转换文件的目录

转换文件名由GBK为UTF8

convmv -r -f cp936 -t utf8 –notest –nosmart *

转换文件内容由GBK到UTF8

iconv -f gbk -t utf8 $i > newfile

转换 mp3 标签编码

find . -iname “*.mp3” -execdir mid3iconv -e GBK {} \;

注意:保证自己对需转换文件有写权限

Facebook内部人才建设的5条潜规则

Facebook内部人才建设的5条潜规则_互联网的一些事

Facebook内部人才建设的5条潜规则
时间:2011-07-05 01:43来源:董释德 作者:董释德 围观: 次

  Facebook产品第二研究中心执行总监胡智鑫(George Hu)接受@IT你懂的 专访时谈到了一个成功互联网企业的内部人才建设规划,与目前中国最大的不同在于西方人更喜欢创造一份舒适又有挑战的工作,而在中国是一群人挤破脑袋去当一个“官”,老板们想方设法在公司内部制造官僚体系留人。 互联网的一些事
Facebook内部人才建设潜规则 – 董释德 – 董释德-非著名IT评论员

  1、新人就是一个祼人,那怕你原来是CEO。 % *^shiYN

  有几多Google的工程师跳槽到Facebook,其中一个曾经是街景项目的总监,但在前面两个月时间内,他和一个普通的技术员没什么两样在写代码,他原来的职务对他现在的工作没有一点影响。而半年后,因为他的能力出色,被任命为一个秘密项目的项目经理。据我所知在中国如果招一个技术总监,打死他也不肯写代码了。 % *^shiYN

  2、晋升没有周期,可能随时随地。

  我们没有加薪或晋升的固定时间,在Facebook只要完成一个重要项目并且在规定的时间内完成目标数据,公司立即对项目成员进行加薪和晋升。当然如果做假,也会有很严厉的惩罚。我的中国同学因为模仿Apple一个专利连升两级,但最后被查出是抄袭,被起诉,退回多加的薪水,并且开除。

  3、能力不行,或者走人或者做管理。

  晚上12点,几个程序员还在解决一个安全问题,这时候他们的主管送上了热腾腾的中国水饺,要知道这可是去5公里的中国餐馆买来的。和国内有点不同,这儿的一线员工是地位最高的,管理者类似国内的后勤工作,是为员工服务的。而在中国很多企业是把业务做不好的人升为做管理,并且还指挥有能力的人干活,这也是我不愿意回国的一个重要因素。 Y% *^xie

  4、做一流的企业,给一流的薪水。 D% *^yi8DGE

  Mark Zuckerberg创办这天开始,就开出了比Google、Apple更高的薪水,他们理念就是我们要做全世界一流的企业,那什么都要一流,包括薪水。当然一流的薪水得到的是一流的人才,这也是对人才市场定价的认同。

  5、多一天懈怠,早一天回家。

  进公司的那天起,CHO就告诉我们,做好随时被裁员的准备。任何一个人进Facebook总有一天要离开,只是时间长短的问题。认真做好每一件事,珍惜每一天,离开Facebook的时候不后悔。

  作者:董释德 http://weibo.com/itnidongde

本文链接:http://www.yixieshi.com/zhichang/8045.html
关键字:Facebook潜规则|人才建设|
版权所有:转载请注明出处

asyncore.py 简单使用

asyncore.py是用于处理异步soket的python标准库,典型的reactor设计,我们只需要实现handle_*的方法,handle_writer, handle_read, handle_connect 等方法。它的底层实现select/poll,我们调用时,面向socket的开发,与协议无关,所以实现http, memcache, spdy等都可以,甚至在unix下还有 async file i/o的子类。

asyncore.py内容分成三部分:
1. socket_map={}属性
2. def loop()方法
3. class dispatcher基类

其中socket_map和loop是全局的属性和方法,dispatcher类把我们的socket保存在socket_map中,socket_map的k,v为socket.fileno()和dispatcher,dispatcher包含socket属性。我们的loop方法轮询这个map根据子类实现的handle_writable/handle_readable的标志调用对应的handle_write/handle_read方法。结束后调用close()方法关闭链接。

    def close(self):
        self.connected = False
        self.accepting = False
        self.del_channel()
        try:
            self.socket.close()
        except socket.error, why:
            if why.args[0] not in (ENOTCONN, EBADF):
                raise

在docs.python.org上的最后是使用的例子:第一个是http 1.0客户端的实现

import asyncore, socket

class HTTPClient(asyncore.dispatcher):

    def __init__(self, host, path):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM) #建立socket
        self.connect( (host, 80) ) #链接 http://www.python.org:80
        self.buffer = ‘GET %s HTTP/1.0\r\n\r\n’ % path #实现http协议,需要发送的数据

    def handle_connect(self):
        pass

    def handle_close(self):
        self.close()

    def handle_read(self):
        print self.recv(8192) #接受数据,内部实现socket.recv(),与socket.send()配合使用

    def writable(self):
        return (len(self.buffer) > 0) #发送数据的条件,当buffer为空时调用handle_close()

    def handle_write(self):
        sent = self.send(self.buffer) #发送数据
        self.buffer = self.buffer[sent:] #清空发送,buffer

client = HTTPClient(‘www.python.org’, ‘/’)
asyncore.loop()

上面没有实现handle_readable,默认发送后3s开始接收。
Technorati Tags: ,

用nginx实现按照用户标志hash拆分web server

大型网站的数据存储拆分中比较通用的一种方式是按照用户id的hash值进行水平拆分,这种做法可以有效的较低db的读写压力,增加数据IO处理能力。

为了满足稳定性的要求,一般的web server都不会只有一台,并且大部分的web server都是按照uri/url进行业务拆分,这样可以增加web server cpu,men等资源的使用效率。可是如果能在web server上可以进一步按照userid hash拆分的话,就可以适当的增加web server的内存级别的缓存,可以有效的利用web server的内存使用效率,并且提高访问数据,增加web server网络的io吞吐率。

HttpUpstreamConsistentHash 是基于nginx的一个模块,需要在编译的时候安装进去

./configure –prefix=/home/nginx   –with-pcre=/tmp/pcre-8.01 –with-http_stub_status_module –with-http_ssl_module –without-http_rewrite_module –add-module=/tmp/nginx_upstream_hash-0.3 –add-module=/tmp/replay-ngx_http_consistent_hash-77b6940
make && make install

这个模块的作用是根据的uri或cookie等信息的hash code 对后端的机器进行分发请求:

upstream somestream {
consistent_hash $request_uri;
server 10.50.1.3:11211;
server 10.50.1.4:11211;
server 10.50.1.5:11211;
}

上面是nginx doc上的例子,根据uri进行负载均衡。
如果需要根据用户的身份进行负载可以根据“身份cookie”这个元素写到配置文件中,绝大部分的大型网站都不会使用session这个功能去保存用户登陆状态,而是利用cookie中的kv存储去记录用户信息。我们则可以利用这个用户身份的COOKIE去完成我们的需求。

upstream somestream {
consistent_hash $COOKIE_ticket;
server 10.50.1.3:8080;
server 10.50.1.4:8081;
server 10.50.1.5:8082;
}

虽然我们不知道用户散到了哪台web server上面,但是我们运行一段时间,就可以把访问这台机器的用户信息cache到内存中,这样之后用户再次访问时就减少了部分的rpc调用,增加了我们的运行效率。

方法或类的起名方式的困惑

一个方法名应该是描述本方法的功能呢?还是描述方法的特点?
比如:void hand() 还是 void grapping()
类名也是:class 轿车() 还是 class 两轮驱动的小型车()
更明显的例子:
我今天在火车上看到了正在修建的高铁,工人师傅们用到了一种造型独特车来运输桥架,车身很长,它的下面共有20个轮子,我想它应该叫什么呢?
class 桥架运输特种车()
class 二十个轮子并且负载四十吨的车()
感觉上第一种靠谱一些?
但是这样便限制了这种车的使用,它以后只能来运输桥架。
或者起一个别名? class 共和国8001型车辆(),然后把它的功能写在注释/文档中。这种方式的好处和坏处也都很明显,用户在使用时不先阅读一下说明书是不会知道它是做什么的,甚至基本的功能都不会知道。

感谢耐心看完我唠叨的人。

Posted with WordPress for BlackBerry.