paulwong

#

大型网站技术架构读书笔记

大型网站经历的技术架构演变:
  1. 应用服务器、数据库服务器和文件服务器都安装在同一台主机
  2. 应用服务器、数据库服务器和文件服务器分别安装在不同主机
  3. 增加了分布式的缓存服务器
  4. 应用服务器增加了好几台,变成集群
  5. 增加了CDN和反射代理服务器
  6. 数据库服务器变成主从形式的服务器
  7. 数据库服务器变成分布式的服务器,文件服务器也变成分布式服务器
  8. NOSQL分布式数据库和搜索引擎的引入
  9. 应用服务器虽然是多台,但都是部署了同一应用,这时将应用拆分,每台服务器部署不同的拆分应用
  10. 虽然应用已经拆分,但每个应用都是从页面管到数据库,这时继续拆分,将存取数据库的部份独立,页面部份
    也独立
架构模式
  1. 分层,代码放在不同的类中
  2. 分割,应用放在不同的JVM中
  3. 分布式,部署在不同的物理机
  4. 集群,同一个应用部署到不同的主机,可以负载均衡
  5. 缓存,CND加速、反向代理、本地缓存、分布式缓存
  6. 异步,消除高并发
  7. 冗余,多处备份
  8. 安全性

posted @ 2013-11-09 11:34 paulwong 阅读(651) | 评论 (0)编辑 收藏

Java EE 8愿望清单:缺少这些,Java EE将不会完美

摘要:Java EE 7已于6月中旬正式发布,尽管新平台包含了诸多新的特性,但是开发者对此似乎并不满足,他们期待未来的版本Java EE 8中能够包含更完善的特性,比如更大的CDI应用范围、标准的缓存API、现代化的安全框架等。

Java EE 7已于6月中旬正式发布,新版本提供了一个强大、完整、全面的堆栈来帮助开发者构建企业和Web应用程序——为构建HTML5动态可伸缩应用程序提供了支持,并新增大量规范和特性来提高开发人员的生产力以及满足企业最苛刻的需求。

下面的这个图表包含了Java EE 7中的各种组件。橙色部分为Java EE中新添加的组件。

尽管新的平台包含了诸多新的特性,但是开发者对此似乎并不满足,尽管他们中的大部分还没有迁移到Java EE 7(或许是由于Java EE 7的特性还不完善),但是这并不影响他们对于Java EE 8特性的设想。

比如,在Java EE 6发布(2009年12月10日发布)后,开发者Antonio Goncalves认为该版本并没有解决一些问题,因此写了一个希望在Java EE 7中包含的特性清单。有趣的是,他写的4个特性中,其中有2个(flows和batch)已经包含在Java EE 7中了,而第3个特性(caching)原本也计划包含其中,但由于开发进度关系,在Java EE 7最终发布前被舍弃。

此举促使开发者Arjan Tijms也写了一个他希望在Java EE 8中出现的特性清单,如下。

  1. 无处不在的CDI(Contexts and Dependency Injection for Java EE,上下文与依赖注入)
  2. 更深入的Pruning(修剪)和Deprecating(弃用)
  3. 一个标准的缓存API
  4. administrative objects(管理对象)的应用内替代品
  5. 综合的现代化的安全框架
  6. 平台范围内的配置

下面就来详细阐述这些特性的必要性。

1.  无处不在的CDI

实际上这意味着2种不同的东西:使CDI可以用在目前不能用的其他地方、基于CDI来实现和改造其他规范中的相关技术。

a. 使CDI可以用在其他地方

与Java EE 6相比,Java EE 7中的CDI的适用范围已经扩大了很多,比如CDI注入现在可以工作在大多数JSF组件(artifacts)中,比如基于bean validation的约束验证器。不幸的是,只是大部分JSF组件,并非所有的,比如转换器和验证器就不行,尽管OmniFaces 1.6将支持这些特性,但最好是在Java EE 7中能够开箱即用。

此外,Java EE 7中的CDI也没有考虑到JASPIC组件,在此之中注入操作将无法工作。即使http请求和会话在Servlet Profile SAM中可用,但是当SAM被调用时,相应的CDI作用域也不会被建立。这意味着它甚至不能通过bean管理器以编程方式来检索请求或会话bean作用域。

