帆's profile被我遗忘的时光PhotosBlogListsMore Tools Help

被我遗忘的时光

只有淡忘,从前话说要如何 只有顽强,明日路纵会更彷徨

帆 杨

Occupation

最近干的事情

Loading...

Windows Media Player

感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
October 17

矩阵的并行运算

最近正被项目的并发问题搞得焦头烂额,在封装的语义和项目需求上似乎都出现了问题,迟迟实现不了。昨天无意中看到这个招聘题,挺有意思的。出题人的本意可能是想考考时下流行的并行运算,受限于CPU,在PC上这种纯运算的效果并不明显,但并发倒是以后的一种趋势…
[quote]- 使用Java多线程实现下述算法:
输入:整数组成的m*n的矩阵A。(m=100000, n=10000)
输出:一个数列B,数列B中的每一项为矩阵A中对应列数字之和[/quote]
CPU的核心是越来越多了,以后并行运算是一种趋势,越来越多的程序需要考虑使用并行运算来加速,硬件厂商给了我们翻倍的CPU,而不是翻倍的速度,真麻烦 Sarcastic ……

首先定义一个类,就叫做MatrixSolver吧

 

package fyting.javaeye.com;
public class MatrixSolver
{
    private final int[][] matrix;
    private final int maxThreads;
    private final Map<Integer, Integer> results = Collections.synchronizedMap(new TreeMap<Integer, Integer>());
    public void start(){
        //...
    }
}

写一个main方法来测试:

public static void main(String[] args)
{
    final int row = 5000, column = 2000;
    final int[][] data = new int[row][column];
    for(int i = 0 ; i < row; i++) {
        for(int j = 0; j < column; j++) {
            data[i][j] = j;
        }
    }
    final int maxThreads = 3;
    MatrixSolver solver = new MatrixSolver(maxThreads, data);
    solver.start();
}

然后是实现的代码,利用JDK5的线程池,可以很轻松实现:
(事实上,JDK里CyclicBarrier的javadoc就是一个解矩阵的例子)

