You are not drunk if you can lay on the floor without
holding on.

2009-10-04

Hadoop初探

Filed under: hadoop, develop — LiQiang @ 10:54:12

     最近几年grid computing、SAAS、cloud computing在计算领域属于最火的技术。网格计算的代表是IBM、Oracle、SUN等大型公司的商业应用。SAAS的成功代表是SalesForce。云计算商业化普及的代表是Amazon,把计算(EC2)、存储(S3)等云计算服务提供给大众,实现了计算、存储的按需付费。
cloud trends
     从上图可以看到grid computing的概念在04年已经形成,但是始终处于下降趋势,一定程度由于上网格计算的理念始终没有平民化,概念和操作始终使用在IBM和Oracle的大型商业应用了。
    云计算的概念经过Amazon和Hadoop的普及概念比较容易理解,Amazon提供的EC2和S3服务有很多经典使用案例,使大家很容易理解云计算服务怎样使用、怎样节省成本。而开源领域的Hadoop更是使云计算能够被更多的人所使用。
     Hadoop当前已经发展为一个项目集合,最核心的是存储模块HDFS和计算模块Map-Reduce,核心之外还有HBase、Hive、Pig、ZooKeeper、Cascading等模块,它们一起来解决计算领域面临的存储TB/PB级数据,以及对应在如此大的数据量进行高效、可靠、可扩展计算的诸多问题。
     Hadoop的主要模块参考了Google发布的Paper,包括Map-Reduce、BigTable、GFS等,同时Google的应用也给hadoop提供了很多参考。HDFS最早就是存在于Nutch开源搜索引擎项目。
     下面简要介绍一下Hadoop的主要模块:

  1. HDFS:分布式存储系统,能够透明的保存TB、PB级数据,采用数据块存储(通常64MB),数据块具有可配置的冗余备份,文件系统采用java接口,提供了命令行工具来操作文件系统,也提供c++接口libhdfs。
  2. MapReduce:实现了Map Reduce分布式计算模式,对数据首先分块进行map操作,然后进行mini-reduce、shuffle、sort、reduce。
  3. Hive:由Facebook开发的一套数据仓库系统,提供了HQL查询语言(类似SQL),基于MapReduce开发。
  4. HBase:借鉴自Bigtable开发的一套结构化数据库系统,采用面向列存储方式,它的实现机理可以参考Bigtable的paper。和其同类的另一个开源项目是hypertable,采用c/c++开发。
  5. Pig:  在hadoop上开发的一种高层语言,用于方便的分析数据。

2009-08-08

使用Emacs编辑器

Filed under: linux, tips — LiQiang @ 22:37:07

Emacs是比vim还要老牌的编辑器,大概在1976年开发了最初版本,到现在大约有32~33年,VIM则在1991年才发布初始版本,至今大约17年。Emacs在各个平台都有发行版本,包括Linux、Windows、Mac。
Emacs的主要特点:

  1. 自描述(self-documenting)
    Emacs和VIM一样都有丰富的文档,但是这里说的自描述更多的是指Emacs的主要模块使用Lisp编写,很多功能的实现都可以直接查看到源代码,比如Ctrl-a跳转到行首对应的函数是move-begining-of-line,这个函数定义在simple.el文件,打开simple.el可以看到这个函数的具体实现代码。对于程序员来说,代码有时是最好的文档,一方面可以了解函数的功能,另一方面也可以学习参考实现自己的扩展。
  2. 高扩展
    Emacs本身采用c和Lisp语言开发,扩展也通过Lisp语言扩展,而Lisp语言是完整的计算机语言,具有完备的语法,可以实现各种功能。Emacs本身也具备开发Lisp代码的完整环境,比如Lisp-mode、ielm(交互式lisp环境)等。
    Emacs具有一些大的功能扩展,包括Gnus(新闻阅读、邮件)、org-mode、muse、dired、eshell等等。
  3. 可定制显示
    Emacs具有大量定制选项,可以通过类似文本表单的交互方式选择定制。

 emacs self-documenting

应用:

1. shell 环境
在Windows环境下,命令行运行环境非常简陋,使用Emacs的话能够获得一个接近完美的命令行环境,可以使用Emacs的Shell(调用CMD.exe),或者使用Emacs提供Lisp实现的Eshell,两种环境都在Emacs下,因此可以使用Emacs提供的高亮显示、键盘移动、复制控制、多窗口等功能。
2. sql环境
Emacs可以连接到mysql或者postgresql,对应使用sql-mysql和sql-postgresql命令。
emacs sql
3.Lisp-mode,Python-mode,Php-mode,ECB,CDET,Yasnippet….
通过扩展Emacs可以实现丰富的功能。