还有一种特殊情况是,各种各样的平台artifacts可以通过一些替代的注解(如@PersistenceUnit)来注入,但早期的注入注解(@Resource)仍然需要做很多事情,比如DataSource。即使Java EE 7中引入了artifacts(如任务调度服务),但也不得不通过“古老”的@Resource来注入,而不是通过@Inject。

b. 基于CDI来实现和改造其他规范中的相关技术

CDI绝对不应该只专注于在其他规范中已经解决的那些问题,其他规范还可以在CDI之上来实现它们各自的功能,这意味着它们可以作为CDI扩展。以Java EE 7中的JSF 2.2为例,该规范中的兼容CDI的视图作用域可作为CDI扩展来使用,并且其新的flow作用域也可被立即实现为CDI扩展。

此外,JTA 1.2现在也提供了一个CDI扩展,其可以声明式地应用到CDI托管的bean中。此前EJB也提供了类似的功能,其背后技术也使用到了JTA,但是声明部分还是基于EJB规范。在这种情况下,可以通过JTA来直接处理其自身的声明性事务,但是这需要在CDI之上进行。

尽管从EJB 3版本开始,EJB beans已经非常简单易用了,同时还相当强大,但问题是:CDI中已经提供了组件模型,EJB beans只是另一个替代品。无论各种EJB bean类型有多么实用,但是一个平台上有2个组件模型,容易让用户甚至是规范实现者混淆。通过CDI组件模型,你可以选择需要的功能,或者混合使用,并且每个注解提供了额外的功能。而EJB是一个“一体”模式,在一个单一的注解中定义了特定的bean类型,它们之间可以很好地协同工作。你可以禁用部分不想使用的功能。例如,你可以关闭bean类型中提供的事务支持,或者禁用@Stateful beans中的passivation,或者禁用@Singleton beans中的容器管理锁。

如果EJB被当做CDI的一组扩展来进行改造,可能最终会更好。这样就会只有一个组件模型,并且具有同样有效的功能。

这意味着EJB的服务,如计时器服务(@Schedule@TimeOut )、@Asynchronous、 @Lock@Startup/@DependsOn和@RolesAllowed都应该能与CDI托管的bean一起工作。此外,现有EJB bean类型提供的隐式功能也应该被分解成可单独使用的功能。比如可以通过@Pooled来模拟@Stateless beans提供的容器池,通过@CallScoped来模拟调用@Stateless bean到不同的实例中的行为。

2.  更深入的Pruning(修剪)和Deprecating(弃用)

在Java EE平台中,为数众多的API可能会令初学者不知所措,这也是导致Java EE如此复杂的一个重要原因。因此从Java EE 6版本开始就引入了Pruning(修剪)和Deprecating(弃用)过程。在Java EE 7中,更多的技术和API成为了可选项,这意味着开发者如果需要,还可以包含进来。

比如我个人最喜欢的是JSF本地托管bean设施、JSP视图处理程序(这早在2009年就被弃用了),以及JSF中各种各样的功能,这些功能在规范文件中很长一段时间一直被描述为“被弃用”。

如果EJB组件模型也被修剪将会更好,但这有可能还为时过早。其实最应该做的是继续去修剪EJB 2编程模型相关的所有东西,比如在Java EE 7中依然存在的home接口。

3.  一个标准化的缓存API

JCache缓存API原本将包含在Java EE 7中,但不幸的是,该API错过了重要的公共审查的最后期限,导致其没能成为Java EE 7的一部分。

如果该规范能够在Java EE 8计划表的早期阶段完成,就有可能成为Java EE 8的一部分。这样,其他一些规范(如JPA)也能够在JCache之上重新构建自己的缓存API。

4.  所有管理对象(administrative objects)的应用内替代品

Java EE中有一个概念叫“管理对象(administrative objects)”。这是一个配置在AS端而不是在应用程序本身中的资源。这个概念是有争议的。

对于在应用服务器上运行许多外部程序的大企业而言,这可以是一个大的优势——你通常不会想去打开一个外部获得的应用程序来改变它连接的数据库的相关细节。在传统企业中,如果在开发人员和操作之间有一个强大的分离机制,这个概念也是有益的——这可以在系统安装时分别设置。

但是,这对于在自己的应用服务器部署内部开发的应用程序的敏捷团队来说,这种分离方式是一个很大的障碍,不会带来任何帮助。同样,对于初学者、教育方面的应用或者云部署来说,这种设置也是非常不可取的。

