坚信科学,分享技术

Category Archives: java

这里有原创java教程,都是来自工作中的积累,有时候有些些弱。

[54chen开发日记]注解和拦截器实现权限通用模型的设计实践

——————英文大爱———————–         在近期的开发过程中,有使用到拦截器来实现权限控制,使用这种设计方案,可以很好地分离权限与系统本身的功能,让开发过程更加关注系统的核心功能,同时可以很容易做到开发时的任务划分,同时使项目代码的可读性大大提升。先来普及几个相关的名词: 1.AOP:是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程,也有叫面向方面编程,不过切面更加形象。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 2.GoF:《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为”四人组(Gang of Four)”,而这本书也就被称为”四人组(或 GoF)”书。话说

Continue reading

Posted in java, 架构研究 | Tagged , , | 1 Comment

试用新型JAVA构建工具Gradle

54chen在研究一个开源项目的时候,发现其使用的构建工具很特殊,叫Gradle,和ant maven类似,他提供的东西更加有感觉,不过冒似版本还不高,最新的0.9也只是一个预览版本。 名词解释 ant 当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。 maven Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 如果你已经有十次输入同样的Ant targets来编译你的代码、jar或者war、生成javadocs,你一定会自问,是否有有一个重复性更少却能同样完成该工作的方法。Maven便提供了这样一种选择,将你的注意力从作业层转移到项目管理层。Maven项目已经能够知道如何构建和捆绑代码,运行测试,生成文档并宿主项目网页. 项目的主页地址为:http://maven.apache.org/ Gradle Gradle是一个基于Groovy的build工具——“Ease – Freedom – Power for your build Gradle试图使用Groovy语法来提供Ant的灵活性;它支持多项目的创建,为Ivy提供了一个layer,提供了bu

Continue reading

Posted in java | Tagged , , , | 10 Comments

闲谈分布式key-value存储服务nuclear及其他

现在很多国内公司都纷纷开始了key-value的nosql存储方式,然而,从什么时候开始key-value会变得这么流行呢?是风靡一时,还是顺应时代的潮流?前后数一数,有豆瓣网的beandb、有新浪的SDD、小道消息还有腾讯的TDB以及人人网的nuclear。再数国外,吹起这阵风的原因是亚马逊的一篇文档,这篇文档讲述了在亚马逊的S3服务中所使用的存储系统dynamo实现方式,但遗憾的是dynamo并不开源。紧随其后,facebook来了位号称是当年亚马逊dynamo的开发人员之一的同志,实现了facebook的cassandra,并且值得表扬的是还将其开源了。与此同时,相同理论下产生的,还有linkedin的voldemort系统。 百家争鸣还是百家讲坛 分布式存储的目标,是解决大规模数据在数据量不断增长的情况下,让服务更加稳定,更容易扩展。 其主要具备以下几个特点: 1.高可靠性:系统能够长时间高效运行不迭机。严格的说即使坏了一部分机器也没事。 2.可扩展性:可以随意增加减少机器,不用担心额外的数据损失。 3.负载均衡:要保证每个节点的数据都是负载均衡的,不出现集中负载到一个节点的情况。 4.一致性:因为是分布式的节点,就需要保证节点与节点之间保存数据的一致。 鱼与熊掌不可兼得,这几点,往往完成了其中几点就会损失另外一点,要全部达到完美,是一件非常困难的事情。 在国内的几个存储来看,基本都是只实现了其中的一部分,再按照自己业务的需求,来加强其中更为关心的建设。 beansdb的最终一致性通过哈希树实现快速完整数据同步(短时间内数据可能不一致);可以在不中断服务的情况下进行容

Continue reading

Posted in java, linux | Tagged , | 2 Comments

五四陈透过PHP看JAVA系列:fsockopen

本系列主要总结PHP与JAVA之间的一些异同,给从PHP学JAVA或者是从JAVA学PHP的同学一点启发,五四陈科学院出品。 第一部分,先看PHP的fsockopen 先来看PHP手册中的定义http://www.54chen.com/p/function.fsockopen.html 看完定义后,来看一段代码,利用PHP去更新squid的缓存: <?php function updateCache($myUrl) { global $vSquidConfig; foreach ( $vSquidConfig ['host'] as $mySquid ) { $myHandle = @fsockopen ( “127.0.0.1″, 80, $myErrNo, $myErrStr, 30 ); if ($myHandle) { $myResult = ”; @fputs ( $myHandle, “PURGE ” . …