emacs ecb

 

更多资源:
http://delicious.com/bluebit/emacs

使用VIM编辑器

Filed under: linux, tips — LiQiang @ 19:36:12

在Unix和Linux系统下,最常使用的编辑器是VIM和Emacs。VIM提供了大量功能,在编译时可以使用编译选项选择功能的多少,越少的功能运行越快。Ubuntu默认安装的是vim-lite版本,可以使用aptitude/apt-get安装完整版本的vim或gvim。
VIM最大的特点是速度快、高扩展性、广泛的系统支持,以及在绝大多数系统都默认安装,在windows也有gvim和cygwin的vim版本。

VIM是从文本编辑的模式区分的,分为命令模式、编辑模式、可视化选择模式等,使用ESC、v/V等键进行切换,在命令模式下可以通过各种按键执行各种命令,比如移动、删除、选择区域等,命令模式下可以通过:进入vim命令行输入各种命令。
vim keyboard

VIM有良好的扩展能力,通过各种插件增强编辑器的能力,比如在编辑源代码是可以通过taglist插件在编辑器左侧展示代码结构、使用Netrw查看文件夹结构。从 http://www.vim.org/scripts/index.php 可以找到各种插件脚本。插件脚本的安装只需要vm文件复制到$HOME/.vim或者vim程序目录的vimfiles下即可。

常用按键和设置:
1. 帮助:输入:h 进入vim帮助文档,包含了各种相关文档,第一次使用可以从help的tutor 30分钟培训开始。
2. 启动时指定目录或者:e 文件夹,可以进入Netrw窗口,在该窗口支持很多命令,使用i转换列表模式,使用p在新窗口查看文件。
3. vim启动有很多选项,比如可以使用-o或-O打开多个文件分别不同窗口。
4. 使用:sh进入操作系统命令行,使用Ctrl-d返回编辑,对于文本内容的处理也可以通过选定区域后使用:!<命令>进行处理,比如:!sort对选定文本行进行排序。
5. 配置文件: ~/.vimrc
syntax enable  "文本高亮模式 
set autoindent  "自动缩进
set sw=2
set tabstop=2
set expandtab
filetype on "文件类型检查开启
set stl=%F\ %l,%c
set fdm=syntax "代码折叠选项
set number "在行首显示行号
autocmd FileType php noremap <C-M> :w!<CR>:!/usr/bin/php %<CR>  "对于php文件增加执行php的快捷键
autocmd FileType php noremap <C-L> :w!<CR>:!/usr/bin/php -l %<CR>
"let ropevim_vim_completion=1
set hlsearch "搜索结果高亮
au FileType python noremap <c-r> :w!<cr>:!python %<cr> "对于python文件增加执行快捷键
au FileType python so ~/.vim/indent/python.vim
…………..

相关的资源:http://delicious.com/bluebit/vim

2009-07-03

A Cheerful heart 一颗欢乐的心 (翻译)

Filed under: 生活 — LiQiang @ 10:33:57

原文来自:http://happylifeandwork.com/behappy/a-cheerful-heart/

Maintaining a cheerful heart is very important to being happy in life and at work. It is often not so much about our circumstances, but how we respond in the midst of those circumstances. Another way to put it might be that what we achieve is not nearly as important as what we overcome. And, it takes the right spirit of thankfulness, attitude of gratitude, and cheerful heart to overcome many of life’s toughest circumstances. The questions then becomes where does this strong yet peaceful spirit come from. It comes from a personal relationship with Jesus!

在生活和工作中保持欢乐的心情是很重要的。很多时候重要的不是我们周围的环境怎样,而是我们在这些境遇中怎样反应。另一种阐释是我们达成的目标并不如我们克服的困难重要。克服生活中最困难的环境需要我们有感恩的精神、感激的态度和欢乐的心情。…..

“The precepts of the LORD are right, giving joy to the heart. The commands of the LORD are radiant, giving light to the eyes”…Paslm 19:8

With this joy in our hearts and light in our eyes, we can “Serve the LORD with gladness”….Psalm 100:2

When somebody is eighty-four years of age and is still able to do just a little bit of the work she loves, that is a great privilege,” said the inimitable Corrie ten Boom before adding, no doubt with a smile, “but I am able to do so much!” According to her coworker, Pam Rosewell, Corrie was continually thankful to God for every opportunity to serve Him, and she went about her task with an enthusiasm hard to equal. “How she enjoyed life,” Pam later recalled, “…and what a sense of humor she had! We spent a lot of time laughing; she was very young in spirit.”