从Java EE 6的@DataSourceDefinition开始,许多资源(早期的“管理对象”)只能从应用程序内部被定义,比如JMS Destinations、email会话等。不幸的是,这并不适用于所有的管理对象。

不过,Java EE 7中新的Concurrency Utils for Java EE规范中有明确的选项使得它的资源只针对管理对象。如果在Java EE 8中,允许以一个便携的方式从应用程序内部配置,那么这将是非常棒的。更进一步来说,如果Java EE 8中能够定义一种规范来明确禁止资源只能被administrative,那么会更好。

5.  综合的现代化的安全框架

在Java EE中,安全一直是一个棘手的问题。缺乏整体和全面的安全框架是Java EE的主要缺点之一,尤其是在讨论或评估竞争框架(如Spring)时,这些问题会被更多地提及。

并不是Java EE没有关于安全方面的规定。事实上,它有一整套选项,比如JAAS、JASPIC、JACC、部分的Servlet安全方面的规范、部分EJB规范、JAX-RS自己的API,甚至JCA也有一些自己的安全规定。但是,这方面存在相当多的问题。

首先,安全标准被分布在这么多规范中,且并不是所有这些规范都可以用在Java EE Web Profile中,这也导致难以推出一个综合的Java EE安全框架。

第二,各种安全API已经相当长一段时间没有被现代化,尤其是JASPIC和JACC。长期以来,这些API只是修复了一些小的重要的问题,从来没有一个API像JMS 2一样被完整地现代化。比如,JASPIC现在仍然针对Java SE 1.4

第三,个别安全API,如JAAS、JASPIC 和JACC,都是比较抽象和低层次的。虽然这为供应商提供了很大的灵活性,但是它们不适合普通的应用程序开发者。

第四,最重要的问题是,Java EE中的安全机制也遭遇到了“管理对象”中同样的问题。很长一段时间,所谓的Java EE声明式安全模型主要认证过程是在AS端按照供应商特定方式来单独配置和实现的,这再次让安全设置对于敏捷团队、教育工作者和初学者来说成为一件困难的事。

以上这些是主要的问题。虽然其中一些问题可以在最近的Java EE升级中通过增加小功能和修复问题来解决。然而,我的愿望是,能够在Java EE 8中,通过一个综合的和现代化的安全框架(尽可能地构建在现有安全基础上)将这些问题解决得更加彻底。

6.  平台范围内的配置

Java EE应用程序可以使用部署描述文件(比如web.xml)进行配置,但该方法对于不同的开发阶段(如DEV、BETA、LIVE等)来说是比较痛苦的。针对这些阶段配置Java EE应用程序的传统的方法是通过驻留在一个特定服务器实例中的“管理对象”来实现。在该方法中,配置的是服务器,而不是应用程序。由于不同阶段会对应不同的服务器,因此这些设置也会随之自动改变。

这种方法有一些问题。首先在AS端的配置资源是服务器特定的,这些资源可以被标准化,但是它们的配置肯定没有被标准化。这对于初学者来说,在即将发布的应用程序中进行解释说明比较困难。对于小型开发团队和敏捷开发团队而言,也增加了不必要的困难。

对于配置Java EE应用程序,目前有很多可替代的方式,比如在部署描述符内使用(基于表达式语言的)占位符,并使部署描述符(或fragments)可切换。许多规范已经允许指定外部的部署描述符(如web.xml中可以指定外部的faces-config.xml文件,persistence.xml中可以指定外部的orm.xml文件),但是没有一个统一的机制来针对描述符做这些事情,并且没有办法去参数化这些包含的外部文件。

如果Java EE 8能够以一种彻底的、统一平台的方式来解决这些配置问题,将再好不过了。似乎Java EE 8开发团队正在计划做这样的事情。这将会非常有趣,接下来就看如何发展了。

结论

Java EE 8目前尚处于规划初期,但愿上面提到的大多数特性能够以某种方式加以解决。可能“无处不在的CDI”的几率会大一些,此方面似乎已经得到了很大的支持,且事情已经在朝着这个方向发展了。

标准化缓存API也非常有可能,它几乎快被包含在Java EE 7中了,但愿其不会再次错过规范审查的最后期限。