Continue reading

Posted in java, php | Tagged , , | 4 Comments

五四陈透过PHP看JAVA系列:strtotime

本系列主要总结PHP与JAVA之间的一些异同,给从PHP学JAVA或者是从JAVA学PHP的同学一点启发,五四陈科学院出品。 第一部分,先看PHP的Date/Tme函数 详细见:http://www.54chen.com/p/ref.datetime.html 今天要说的是其中的strtotime函数 http://www.54chen.com/p/function.strtotime.html 函数的功能:接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数)。 例子: <?php echo strtotime(“2010-3-3 3:3:3″); ?> 将得到结果: 1267585383 在PHP应用中,经常在需要记录时间的时候,使用Mysql的int(10)来保存这个 Unix 时间戳,并且时间的比较查找等操作,都用大于小于来进行。 第二部分,看JAVA对应的方法 try { fromUnixTime = new java.text.SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).parse(“01/03/2010 08:00:00″).getTime(); fromUnixTime /= 1000; } catch (ParseException …

Continue reading

Posted in java, php | Tagged , , | Leave a comment

用java操作bdb的方法记录二

在科学院之前的一篇文章中,介绍过普通的操作BDB的方法,见: java使用bdb手记(Berkeley DB Java api记录) 下文记录的是利用BDB的事务来完成的一个put和一个get方法的代码。其速度与原始的操作方法相当。 ================================================代码段============================== /** * @author zhen.chen * @createTime 2010-2-20 上午10:43:31 */ package com.renren.nuclear.storage; import java.io.File; import java.util.ArrayList; import java.util.List; import com.sleepycat.je.Cursor; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.LockMode; …

Continue reading

Posted in java, 架构研究 | Tagged , , | 2 Comments

java线程控制器代码分享-根据cpu情况决定线程运行数量和情况

在人人网海量存储系统的存储引擎部分,为了提高CPU和网络的使用情况,使用了java多线程管理并行操作的方式。 在java中控制线程是一件很简单的事情,jdk提供了诸多的方法,其中比常用的两个是notify()和wait(),一个是唤醒,一个等待线程,在下面的代码中,将看到一个线程分配器,根据cpu的负载情况,自动完成对应线程的唤醒或者是等待操作。整个过程是一个平滑的过程,不会因为线程的切换而导致机器负载出线锯齿。 先看一个类,读取Linux系统TOP等指令拿到系统当前负载: import java.io.BufferedReader; import java.io.InputStreamReader; /** * 节点的cpu 内存 磁盘空间 情况 * * @author zhen.chen * */ public class NodeLoadView { /** * 获取cpu使用情况 * * @return * @throws Exception */ public double getCpuUsage() throws Exception { double …

Continue reading

Posted in java | Tagged , , , | 2 Comments

jdbc socketRead0 locked 记一个Mysql的不明bug

在开发人人网海量存储系统Nuclear的过程中,使用到mysql引擎,用了spring+dbcp+jdbc,在压力测试的过程中出现了问题。 在追踪java stack的过程中发现如下的问题: java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) – locked <0x00002aaab9b2b0d8> (a com.mysql.jdbc.util.ReadAheadInputStream) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2494) at com.mysql.jdbc.MysqlIO.reuseAndRea

Continue reading

Posted in java | Tagged , , | 7 Comments

PHP JAVA C上传文件如何准确判断文件类型-mime知识普及

MIME的英文全称是”Multipurpose Internet Mail Extensions” 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉 浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将 MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。 文件 用IE7上传 用Firefox3.0上传 GIF image/gif image/gif JPG image/pjpeg image/jpeg ZIP application/x-compressed application/octet-stream JSP text/html text/html EXE application/octet-stream application/octet-stream 上边的黄图哦不红图表示出了不同的浏览器所上传的不同的mime的区别,研究了一下,暂时没有发现可修改假冒mime的方法。 <form enctype=”multipart/form-data” action=”URL” method=”post”> <input type=”hidden” name=”MAX_FILE_SIZE” val

Continue reading

Posted in java, php | Tagged , , | 4 Comments

java List转byte[]的方法

先做一个试验: Test.java package test; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> lst = new ArrayList<Integer>(); for (int i = 0; i < 100; i++) { lst.add(i); } System.out.print(lst.toString()); } } 得到结果:列出了所有的数字 [0, …

Continue reading

Posted in java | Tagged , | 1 Comment
Page 1 of 3123