“He who is of a merry heart has a continual feast.”…Proverbs 15:15

有愉悦心情的人每天都在过着节日。

“A cheerful heart is good medicine”…Proverbs 17:22

欢乐的心情是很好的药物。

Every day has its share of burdens, and many of us have aches and pains. But a cheerful heart is as irrepressible as a cork in water. A joyful person just cannot be held down. What a privilege to serve the Lord with gladness and to use our gifts for His glory, doing so with a merry heart. We can moan and complain about life or we can keep life in perspective and enjoy it. Paul learned the secret of contentment, and so can we. That choice is yours and mine.

生活中每天都有一些负担、困难,我们很多人都有疼痛。但是一颗欢乐的心就像在水里无法压下去的软木一样。一个欢乐的人是不会被击垮的。…..我们可以呻吟和抱怨生活,但也可以正确看待生活、享受生活。…….

The future is glorious. The best is yet to be, and you and I have the privilege to help hasten the coming of Jesus…..Corrie ten Boom

2009-06-21

IPhone程序XCS RSS v1.0开发完成

Filed under: XCSRSSReader, iphone — LiQiang @ 13:43:40

    最近完成了IPhone Developer Program的申请,我的第一个IPhone应用程序开发完成了第一个版本,今天提交给App Store进行review,不久就可以在App Store下载安装了。
    XCS RSS现在实现了下面功能:

  • feed分类
  • feed添加(当前只可以手工添加,下一版本增加导入功能)
  • feed文章下载到本地,可以离线阅读
  • feed文章在web浏览器里阅读

下面是部分界面的截图:

     
  

2009-06-08

Drupal新站

Filed under: 软件 — LiQiang @ 22:50:45

drupal@xuecs
欢迎到新的基于drupal的主题站点: drupal@xuecs

2009-03-02

Java中Cache的使用

Filed under: java, framework, develop — LiQiang @ 14:43:43

Cache简介
    在Java开源领域,常用的cache有以下几种:

  • JBossCache
    JBoss支持的Cache引擎,树形cache,在JBoss app server中使用它进行数据缓存、以及cluster之间的数据复制存储。
  • EHCache
    在Souceforge的一个开源项目,使用比较广泛,有很好的支持。
  • OSCache
    相对轻量级一些,一般用在hibernate和web页面的缓存。

   Cache的使用范围:

  • 降低数据库负载,对数据库数据进行缓存
  • 提高web页面生成速度,对于重复使用的web页面缓存部分或者全部
  • 提高计算速度,对于复杂计算结果缓存

   进行Cache的前提:

  • 被缓存的数据没有失效
  • 被缓存的数据可以提出一个替代值,用于查找缓存对象,比如一个hashcode

     Cache通过JGroup或者JMS等方式,可以扩展支持cluster复制缓存。

使用Spring的AOP机制实现method cache
     Spring提供的MethodInterceptor可以方便的实现一个简单的method cache interceptor:

public Object invoke(MethodInvocation invocation) throws Throwable {
        String targetName  = invocation.getThis().getClass().getName();
        String methodName  = invocation.getMethod().getName();
        Object[] arguments = invocation.getArguments();
        Object result;

        logger.info("looking for method result in cache:"+targetName+" "+methodName+" "+arguments);
        String key=getKey(targetName,methodName,arguments);
        if(objs.get(key)!=null){
            return objs.get(key);
        }else{
            result = invocation.proceed();
            if(result!=null)
                objs.put(key,result);
        }

        return result;
    }

  上面的代码中首先根据方法的签名构造缓存键值,方法签名包括类名称、方法名称、参数等信息,用于区分方法缓存对象。然后把方法执行结果和签名保存到缓存中。在第二次使用时,如果在缓存中可以找到相同签名的对象,那么可以把结果直接返回。这个代码只是一个机制示例,真正的实现有很多问题需要解决。在下一节中我们会看到spring-modules提供的完整实现。

Spring2.5中EHCache的使用
Spring提供了EHCache的简单封装,配置如下:

 <bean id="cacheManager"
          class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
      <property name="configLocation" value="classpath:config/ehcache.xml"/>
 </bean>