public void start()
{
    ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
    final long st = System.nanoTime();
    if(this.matrix.length == 0) {
        System.err.println("no matrix data!");
        return;
    }
    final int columnCount = this.matrix[0].length;
    //创建一个计数的latch,用来等待运算结果
    final CountDownLatch latch = new CountDownLatch(columnCount);
    for(int i = 0 ; i < columnCount; i++) {
        final int column = i;
        executor.execute(newTask(column,latch));
    }
    try {
        latch.await();//等待运算完毕,否则会一直wait在这里
        executor.shutdown();
        long et = System.nanoTime();
        long time = (et - st) / (1000*1000);
        System.out.println("success, time: " + time + "ms");
        executor.awaitTermination(1, TimeUnit.SECONDS);
    }
    catch(InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("maxtrix: " + (matrix.length + "*" + matrix[0].length));
    System.out.println("column0==>" + ArrayUtils.toString(matrix[0]));
    System.out.println("results==>" + results);
} 

protected Runnable newTask(int column, CountDownLatch latch)
{
    return new ColumnSolver(column,latch);
} 

private class ColumnSolver extends Thread
{
    private final int columnIndex;
    private final CountDownLatch latch; 

    ColumnSolver(int columnIndex, CountDownLatch latch)
    {
        this.columnIndex = columnIndex;
        this.latch = latch;
    } 

    @Override
    public void run()
    {
        int count = 0;
        for(int j = 0, rowCount = matrix.length; j < rowCount; j++) {
            count += matrix[j][columnIndex];
        }
        results.put(columnIndex, count);
        latch.countDown();//计数器减1
    }
}

当然,如果是JDK1.4,可以用单独的Doug Lea大师写的java concurrent包,否则需要自己实现线程池了,很麻烦。如附件中的代码,很容易出错,实在是没有必要在项目中采用。
September 22

都别装了,难道你们都懂SOA吗

曾经想努力搞懂啥叫SOA,因为某著名杂志曾写到21世纪不懂SOA的软件开发人员无法生存。结果,我真的太肤浅,看来看去,技术上的东西就那几种,也远远达不到各方所宣传的效果,只是对原有的经验的一个总结和标准化。所以,看上去的SOA就什么都是,它是一种架构,是一种解决了N多问题的方案,一种设计理念,一种软件的构建方法,它,还可以是一种或多种产品……
还别说,架构、方案,让一群不太懂技术的经理们信以为真,于是,赶快跟上。所谓的理念、设计之类的名词也把一群软件开发人员忽悠了,好久不来JE,发现一个SOA的帖子只因为你不懂SOA,我本以为可以解除我的困惑,结果楼主高屋建瓴之后来了段代码:

public class CalculatorService {   
    private AddService addService;   
    @Reference  
    public void setAddService(AddService addService) {   
        this.addService = addService;   
    }   
    public double add(double n1, double n2) {   
        return addService.add(n1, n2);   
    }   
}


并且说到:
那么,addService.add(n1, n2)是什么调用?在SCA的架构体系下:

  1. 他可以是简单的java调用——你能方便而快速的做JUnit Test.
  2. 他可以也可是复杂一点的EJB调用——事务,分布式,Cache等你所想要的企业级特性的支持
  3. 他还可以是复杂一点的Web Service调用,具体提供这个add服务的也许是一个.Net程序,又或者是一个八百年前的老系统已有的服务。。。。

是的,他可以做最复杂的事情,但也是最简单的POJO。对于开发者来说,只用关心他的业务,其它的一切都可以忽略。

 

 

你看出什么来没有,这代码似曾相识啊,这就是一标准的策略模式的实现。不要一提设计模式就露出一副鄙视的样子,好吧,这不是Spring里多年前的IOC啊、DI啊啥的?你看,这还真能忽悠。(这也挺搞的,以前很多人搞设计模式,结果自己把自己忽悠了。现在搞SOA,又有人把自己忽悠了,而且被设计模式给忽悠了)

SOA,至少是现在我自己了解到的SOA,就是个把各种东西揉在一起,换个马甲,然后开始卖概念,顺便把产品也送出去。这也不要技术人员懂,就是卖给IT经理之类的(记得是O6z大叔这么说的?)。从技术的角度提出,然后让技术人员看不懂,却给不搞具体技术的人看,然后得出某种极其先进、深不可测、变幻万千的结论,真是……

上次某厂商来成都时我专门去听了,我承认浪费了半天时间。其中有个印象比较深刻的:

提到这个厂商能做到与IBM、BEA之流一起制定标准,实属不易。但人家也从不亲口提民族产业,人家只说合作。到最后不知道是有人被忽悠了还是咋的,在提问时说道:以后SOA会分为微软阵营和其他厂商阵营,还举例使用WCF的例子,说这就被绑定了,用WCF就被绑上微软了。微软自然是人人喊打的,于是最终演变为一场支持国产软件的活动,为民族软件而自豪,这是有人亲自发短信,在现场的短信大屏幕上出现的。我问道:用那啥SOS就不绑定了吗?无解。
我问那个Component是怎么划分的粒度,我想看看这和普通的软件开发流程有啥区别,如何应对变化。得,最后演示了个画图生成代码的高级工具,但没看出太多实质的东西,发生变化就得重新画图,复杂的流程估计那图得成蜘蛛网了,比代码看起还累。不过效果倒是很震撼。看:只懂业务也能写软件了,正符合被忽悠人群的需要。这东西,本来就一高级代码生成器+文档、流程管理(据说这一点还算不错),扯上SOA,值钱了,也好卖了,一份抵过去五份。我并非想批判人家的产品,只是想让大家看看这现实中的SOA是怎么回事。

一时兴起,言辞太偏激,本来想作为回帖的,但还是贴到个人博客上比较好,好久没打这么多字了,正好凑一篇。:)

到处写blog真是累,幸好有windows live writer和一堆插件,微软的window-live总算做出个有用的东西。MSN空间上冷冷清清,也贴上……