此外,“现代化的安全框架”这一特性已经被几个Java EE开发成员提到,但是此方面工作尚未启动。这可能需要相当大的努力,以及大量其他规范的支持,这是一个整体性问题。顺便说一句,安全框架也是Antonio Goncalves关于Java EE 7愿望清单中的第4个提议,希望Java EE 8可以解决这一问题。

posted @ 2013-11-09 11:14 paulwong 阅读(537) | 评论 (0)编辑 收藏

安装MONGODB在CENTOS、UBUNTU

CENTOS
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/


UBUNTU
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

posted @ 2013-11-08 12:01 paulwong 阅读(279) | 评论 (0)编辑 收藏

Flume日志收集

     摘要: 一、Flume介绍Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。设计目标:(1) 可靠性当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到...  阅读全文

posted @ 2013-10-31 18:20 paulwong 阅读(51020) | 评论 (1)编辑 收藏

MONGODB GUI客户端

WINDOWS+MAC+LINUX版的都有
http://robomongo.org/

posted @ 2013-10-27 11:29 paulwong 阅读(487) | 评论 (0)编辑 收藏

我是如何反编译D-Link路由器固件程序并发现它的后门的

OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧

一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13。使用工具Binwalk,很快的就从中发现并提取出一个只读SquashFS文件系统,没用多大功夫我就将这个固件程序的web server(/bin/webs)加载到了IDA中:

Strings inside /bin/webs

/bin/webs中的字符信息

基于上面的字符信息可以看出,这个/bin/webs二进制程序是一个修改版的thttpd,提供路由器管理员界面操作功能。看起来是经过了台湾明泰科技(D-Link的一个子公司)的修改。他们甚至很有心计的将他们很多自定义的函数名都辅以“alpha”前缀:

Alphanetworks' custom functions

明泰科技的自定义函数

这个alpha_auth_check函数看起来很有意思!

这个函数被很多地方调用,最明显的一个是来自alpha_httpd_parse_request函数:

Function call to alpha_auth_check

调用alpha_auth_check函数

我们可以看到alpha_auth_check函数接收一个参数(是存放在寄存器$s2里);如果alpha_auth_check返回-1(0xFFFFFFFF),程序将会跳到alpha_httpd_parse_request的结尾处,否则,它将继续处理请求。

寄存器$s2在被alpha_auth_check函数使用前的一些操作代码显示,它是一个指向一个数据结构体的指针,里面有一个char*指针,会指向从HTTP请求里接收到的各种数据;比如HTTP头信息和请求地址URL:

$s2 is a pointer to a data structure

$s2是一个指向一个数据结构体的指针

我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:

struct http_request_t {     char unknown[0xB8];     char *url; // At offset 0xB8 into the data structure };  int alpha_auth_check(struct http_request_t *request);

alpha_auth_check本身是一个非常简单的函数。它会针对http_request_t结构体里的一些指针进行字符串strcmp比较操作,然后调用check_login函数,实际上就是身份验证检查。如果一旦有字符串比较成功或check_login成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;

alpha_auth_check code snippet

alpha_auth_check函数代码片段

这些字符串比较过程看起来非常有趣。它们提取请求的URL地址(在http_request_t数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/” 或 “public/”。这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。

然而,这最后一个strcmp却是相当的吸引眼球:

An interesting string comparison in alpha_auth_check

alpha_auth_check函数中一个非常有趣的字符串比较

这个操作是将http_request_t结构体中偏移量0xD0的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”比较,如果字符匹配,就会跳过check_login函数,alpha_auth_check操作返回1(认证通过)。

我在谷歌上搜索了一下“xmlset_roodkcableoj28840ybtide”字符串,只发现在一个俄罗斯论坛里提到过它,说这是一个在/bin/webs里一个“非常有趣”的一行。我非常同意。

那么,这个神秘的字符串究竟是和什么东西进行比较?如果回顾一下调用路径,我们会发现http_request_t结构体被传进了好几个函数:

call_graph

事实证明,http_request_t结构体中处在偏移量 0xD0处的指针是由httpd_parse_request函数赋值的:

Checks for the User-Agent HTTP header

检查HTTP头信息中的User-Agent值

Populates http_request_t + 0xD0 with a pointer to the User-Agent header string

将http_request_t + 0xD0指针指向头信息User-Agent字符串

这代码实际上就是:

if(strstr(header, "User-Agent:") != NULL) {     http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t"); }

知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构:

#define AUTH_OK 1 #define AUTH_FAIL -1  int alpha_auth_check(struct http_request_t *request) {     if(strstr(request->url, "graphic/") ||        strstr(request->url, "public/") ||        strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)     {         return AUTH_OK;     }     else     {         // These arguments are probably user/pass or session info         if(check_login(request->0xC, request->0xE0) != 0)         {             return AUTH_OK;         }     }      return AUTH_FAIL; }

换句话说,如果浏览器的User-Agent值是 “xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的 设置(下面是D-Link路由器(DI-524UP)的截图,我没有 DIR-100型号的,但DI-524UP型号使用的是相同的固件):

Accessing the admin page of a DI-524UP

访问型号DI-524UP路由器的主界面

基于HTML页上的源代码信息和Shodan搜索结果,差不多可以得出这样的结论:下面的这些型号的D-Link路由器将会受到影响:

  • DIR-100
  • DI-524
  • DI-524UP
  • DI-604S
  • DI-604UP
  • DI-604+
  • TM-G5240

除此之外,几款Planex路由器显然也是用的同样的固件程序:

  • BRL-04UR
  • BRL-04CW

你很酷呀,D-Link。

脚注:万 能的网友指出,字符串“xmlset_roodkcableoj28840ybtide”是一个倒序文,反过来读就是 “editby04882joelbackdoor_teslmx”——edit by 04882joel backdoor _teslmx,这个后门的作者真是位天才!

posted @ 2013-10-26 09:33 paulwong 阅读(255) | 评论 (0)编辑 收藏

【转载】经典漫画讲解HDFS原理

分布式文件系统比较出名的有HDFS  和 GFS,其中HDFS比较简单一点。本文是一篇描述非常简洁易懂的漫画形式讲解HDFS的原理。比一般PPT要通俗易懂很多。不难得的学习资料。


1、三个部分: 客户端、nameserver(可理解为主控和文件索引,类似linux的inode)、datanode(存放实际数据)

在这里,client的形式我所了解的有两种,通过hadoop提供的api所编写的程序可以和hdfs进行交互,另外一种就是安装了hadoop的datanode其也可以通过命令行与hdfs系统进行交互,如在datanode上上传则使用如下命令行:bin/hadoop fs -put example1 user/chunk/


2、如何写数据过程





3、读取数据过程



4、容错:第一部分:故障类型及其检测方法(nodeserver 故障,和网络故障,和脏数据问题)




5、容错第二部分:读写容错



6、容错第三部分:dataNode 失效



7、备份规则



8、结束语

posted @ 2013-10-26 09:15 paulwong 阅读(634) | 评论 (0)编辑 收藏

OAUTH 2.0资源

http://wenku.baidu.com/view/0c80c91bb7360b4c2e3f647c.html


OAuth 2.0 Tutorial
http://tutorials.jenkov.com/oauth2/index.html


New JavaScript SDK & OAuth 2.0 based FBConnect Tutorial
http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/


Twitter OAuth
http://robfig.github.io/revel/samples/twitter-oauth.html










posted @ 2013-10-24 11:27 paulwong 阅读(487) | 评论 (0)编辑 收藏

vi 常用命令行

1.vi 模式
  a) 一般模式: vi 处理文件时,一进入该文件,就是一般模式了.
  b) 编辑模式:在一般模式下可以进行删除,复制,粘贴等操作,却无法进行编辑操作。等按下‘i,I,o,O,a,A,r,R’等
字母之后才能进入编辑模式.通常在linux中,按下上述字母时,左下方会出现'INSERT'或者‘REPLACE’字样,才可以
输入任何文字到文件中.要回到一般模式,按下[ESC]键即可.
  c) 命令行模式:在一般模式中,输入“: 或者/或者?”,即可将光标移动到最下面一行,在该模式下,您可以搜索数据,而且读取,
   存盘,大量删除字符,离开vi,显示行号等操作.

2.vi 常用命令汇总:

2.1 一般模式
  a) 移动光标:
  --> 上下左右方向键 ↑↓← →
  --> 翻页 pagedown / pageup 按键
  --> 数字 0 : 将光标移动到当前行首
   --> $ :   将光标移动到当前行尾
   --> G : 移动到这个文件的最后一行 nG : n 为数字,移动到这个文件的第n行.
  --> gg: 移动到这个文件的第一行 相当于 1G

  b) 搜索与替换
  --> /word : 从光标开始,向下查询一个名为word的字符串。
  --> :n1、n2s/word1/word2/g : n1 与n2 为数字.在第n1与n2行之间寻找word1这个字符串,
  并将该字符串替换为word2。
   --> :1、$s/word1/word2/g : 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2
  --> :1、$s/word1/word2/gc: 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2。
  并且在替换之前显示提示符给用户确认(conform)是否需要替换。
   c) 删除,复制,粘贴
   --> x,X : 在一行中,x为向后删除一个字符(相当于del键),X为向前删除一个字符(相当于backspace键)。
  --> dd : 删除光标所在的那一整行。
  --> ndd : n 为数字。从光标开始,删除向下n列。
   --> yy : 复制光标所在的那一行。
   --> nyy : n为数字。复制光标所在的向下n行。
   --> p,P : p 为将已复制的数据粘贴到光标的下一行,P则为贴在光标的上一行。
  --> u : 复原前一个操作
   --> CTRL + r : 重做上一个操作。
  --> 小数点'.': 重复前一个动作。

2.2 编辑模式:
  a) i, I : 在光标所在处插入输入文字,已存在的文字向后退。i 为‘从当前光标所在处插入’,I 为‘在当前所在行的一个非空格符处开始插入’。
   b) a, A : a 为‘从当前光标所在处的下一个字符开始插入’。A 为‘从光标所在行的最后一个字符处开始插入’。
  c) o,O : 这是英文o的大小写。o为‘在当前光标所在行的下一行处插入新的一行’。O表示‘在当前光标所在行的上一行插入新的一行’。
  d) r,R : 替换:r 会替换光标所在的那一个字符。 R : 会一直替换光标所在的字符,直到按下esc 键为止。
  e) ESC : 进入一般模式。

2.3 命令模式:
  a) :w : 将编辑的数据写入硬盘
   b) :q : 离开vi
   c) :q! : 强制离开,不存储
  d) :wq : 存储后离开
  e) :wq! : 强制存储后离开

3. vim 附加命令行
3.1 块选择(visual block)
  v 字符选择,将光标经过的地方反白显示
  V 行选择,会将光标经过的行反白选择
  ctrl + v 块选择,可以用长方形的方式选择数据
  y 复制反白的地方
  d 将反白的地方删除掉

3.2 多文件编辑
  :n 编辑下一个文件
    :N 编辑上一个文件
  :files 列出当前vim 打开的所有文件

3.3 多窗口功能
:sp 【filename】打开一个新窗口,如果加filename,表示在新窗口打开一个新文件
   否则表示两个窗口为同一个文件内容
ctrl+wj 先按下ctrl ,再按下w后,放开所有按键,然后按下j,则光标可移动到下方的窗口
ctrl+wk 同上,不过光标移动到上面的窗口
ctrl+wq 其实就是:q结束离开。

posted @ 2013-10-19 20:05 paulwong 阅读(269) | 评论 (0)编辑 收藏

一些数据切分、缓存、rpc框架、nosql方案资料

1、数据切分

        1.1、mysql中间件研究(Atlas,cobar,TDDL) 

        1.2、利用 MySQL Proxy 实现数据切分及整合 

        1.3、基于MySQL分库分表方案简介 

        1.4、tddl和diamond  

2、缓存

        2.1、java客户端三种方式操作 

        2.2、myibatis配置memcached评测 

        2.3、Memcached + Spring Caching 

        2.4、memcachedb-持久化存储的缓存系统 

        2.5、memcachedb让memcache的数据持久化 

        2.6、淘宝kv缓存框架tair 

        2.7、ibatis之扩展缓存ibatis-tair-cache 

3、rpc框架

        3.1、dubbo 

        3.2、hsf 未开源

        3.3、服务框架HSF分析之一容器启动

4、noSql

        4.1、学习NoSQL数据库的必读资料 

posted @ 2013-10-14 10:14 paulwong 阅读(2487) | 评论 (0)编辑 收藏

仅列出标题
共115页: First 上一页 59 60 61 62 63 64 65 66 67 下一页 Last