EhCacheManagerFactoryBean用于初始化CacheManager,读取外部配置文件,以及支持在bean config注入各种属性信息。
     Spring本身提供的ehcache封装比较简单,另一个开源项目spring-modules提供了更加好用的cache封装接口,可以联合使用。
     Spring-modules-cache的实现机制是通过Spring的AOP机制,根据配置截取方法调用,对方法调用的参数和返回结果进行缓存,对于缓存失效条件也通过方法调用的截获进行触发。

 <bean id="cacheProviderFacade"
          class="org.springmodules.cache.provider.ehcache.EhCacheFacade">
        <property name="cacheManager" ref="cacheManager" />
    </bean>
    <bean id="YourServiceCached"
          class="org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean">
        <property name="cacheProviderFacade" ref="cacheProviderFacade" />
        <property name="cachingModels">
            <props>
                <prop key="get*">cacheName=mainCache</prop>
                <prop key="find*">cacheName=mainCache</prop>
            </props>
        </property>
        <property name="flushingModels">
            <props>
                <prop key="update*">cacheNames=mainCache</prop>
                <prop key="add*">cacheNames=mainCache</prop>
                <prop key="delete*">cacheNames=mainCache</prop>
            </props>
        </property>
        <property name="target" ref="YourService" />
    </bean>

    使用spring-modules提供的EhCacheFacade和CacheProxyFactoryBean:

  • EhCacheFacade
    用于封装底层cache接口,对于不同的cache提供者,可以提供统一的facade接口,spring-modules直接支持的cache提供者有:ehcache、jbosscache、gigaspaces、jcs、tangosol等。
     
  • CacheProxyFactoryBean
    对需要进行cache的对象进行代理,用于截获方法调用,对cache进行保存或者失效操作。
    cachengModels 配置哪些方法需要进行缓存。
    flushingModels 配置哪些方法用于触发缓存失效。flushingModels 配置的失效缓存池可以是多个,用于细粒度的控制失效范围。
    target配置要进行代理缓存的实际对象。

 

2009-03-01

SiteMesh记要