原文地址Permalink to 都别装了,难道你们都懂SOA吗

August 12

当如何

人的一生会走过很多十字路口,会面临许多选择。有时候在路口彷徨,不知道该如何选择,该选择什么;有时候选择了,却后悔了;有时候知道正确的路,却无可奈何,摇摇头,往另一边走去;有时候选择了,却错了;而有时候知道是错的,仍不回头;有时候看似正确,却被岁月无情嘲笑。我常常在思考,该如何抉择,可得不出确切的答案,在人来人往的十字路口,一片茫然。最后,按照抛硬币的方式:如果欣然接受,那表明内心就是如此;如果总是不愿相信结果,一遍又一遍地抛,那,另一面正是心中所期望的。也许,人该随性而为吧。谁都不能预知未来,只要在选择的一刹那,无怨无悔。走自己的路,让时间去解读吧。

July 31

做人不能这么无耻

反垄断法就要实施了,各种跳梁小丑又走上了舞台。

http://www.evermoresw.com.cn/webch/news/detail.jsp?type=office&id=992

在中国可能遭受到反垄断诉讼的跨国巨头中,微软算是呼声最高的一个。国产Office软件的代表企业——永中科技总经理曹参甚至直接呼吁政府将微软列为中国《反垄断法》的“第一被告”。

曹参表示,如果政府不出面,永中科技也准备跟微软打官司,“我们不怕它,正在搜集各方面的相关证据”。

而这个记者也挺搞笑,暴风影音的也被拉出来了 http://tech.163.com/08/0731/01/4I55OAEP000915BD.html

而国内最大的视频播放软件公司暴风影音也对微软Windows以捆绑的方式推广Windows MediaPlayer颇有微词。

谁将受到限制

  虽然中国《反垄断法》并非针对跨国公司,但是跨国公司在中国诸多市场占据的垄断地位,以及取得这些地位采取的种种限制竞争的行为,使其不可避免地会正面遭遇《反垄断法》。

  一本名为《中国产业地图》的图书指出,中国每个已开放产业的前5名均由外资公司控制,在中国28个主要产业中,外资在21个产业中拥有多数资产控制权。

看吧,又开始打爱国牌了。闹吧闹吧,一起搞强大的IPV9。

July 25

最近很忙……

最近忙得不行,具体在忙什么搞不清楚,只是忙得团团转,一股无形的压力让我喘不过气。周日时我放弃了,本来可以给上面一次完美的表现,但我还是放弃了这个机会,管他妈的,爱咋咋样。自己嘲笑自己知其可为而不为之,知其不可为而为之,呵呵。也许是太压抑,我开始重新玩仙剑四。通关后,不由得沉浸在那充满淡淡哀伤而又凄美的结局里,随着主题曲一起廻梦游仙。总是很喜欢这种青涩的味道,纯真的友情、爱情,也许我真的适合生活在幻想中,抑或为了弥补残破的记忆。
 
花开花落花满天情来情去情随缘
雁去雁归雁不散潮起潮落潮不眠
夜深明月梦婵娟千金难留是红颜
惯看花谢花又开却怕缘起缘又灭
 
冰封的泪 如流星陨落 跌碎了谁的思念
轮回之间 前尘已湮灭 梦中模糊容颜~
昆仑巅 江湖远 花谢花开花满天
叹红尘 落朱颜 天上人间
情如风 情如烟 琵琶一曲已千年
今生缘 来生缘 沧海桑田 成流年
 
古老的剑 斩断了宿怨 唤醒了谁的誓言
转瞬之间 隔世的爱恋 追忆往日缱绻
昆仑巅 浮生远 梦中只为你流连
笑红尘 画朱颜 浮云翩跹
情难却 情相牵 只羡鸳鸯不羡仙
今生缘 来生缘 难分难解
情难却 情相牵 只羡鸳鸯不羡仙
今生恋 来生恋 莫让缠绵 伤离别