Filed under: java, framework — LiQiang @ 21:51:55

    SiteMesh是一个使用java语言实现,采用decorator模式装饰页面的框架。SiteMesh采用filter实现,实现了下面功能:

  • 对于页面被SiteMesh包装输出的页面代码,sitemesh进行解析,然后根据配置进行代码修改。
  • 提取大量网页中重复相同的html、js、css等代码
    SiteMesh提取web页面的公共部分,把页面的公共代码提取出来,可以灵活配置,方便页面的开发、修改
  •  对于页面根据环境的不同,自动的进行定制修改,可以根据浏览器类型、用户语言、搜索引擎、操作系统等进行不同的页面装饰。

   SiteMesh的配置文件主要包含两个:

  • sitemesh.xml
    包括了parse和mapper的配置
  • <page-parsers>
            <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser"/>
    </page-parsers>
    <decorator-mappers>
           <mapper class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
                <param name="decorator.parameter" value="pagetype"/>
           </mapper>
           <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
                <param name="config" value="${decorators-file}"/>
            </mapper>
    </decorator-mappers>
    
  • decorators.xml
    这个文件是可选文件,从前面的sitemesh.xml配置可以看到,这个文件是被ConfigDecoratorMapper使用的。
     
  • <decorator name="ajax" page="ajax.html">
          <pattern>/yourajax.action</pattern>
    </decorator>
    <decorator name="default" page="main.html">
            <pattern>/*</pattern>
    </decorator>
    

SiteMesh的主要处理过程:

  1. Servlet Container进行正常的页面处理,各种filter执行
  2. 在执行到sitemesh的filter时,根据配置确定是否需要执行
  3. sitemesh构造PageResponseWrapper,然后执行之后的各种filter
  4. 通过PageResponseWrapper得到需要进行装饰的页面对象,PageResponseWrapper调用配置的Parser进行页面解析
  5. 调用applyDecorator进行页面装饰处理,使用freemarker或者velocity模版作为装饰外框
  6. 把处理结果写入到response

几个主要的对象:
Parser
sitemesh为了对页面进行装饰,需要解析页面代码为内存对象(类似DOM树),然后才能对这些不同的节点进行装饰处理。框架提供了 FastPageParser 和 HTMLPageParser 。FastPageParser代码更为简洁,HTMLPageParser重写了FastPageParser,并且增加了更多的功能。

Mapper 
Mapper用于选择正确的装饰配置,比如上面配置的 ConfigDecoratorMapper ,根据配置文件中的url匹配规则进行装饰,而 ParameterDecoratorMapper则是根据url参数按照名称选取decorator配置。

PageFilter
sitemesh的框架核心,作为调度中枢。在struts 2中,一般使用它的子类FreeMarkerPageFilter或者VelocityPageFilter。

 

Struts 2 记要--Result

Filed under: java, framework, develop — LiQiang @ 13:22:43

回顾Struts 1的Result处理
        Struts 1的Result页面处理是通过 RequestDispatcher.forward 方法执行,而RequestDispatcher的实例是servlet容器提供的。这样struts 1在result页面处理时,实质上是直接转交给了web容器。
         页面转交给web容器处理后,web容器就可以通过已有的各种url处理机制处理,比如和velocity集成时,实质上是配置了servlet容器映射.vm URL到VelocityViewServlet进行处理。而vm页面的数据来源则在struts 1处理完成时已经放入了request、response、VelocityContext等对象里面。

Struts2的处理方式
         前面一篇讲的xwork容器环境,可以知道Result其实是xwork提供的一种机制。Result在运行时是一个实例对象,被DefaultActionInvocation构造、调用,Result执行时可以直接把处理结果写入到应答数据流中。
         Struts2内置了多种Result类型的实现,比如VelocityResult、PlainTextResult、XSLTResult等,当然也可以自己扩展,比如下面的代码增加了图形输出Result:

<result-type name="d2chart" class="com.xuecs.ezweb.struts.result.Data2ChartResult">
   <param name="height">150</param>
   <param name="width">200</param>
</result-type>

 Data2ChartResult实现的是首先通过JFreeChart构造图形,然后写到应答数据流中。
 对于JSon数据转换,可以使用 com.googlecode.jsonplugin.JSONResult 自动转换json数据。

    Struts 2改变了Result处理方式,带来以下优点:

  • 不依赖与web环境,Result接口要求提供的方法 execute(ActionInvocation invocation) 没有和web api相关
  • 相比struts 1依赖Dispatcher进行处理,Struts2的Result功能可以不依赖web容器的功能
  • Result执行后仍然在框架中,会通过inteceptor桟返回,可以通过inteceptor再进行扩展处理

2009-02-27

Struts 2 记要--容器

Filed under: java, framework — LiQiang @ 19:00:13

    Struts 1在06年后发展方向大致有两个,一个是Component-based的Shale框架,另一个就是和WebWorks 2合并作为Struts 2。最终Struts 2设计为合并了Struts 1和WebWork 2。
    WebWork本身采用了Xwork作为它的容器环境,struts 2自然也采用xwork容器环境。xwork是OpenSymphony的一个项目,提供了以下功能:
    1. IOC容器环境
    2.表达式语言
    3.数据校验框架
    4.数据转换
    5.可扩展的配置

    Struts 2很重要的一个改变就是容器环境的引入, struts 2里IOC容器最主要用在了各种框架对象的创建,框架核心的各种依赖注入,以及inteceptor机制。同时xwork可以和spring集成,Action就可以使用spring容器的大量高级功能。

xwork的使用方式
    xwork 容器不仅可以用于struts 2的核心部分,用户也可以直接使用。比如struts 2的plugin:config-browser ,在获取struts2运行时的配置时,通过下面代码可以把struts解析的配置注入到类中:
   @Inject
    public void setConfiguration(Configuration config) {
        this.configuration = config;
    }
Action的创建
    在Struts2的Dispatcher创建Action时,会调用xwork提供的ActionProxyFactory得到Action,而ActionProxyFactory的具体实现在struts2是StrutsActionProxyFactory,StrutsActionProxyFactory则继承自xwork的DefaultActionProxyFactory。通过ActionProxyFactory得到对象时它会通过ObjectFactory构造action。xwork容器会进行注入操作,同时如果配置了spring,xwork容器会调用spring  context创建对象,然后注入xwork配置的注入信息。

ObjectFactory

  • 创建action
  • 创建inteceptor,使用ognl设置属性,并初始化
  • 创建Result
  • 创建validator
  • 调用IOC容器进行注入

DefaultActionProxy

  • 作为Action的代理,包含了action的各种配置信息
  • 负责通过DefaultActionInvocation执行action

DefaultActionInvocation

  • 调用ObjectFactory创建action,result
  • 调用inteceptor chain
  • 执行action
  • 调用action执行结果result

Inteceptor
     xwork实现的是 command-pattern 框架,核心是执行action,在action的执行前后通过inteceptor进行定制化操作,这种模式的使用不局限于web环境,带来了一下优点:

  • 可以灵活的配置对于不同的action采用不同的inteceptor
  • inteceptor封装了action需要的统一操作,框架提供了很多常用的inteceptor来简化开发
  • 可以脱离web环境运行
Next Page »

EMail:liqiang@xuecs.com