posts - 262,  comments - 221,  trackbacks - 0
posted @ 2012-02-18 18:57 Paul Lin 阅读(630) | 评论 (0)编辑 收藏
     摘要: 换句话说,当你找到与天赋、个性完全匹配的工作,它恰好处在上升期的市场,公司又提供了必要的授权与资源,那么你就很容易成功。反之,若这三点中的任何一点不匹配,那么你就是个loser。  阅读全文
posted @ 2012-02-18 18:27 Paul Lin 阅读(654) | 评论 (0)编辑 收藏
posted @ 2012-02-18 18:09 Paul Lin 阅读(563) | 评论 (0)编辑 收藏
     摘要: 这是一篇集百家之长的笔记,分别参考了《Rails3 in Action》和 RVM官方文档,ninjahideout.com 之后的安装文档。


这里使用到的各种软件包括:



  • Ubuntu

  • Virtual Box

  • Vagrant

  • RVM

  • Capistrano

  • Passenger

  • Nginx

  • MySQL

  • PostgreSQL



还涉及到Git、GitHub、SSH等技术   阅读全文
posted @ 2011-11-21 16:22 Paul Lin 阅读(1674) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2011-11-13 23:29 Paul Lin 阅读(10992) | 评论 (1)编辑 收藏
终于花了将近4个月的时间,把《Learn Rails3 by example》的E文版看完了,心中那个成就感和满足感啊~~

继续下一轮的针对性学习计划,计划包括:

1. Rails应用的部署和性能监控

2. Rails的MVC架构和Cache

3. JS和JS与Rails的结合使用

4. Ruby的语法和特性

5. MySQL配置和调优

6. 搜索引擎和推荐引擎的学习

7. NoSQL专题
 
posted @ 2011-11-03 00:17 Paul Lin 阅读(731) | 评论 (0)编辑 收藏
关于RVM + REE + Ngix + Passenger + Capistrano的安装配置,非常详细!强烈推荐

http://blog.ninjahideout.com/posts/a-guide-to-a-nginx-passenger-and-rvm-server
posted @ 2011-11-03 00:14 Paul Lin 阅读(701) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2011-10-03 17:36 Paul Lin| 编辑 收藏

在上一篇《自动化测试狂人的Rails测试优化之路》中,我演示了如何使用Guard-spork, Guard-rspec和Spork, Rspec来进行自动化测试和集成测试。

今天发现存在一个bug,那就是当model文件被修改后,虽然会重新启动rspec执行测试。但是测试的代码不是最新的,而是继续沿用已经加载到内存的model文件。网上搜索一番后,发现问题的原因是spork的预加载问题。于是在spork的spork.each_run方法中加入如下代码,重启sprok,解决问题

Dir["#{Rails.root}/app/models/**/*.rb"].each do |model| 
  load model
end

 

posted @ 2011-09-06 14:21 Paul Lin 阅读(679) | 评论 (0)编辑 收藏

假如我们把attr_accessible设置成只有name是可以访问的,然后在Console中执行如下命令:

ruby-1.9.2-p180 :001 > user = User.create(:name => "Paul", :email => "pengpenglin@163.com")
 
=> #<User id: 1, name: "Paul", email: nil, created_at: "2011-09-03 04:42:59", updated_at: "2011-09-03 04:42:59"> 
ruby-1.9.2-p180 :002 > user.email
 
=> nil 
ruby-1.9.2-p180 :003 > user.email = "bob@163.com"
 
=> "bob@163.com" 
ruby-1.9.2-p180 :004 > user.email
 
=> "bob@163.com" 
ruby-1.9.2-p180 :005 > user.save
 
=> true 
ruby-1.9.2-p180 :006 > user.reload.email
 
=> "bob@163.com" 
ruby-1.9.2-p180 :007 > User.find(1)
 
=> #<User id: 1, name: "Paul", email: "bob@163.com", created_at: "2011-09-03 04:42:59", updated_at: "2011-09-03 04:43:31"> 

不是not accessible 吗?怎么email还是能够改变?

posted @ 2011-09-03 12:51 Paul Lin 阅读(1226) | 评论 (1)编辑 收藏
     摘要: 我们要修改的文件会涉及到4个:
A. Gemfile
B. .rspec
C. Guardfile
D. rspec_helper.rb  阅读全文
posted @ 2011-08-31 00:44 Paul Lin 阅读(1835) | 评论 (1)编辑 收藏
     摘要: 从RailsCast.com筛选出来的视频  阅读全文
posted @ 2011-08-29 15:58 Paul Lin 阅读(580) | 评论 (0)编辑 收藏
     摘要: NERDTree.vim:显示目录树和标签(特别有用)
Rails.vim:这个不说了,Rails开发必备
Snipmate.vim:代码片段自动完成,Rails开发神器之一
FuzzyFinder.vim:模糊查找,使用频率最高的插件之一
TabBar:BufferExpoloer的增强版,用来标识打开的文件的
Supertab.vim:文本自动完成
Rubytest.vim:vim下的集成测试工具  阅读全文
posted @ 2011-07-26 12:46 Paul Lin 阅读(3404) | 评论 (0)编辑 收藏
BDD style unit testing video and slides@RubyKaigi 2011

How I Test

watchr 灵活的Continuous Testing测试工具可替代autotest...

不要盲目的 BDD / TDD,我對寫測試的看法
posted @ 2011-07-19 20:06 Paul Lin 阅读(344) | 评论 (0)编辑 收藏
     摘要: 针对这种情况,我们可以使用一个名为Guard的gem,来自动监控spork中预加载的文件发生变化后,自动重启spork

1).在Gemfile中增加gem 'guard-spork'
2).在shell中gem install libnotify / gem install inotify
3).bundle install
4).guard init spork
5).guard start  阅读全文
posted @ 2011-07-15 18:12 Paul Lin 阅读(421) | 评论 (0)编辑 收藏
     摘要: 首先我们来理解Autotest的触发机制:

1. 要有一套测试的框架和工具(Console,GUI)

2. 要有可以感知被测试对象发生变化的机制

3. 要有自动加载被测试对象和环境数据的机制

4. 要有将测试结果展示给用户的机制  阅读全文
posted @ 2011-07-15 00:14 Paul Lin 阅读(644) | 评论 (0)编辑 收藏
     摘要: 网上google了一下,发觉又是一个Rails和其他gem不兼容的问题,只要把rake的版本设置为0.8.7就可以了。  阅读全文
posted @ 2011-07-03 21:28 Paul Lin 阅读(1418) | 评论 (1)编辑 收藏
posted @ 2011-06-25 13:40 Paul Lin 阅读(351) | 评论 (0)编辑 收藏
posted @ 2011-06-18 23:02 Paul Lin 阅读(303) | 评论 (0)编辑 收藏
     摘要: ....
甲:嗯....可是这样看起来,我完全看不到敏捷的任何好处啊
乙:嗯。实际上,我更喜欢RUP,虽然麻烦但很清楚
....  阅读全文
posted @ 2011-06-01 23:31 Paul Lin 阅读(908) | 评论 (1)编辑 收藏
     摘要: 来自JE上的一篇Rails实战文章,很不错!  阅读全文
posted @ 2011-05-27 16:47 Paul Lin 阅读(844) | 评论 (0)编辑 收藏
QCon 2011大会的PPT下载。其中有我最感兴趣的架构设计和NoSQL技术:


企业敏捷转型之路
http://www.everbox.com/f/Rgo5syChjzuLeS6wJEAQZwvkje


深入浅出NoSQL
http://www.everbox.com/f/TQMXMI6asloYQFJLIxGy2WIIyo


设计优良的架构
http://www.everbox.com/f/XCZvXDTbft6ZlK8TsUlMWfVBjO


Web性能与扩展
http://t.sina.com.cn/1746173800/wr4mQk5Iwn


来自一线项目的实战经验
http://www.everbox.com/f/FZHFfXanIGZOasZsqSZpFuSSFk


HTML5开发平台
http://www.everbox.com/f/qeD2qvae9LVRXCA3HsNq2ztiBY
posted @ 2011-04-21 16:58 Paul Lin 阅读(551) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2011-03-23 11:55 Paul Lin 阅读(483) | 评论 (0)编辑 收藏

原文:http://www.javaeye.com/news/20399

大多数管理者都会陷入放权的困境。你很忙,每件事都要亲力亲为。你很清楚自己需要别人帮忙,但你没有足够的时间寻找并培训别人来帮你。所以,你更加努力地工作,直到自己崩溃。

  下面这个故事讲述了我如何放权。

  2001年,CD Baby成立三周年。我已有8名员工,但所有其他事情仍然需要我自己做。每周7天,从上午7点工作到晚上10点,自己仍然要经手每件事情。

  每隔5分钟,就会有员工向我请示:

  • “Derek,有个家伙想修改网站上已经存在的相册,我该怎么跟他说呢?”
  • “Derek,我们可以接受电汇作为一种支付方式吗?”
  • “Derek,有个人今天下了两个订单,他想知道我们可不可以给他一起邮寄过去,并且把节省的邮费给他退回去?”


  如果整天不停地回答问题,那么什么事也做不成。我感觉我好像是每天去上班,然后在过道里坐着,全职回答员工的问题。

  我的忍耐已经到了极限,我不再去办公室,并且关掉了手机。随即,我意识到自己正在逃避问题,而不是去解决问题。我必须解决这个问题,要不然就坏了。

  经过一夜的反思,我最终在思想上接受放权。

  我必须放权,我不是我公司的必需品,没有我,我的团队照样也可以经营公司。

  第二天,我一进门,有人就请示我,“Derek,我们昨天收到了一个客户送来的CD,但他今天改变了主意,他想让我们退回他的CD。我们给他邮寄了回去,但他又问我们能不能退还他的安装费用,因为他从未登录过网站。”
这一次,我并没有仅仅回答了他的问题,而是把大家都召集起来。

  我给大家解释了事情的经过,和需要解决的问题。我回答了问题,但更重要的是,我解释了自己思考的过程和回答背后的理念。

  “是的,我给他全额退款了。这样,我们会受到一点损失。但是,最重要的是经常做一些能让顾客高兴的事,只要不过分就行。像这样一个小小的表示对我们大有裨益,他可能会因此告诉他的朋友们,我们是一家不错的公司。每个人都要记住,帮助音乐爱好者是我们的首要目标,利润是其次。你们将来可以根据这条准则来自己做决定,我会完全同意。做那些能让他们高兴的事。要确保每个跟我们做生意的人都会满意而归。”

  我一一问了每个人,确保他们都理解我的回答。

  我让一位员工起草一本手册,把这种情况的处理方式记录下来,并附上解决这种问题的理念。

  然后,每个人都回去工作了。

  十分钟之后,新的问题,相同的过程:

  • 1. 召集所有人
  • 2. 回答问题,解释理念
  • 3. 确保每个人都理解整个过程
  • 4. 让一名员工把这条记录在册
  • 5. 让他们知道,下次没有我他们也可以这样处理问题

  2个月之后,没有员工请示了。

  然后我想员工们展示了事情的最后一部分,也就是我自己的工作。作为学习的一部分,他们也需要把这个记录在册,然后给其他人看(由教而学)。


  现在,公司完全不需要我了。我开始在家里工作,不再去办公室了。我甚至教过他们我关于雇佣新员工的思考过程和理念。所以,有两个新员工是完全由他们发现、面试、雇佣以及培训的。他们用那本手册来让每个新员工理解这种理念以及它的历史,并且知道怎么自己做决定。我每周去视察一次,确保一切正常。确实一切正常,他们甚至都没有什么事情向我请示。

  因为业务由我的团队负责运作,我可以心无旁骛地改进业务。我去了加利福尼亚,只是弄清楚事情由他们运作。

  我现在仍然每天工作12个小时,但是,我把所有时间都花在业务改进、优化以及创新上。对我来说,这才是最有趣的事情。这是在玩,不是工作。

  我放权之后,公司市值在四年里从一百万增长到两千万。管理者和企业家之间有很大的不同。作为管理者你会感觉很自由,直到你意识到如果自己不工作,公司就会倒闭。

  要成为一名真正的企业家,你要确保自己能够离开一年,而当你回来时,你的公司比你离开时运营得更好。

posted @ 2011-03-20 10:22 Paul Lin 阅读(327) | 评论 (0)编辑 收藏
第1篇:NoSQL开篇——为什么要使用NoSQL

第2篇:关系数据库还是NoSQL数据库

第3篇:NoSQL架构实践(一)——以NoSQL为辅

第4篇:NoSQL架构实践(二)——以NoSQL为主

下载:NoSQL实战

重点推荐第3篇的最后一种架构:


特别适合SNS的业务架构:把某些关系key存储在MySQL中,用于后续的业务数据分析和挖掘,而把大量的文本和图片存储在类似MongoDB这样的文档型NoSQL。可以利用关系型数据库的强有力的计算能力专注于数据分析和挖掘,而用NoSQL解决数据的读写和存储瓶颈。

由于NoSQL在线性扩展,分布式部署方面有先天优势,可以有效地改善由于数据规模扩大时压力问题,同时关系型数据库存储的数据大大减少,也有利于数据的备份和同步。
posted @ 2011-03-19 22:45 Paul Lin 阅读(427) | 评论 (0)编辑 收藏
http://www.slideshare.net/mongodb/mongodb-at-the-silicon-valley-iphone-and-ipad-developers-meetup?from=ss_embed
posted @ 2011-01-13 00:00 Paul Lin 阅读(669) | 评论 (0)编辑 收藏
http://my.safaribooksonline.com/book/web-development/ruby/9780132480345

很不错,居然全部都可以免费看。

posted @ 2010-12-12 23:56 Paul Lin 阅读(481) | 评论 (0)编辑 收藏
     摘要: 在本节,你将学到如何撰写合乎逻辑的、紧凑的标记,使得你有能力将带宽流量降低50%左右,在减少服务器负担和压力的同时,减少网站的加载时间。通过去除那些表现元素,并改掉那些没有任何好处的坏习惯,我们就可以达到上述的目的。

这些坏习惯折磨着网络中的许多站点,特别是那些将 CSS 代码与主要基于表格的布局混合在一起的站点。这种做法笨拙且不经济,即使是对于那些在其他领域很有经验的设计师来说。同时,出现这个问题的几率是均等的,不论是那些手写代码的站点,还是利用可见编辑工具,比如 Dreamweaver 和 GoLive,来创建的站点。

本节会提出这些常见的错误,这样你就可以识别和防范它们,并且学会如何改正错误。我们详细阐述唯一标识符属性 (id) - ,并展示它如何使你可以编写极其紧凑的 XHTML 代码,不论你创建的是混合布局还是纯粹的 CSS 布局。  阅读全文
posted @ 2010-11-18 15:25 Paul Lin 阅读(532) | 评论 (1)编辑 收藏
     摘要: 我确实希望本节的内容可以激发你的兴趣,并鼓励你去尝试。为什么这么说呢?因为一旦你掌握了本章包含的简单容易的理念,你就会重新思考网页运作的方式,并开始改变建造它们的方法。然而我并不希望你只是将代码重新改写一遍。我希望你可以实实在在地以另一种方式思考和工作。

另一方面,重构才是 XHTML 真正的意义。  阅读全文
posted @ 2010-11-18 14:58 Paul Lin 阅读(327) | 评论 (0)编辑 收藏
1. 详解CSS选择器、优先级与匹配原理

2. 5步让你的CSS样式表成功减肥

3. 10个CSS简写技巧让你永远受用

4. CSS的声明中,对于选择器的描述方式有多种不同的写法和适用范围:

    A. 标签名选择器声明方式:p {color: red;} --- 选中某种元素

    B. 分组选择器声明方式:h1, h2, h3 {color: red;} --- 选中固定数目的多种元素

    C. 派生选择器声明方式:li td {color: red;}   --- 选中某种上下文关系元素

    D. ID选择器声明方式: #title {color: red;} --- 选中指定id元素

    E. Class选择器声明方式: .title {color: red;}   --- 选中不定数目的多种元素

  F. ID派生选择器声明方式: #title table {color: red;} --- 选中指定id下特定上下文关系元素

   G. Class派生选择器声明方式: .title table {color: red;}  --- 选中多种类型下特定上下文关系元素

   H. 类型选择器声明方式:table.title {color: red;}  --- 选中某种元素的某种类型

   I. 伪类选择器声明方式:a:visited {color: red;}  --- 选中某种状态下元素

   J. 类型伪类选择器声明方式:a.news:visited {color: blue;}  --- 选中某种元素的某种状态下的类型

posted @ 2010-11-09 10:45 Paul Lin 阅读(359) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2010-11-05 16:20 Paul Lin 阅读(318) | 评论 (0)编辑 收藏

 http://www.theserverside.com/news/1363955/Taking-the-load-off-OSCache-helps-databases-cope

posted @ 2010-11-03 17:08 Paul Lin 阅读(372) | 评论 (0)编辑 收藏
     摘要: OSCache是一套用Java编写的缓存框架(或者说解决方案),它主要用于页面缓存,Servlet缓存,或者其它任意的对象。OSCache使用基于内存或者磁盘的缓存策略。不同的策略有不同的适用场合:基于内存的缓存非常快,但是不能持久化,而且不能存储大量数据,适合频繁访问的数据。基于磁盘的缓存可以分为使用文件和数据库缓存,它的速度比内存缓存慢,但可以被持久化,可以在服务器重启重启,数据库奔溃时仍然运作,而且可以存储较多的数据。适合于大量非频繁访问的数据,或者复杂计算结果的缓存。  阅读全文
posted @ 2010-10-22 21:39 Paul Lin 阅读(513) | 评论 (0)编辑 收藏
最近由于工作学习需要,开始研究缓存技术。从网上找到了不少的资料,按照时间的顺序排列,也可以从中看出缓存技术,框架已经工具的演变历史。

基本知识:《缓存技术》: http://blog.csdn.net/fanweiwei/archive/2007/01/07/1476131.aspx

《缓存漫谈》: http://www.blogjava.net/BlueDavy/archive/2006/06/02/50076.html

《网站缓存技术》:http://dcross.javaeye.com/blog/721468

《缓存技术浅谈》:http://robbin.javaeye.com/blog/770553
posted @ 2010-10-19 16:12 Paul Lin 阅读(435) | 评论 (0)编辑 收藏
     摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题  阅读全文
posted @ 2010-10-19 11:09 Paul Lin 阅读(495) | 评论 (0)编辑 收藏
     摘要: InfoQ上有一篇《深入浅出REST》的文章:http://www.infoq.com/cn/articles/rest-introduction

看完后有如下疑问:

A. 观点1中这个“ID”如何定义?
B. 要为那些“事物”定义ID?
C. 使用链接指向任何可以标识的事物
D. “标准方法”是否够用?
E. 无状态通信如何实现  阅读全文
posted @ 2010-09-07 11:04 Paul Lin 阅读(1779) | 评论 (1)编辑 收藏
     摘要: 原文链接:http://www.javaeye.com/topic/698774

这篇文章放到这个版面,因为我认为它属于管理的范畴:个人管理(时间管理、知识管理)。

是不是大家也有这种体会:


网站注册越来越没耐心,看到页面全是文本框、下拉框,就心烦,咔一下关了。
文章超过两屏的,就没勇气往下看。
看到文章的相关链接,没完没了,两小时后,脑袋一片混乱,真想凉水冲冲。
Google Reader的未读项又是1000+了,看吧,压力太大,不看吧,有种挫败感,干脆,全部设置为已读。

焦虑、挫败、恐惧,什么感觉都来了,唯独没有愉悦感。

......  阅读全文
posted @ 2010-07-13 17:36 Paul Lin 阅读(455) | 评论 (0)编辑 收藏
①gem install

install命令用于安装指定的gem包,常用的方式是:gem install rails。我们也可以指定版本:gem install rails --version=2.3.5

②gem uninstall

uninstall命令用于反安装gem包,不过要注意的是这个命令并不会删除你之前安装的gem包,而只是把它从path中删除而已。如果我执行以下的命令

 gem install rails --version=2.3.4
 gem uninstall rails --version=2.3.4
 gem install rails --version=2.3.5

实际上rails 2.3.4版本依然还在,只不过你在命令行下执行rails -v的时候是显示rails 2.3.5而已。

③gem cleanup

这个命令配合gem uninstall使用的话可以完全删除旧版本的gem包,所以在上面的例子中如果我需要完全卸载rails 2.3.4的话,只需要再执行
 gem cleanup就可以了

④使用指定的rails版本编译运行

rails _版本号_ 项目名称
posted @ 2010-06-24 17:39 Paul Lin 阅读(1492) | 评论 (0)编辑 收藏
     摘要: 所以我们一定要记住:options={}是用来传递请求参数的,而html_options={}是用来设置请求报头的,不能搞混!  阅读全文
posted @ 2010-05-17 16:41 Paul Lin 阅读(6491) | 评论 (4)编辑 收藏
     摘要: 下面我们来回忆一下整个过程,我们会发现使用RoR创建Web应用真是如此简单而充满乐趣!

●命令:
A.rails 项目名称
B.rake db:create RAILS_VERSION='数据库模式'
C.ruby script/generate scaffold 表名 字段名:字段类型
D.rake db:migrate
E.ruby script/server WEBrick

●代码:
validates_presence_of :title, :description, :image_url, :price
validates_length_of :title, :minimum => 10
validates_numericality_of :price
validates_uniqueness_of :title

只需要花你差不多了5分钟的时间而已~,That's all !  阅读全文
posted @ 2010-05-15 12:02 Paul Lin 阅读(647) | 评论 (0)编辑 收藏
     摘要: 豆瓣已经成为一种文化符号,一种现象,一个被所有有志于Web 2.0创业的人研究的对象。不过也正如文中所说的,豆瓣的软肋在于:缺乏原创的内容,不过从现在豆瓣的发展来看已经开始布局原创内容了。“豆瓣电台”就是这样一个理念的产品  阅读全文
posted @ 2010-05-10 17:35 Paul Lin 阅读(628) | 评论 (0)编辑 收藏
     摘要: 总之,长尾理论的提出是互联网发展的一项重要里程碑,也是Web2.0时代很多企业的盈利模式的重要理论依据,同时也可以解决传统经济学意义上的很多约束。这也就为创业者和企业家提供了更为广泛的思路,但在运用长尾理论的过程中我们还要避免把长尾理论与二八理论彻底对立、盲目追求“长尾市场”、过度追求产品或者服务的个性化等误区。本人认为长尾理论的理论体系有多么完善并不是最重要的,重要的是运用长尾是一种理念,是指导企业自身定位以及战略和战术行为的思维运营模式,而如何利用这种长尾理念形成一种盈利模式才是最关键的。  阅读全文
posted @ 2010-05-10 16:10 Paul Lin 阅读(329) | 评论 (0)编辑 收藏

【暗夜列车】

      小成本的“道德教育片”,告诉你“出来混,总是要还的”,“不是不报,时候未到”,还有最重要的一点“死人的东西是不能乱碰的”。

 推荐指数:★★★


【荒野生存】

       一个理想主义者的传奇,一个藐视世俗者的精神胜利,一个徒步者的孤独旅程。为了理想中绝对的自由,为了理想中没有虚伪的世界,为了理想中的真我,只身踏上旅程。

推荐指数:★★★★


【末日危途】

       当未来遥不可及,当世界已成废墟,当文明已经毁灭殆尽 ---- 你是否依然坚信希望在前方,还是选择麻木地活着?你是否依然坚持着那最后的做人底线,还是为了生存而无所不用其极?你是否坚信这世界依然有人值得信任,还是选择用枪口对准每一个试图接近的陌生人?

       绝望~ 绝望~ 还是绝望~,人性 VS 兽性

推荐指数:★★★★


【禁闭岛】

      如果你看过《穆赫兰道》,《记忆碎片》,那么你应该习惯了好莱坞导演这种颠倒顺序,角色乱入,亦真亦假的手段。

      人的精神力量是无比强大的,必要时甚至可以创造出一个虚拟的世界。只为在潜意识中强化自己的逻辑和逃避罪责

      这是一部精神病者的历险大片,也可以看作是一部关于如何治疗迫害妄想症的教学片。

推荐指数:★★★★★

 

【岁月神偷】
      岁月是最高明的小偷,他偷走了我们的容貌,偷走了我们的青春,偷走了我们的亲人,模糊了我们的记忆。借助电影的手段,我们又一次找回了被岁月偷走的那份久违的温馨和感动。

      成为一部烂片的原因有很多,但是成为一部优秀的电影总是有那么一两个因素的:它们总是能巧妙地运用声,光,影,将一切看似平淡的东西像变魔术般进行组合,准确地击中你内心某一处柔软的地方。

      不需太多,有感动则足矣!

推荐指数:★★★★★

posted @ 2010-04-28 13:40 Paul Lin 阅读(467) | 评论 (0)编辑 收藏
     摘要: 摘在SUN 的J2EE Tutoria 第33章的第3节《The JMS API Programming Model 》全面地介绍了JMS的编程模型  阅读全文
posted @ 2010-04-17 22:39 Paul Lin 阅读(774) | 评论 (0)编辑 收藏
     摘要: 我要介绍的内容包括以下几个方面:
1、memcached的简介
2、memcached的应用场景
3、memcached的安装
4、memcached的使用
5、memcached的部署架构
6、memcached的局限性
7、memcached的改进

转自:http://wangzebin.blog.51cto.com/653300/128235 原文作者:王泽宾  阅读全文
posted @ 2010-04-08 01:08 Paul Lin 阅读(4289) | 评论 (6)编辑 收藏
     摘要: 目前为止见过的对架构师责职分析最深刻的文章

转自:http://wangzebin.blog.51cto.com/653300/135640 原文作者:王泽宾  阅读全文
posted @ 2010-04-08 01:03 Paul Lin 阅读(2254) | 评论 (0)编辑 收藏
     摘要: 如果个人或者小公司去做综合类网站,这是很不靠谱的事。现如今小网站的存活之道一定是垂直的,而且必须要有一个非常显著的亮点,只有把这个亮点深挖进去,吃透了,而且还能将它做到极致才行。从一开始就想搞一个大而全的网站,设置那么多的频道,这不仅对于拉动流量没有效果,而且还会把你的亮点给淹没了。如果你要做综合类网站,那么你需要有实力、不差钱才行,推广手段就是用钱去砸,小网站绝对不会有这么大的财力去拼。

转自:http://wangzebin.blog.51cto.com/653300/142382 原文作者:王泽宾
  阅读全文
posted @ 2010-04-08 00:58 Paul Lin 阅读(1399) | 评论 (0)编辑 收藏
     摘要: 相当好的文章,后面的评论更加精彩!  阅读全文
posted @ 2010-04-08 00:55 Paul Lin 阅读(4246) | 评论 (2)编辑 收藏
     摘要: 这是一个基于C++写的Java源代码反编译工具,界面类似于EClipse,而且反编译的效果不错,出错率比较低。支持整个Jar包的反编译,支持界面拖放。速度很快,语法高亮显示!

而且这是一个绿色软件,不需要任何的安装,双击exe文件运行即可。卸载时只需要把exe和cfg文件删除即可。  阅读全文
posted @ 2010-04-07 11:10 Paul Lin 阅读(2409) | 评论 (3)编辑 收藏
     摘要: Apache commons CLI是一个开源的,用于处理命令行的工具包。这个包目前的稳定版本是1.2,他非常简单只有20个左右的class,但提供了几乎所以可以用到的命令行功能。它的主页在这里:Apache commons CLI

根据CLI的逻辑,每一个命令行的处理都可以分为3个步骤:定义、解析、交互
①定义:定义命令行的各种选项属性(包括缩写、全写、是否必须、是否带参数、参数个数限制)
②解析:使用解析器对命令行选项列表进行解析
③交互:从解析好的命令行查询用户输入的参数值并进行处理  阅读全文
posted @ 2010-04-02 14:20 Paul Lin 阅读(1063) | 评论 (0)编辑 收藏
     摘要: 1.基本功能过滤器
=============================================
①类型:DirectoryFileFilter、FileFileFilter
②大小:EmptyFileFilter、SizeFileFilter
③时间:AgeFileFilter
④名称:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
⑤读写属性:CanReadFileFilter、CanWriteFileFilter
⑥隐藏属性:HiddenFileFilter

2.逻辑关系过滤器
=============================================
①逻辑与:AndFileFilter
②逻辑或:OrFileFilter
③逻辑非:NotFileFilter
④永真/假:TrueFileFilter、FalseFil  阅读全文
posted @ 2010-04-01 17:52 Paul Lin 阅读(3160) | 评论 (1)编辑 收藏
     摘要: Apache commons IO包中提供了一个可以遍历目录下资源的DirectoryWalker,还有很多的IOFileFilter用于过滤文件目录。下面的例子分别演示了这个功能。

这两个搜索类都是以内部类的方式嵌入客户端的,客户端接收客户的参数,然后通过一个后台线程来进行搜索,等待子线程完成搜索后(join方法),再打印搜索结果。

注意这个过程是可以被cancel的。cancel主要有2种情况。外部cancel:外部线程通过调用内部类的cancel()方法。内部cancel:在handleDirectory、handleFile中主动抛出CancelException。

walk方法在每次执行前、后都会检查当前是否有cancel指令发出(checkIfCancelled ---> handleIsCancelled),如果有那么默认立刻抛出CancelException,然后调用handleCancelled方法。  阅读全文
posted @ 2010-03-31 23:45 Paul Lin 阅读(2558) | 评论 (1)编辑 收藏

从 同一个源文件(15M左右)使用不同的方式读入,一种是读入后构造成一个String,另外一个是读入后构造成一个List。然后再调用 writeLines(File, String)和writeLines(File, Collection)写入。下面是测试比较的结果:

Read and write by string format
  File sizes(bytes): 15661680
  Content read(bytes): 15661680
  Time costing(ms) on reading: 2047
  Time costing(ms) on writing: 1016


Read and write by collection format
  File sizes(bytes): 15661680
  File read(lines): 1782615
  Time costing(ms) on reading: 2047
  Time costing(ms) on writing: 533437


效率相差之多! 我的测试环境如下:

OS:Win XP SP4
CPU:Intel Core(TM) 2 Duo CPU
内存:800M(虚拟机分配)
JDK:JDK 5.0 (JVM内存分配:-Xms64m -Xmx512m)
测试文件:15.295M (是一个IP地址文件,总共1782615行)

在读方面时间居然相当(这里面应该有操作系统层面的缓冲作用,我单独地测试时第2个方式总比第一个慢1/3左右)。而在写方面性能简直是天壤之别啊:533437/1016 ≈525倍。

虽然我这个测试还是不严谨的,但是从方法实现过程和原理来看,两者性能差异存在必然的因素:

①以Collection方式去构造的,在读取的过程中生成多个小String,而生成String是一项耗时的工作
②以Collection方式去写的,首先要迭代这个Collection,然后每次调用Collection中的元素的toString()方法,造成多次的堆栈操作



posted @ 2010-03-30 00:19 Paul Lin 阅读(6023) | 评论 (0)编辑 收藏
     摘要: 最近在对之前做过的一个项目进行二期修改。鉴于之前典型的贫血结构,以及Controller--->Service--->DAO模式让代码压力都集中在service层的情况。在参考了Banq写的几篇对象职责和Domain Event的文章后,我也试着捣鼓了一下新的分层模式。贴出来和大家讨论,欢迎拍砖!  阅读全文
posted @ 2010-03-23 17:05 Paul Lin 阅读(1571) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2010-03-19 23:11 Paul Lin 阅读(563) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2010-03-19 22:21 Paul Lin 阅读(1515) | 评论 (0)编辑 收藏
     摘要: Spring对事务传播的定义和事务操作性能优化  阅读全文
posted @ 2010-03-15 11:09 Paul Lin 阅读(2598) | 评论 (0)编辑 收藏
     摘要: 乐观锁定采用的版本策略实际上和SVN的版本冲突解决方案是同样的:采用其它人的(先提交的)、采用自己的(后提交的)、合并他人和自己的(合并冲突更新)
悲观锁定(Pessimistic locking)会采用基于数据库提供的锁机制来进行锁定。它会在物理层对行甚至表进行锁定。使得应用的并发性变差。  阅读全文
posted @ 2010-03-15 11:07 Paul Lin 阅读(1487) | 评论 (0)编辑 收藏
     摘要: READ COMMITITED:不允许读取未提交的数据,但可以读取已提交的数据。所以可能出现不可重复读、和幻像读(读的过程依然可以被修改、增加、删除)


REPEATABLE READ:通过行锁定,在读的数据不允许其它进程修改。确保已读取的数据不被修改、删除(不可重复读)但无法阻止其它进程写入新数据,所以不能确保读取到新的数据(幻像读)

SERIALIZABLE:通过表锁定,彻底禁止读取期间其它进程的修改、删除(屏蔽不可重复读)和增加(屏蔽幻像读)

但是不管是那种隔离级别,对第一类丢失更新都是不能接收的  阅读全文
posted @ 2010-03-15 11:04 Paul Lin 阅读(1062) | 评论 (0)编辑 收藏
     摘要: 一级、二级缓存使用的key均为po的主键ID,value即为po实例对象,查询缓存使用的则为查询的条件(hql转化而成的sql语句)、查询的参数、查询的页数,value有两种情况,如果采用的是select po.property这样的方式那么value为整个结果集,如采用的是from这样的方式那么value为获取的结果集中各po对象的主键ID,这样的作用很明显,节省内存。  阅读全文
posted @ 2010-03-15 11:00 Paul Lin 阅读(4076) | 评论 (0)编辑 收藏
     摘要: 关于Memcached入门知识点  阅读全文
posted @ 2010-03-15 10:57 Paul Lin 阅读(2251) | 评论 (0)编辑 收藏
     摘要: ①同步的操作,如果在等待的过程不能做别的事情,它是同步+阻塞的。这个也是最常见的
②同步的操作,如果在等待的过程可以做别的事情,它是同步+非阻塞的。
③异步的操作,如果在等待的过程不能做别的事情,它是异步+阻塞的。
④异步的操作,如果在等待的过程可以做别的事情,它是异步+非阻塞的。这个也是最常见的  阅读全文
posted @ 2010-03-10 15:36 Paul Lin 阅读(2780) | 评论 (2)编辑 收藏
     摘要: 同步/异步:消息通知机制。是自己主动关注消息还是靠别人通知
阻塞/非阻塞:消息处理机制。等待消息处理完成的过程能否做别的事情  阅读全文
posted @ 2010-03-10 14:54 Paul Lin 阅读(2623) | 评论 (0)编辑 收藏
     摘要: 要使用DirectoryWalker来遍历一个目录并进行相应的操作,步骤如下:

①创建一个继续于DirectoryWalker的类,并在构造方法中调用super();
②定义一个业务入口方法,例如clean。在这个方法中调用walk方法
③覆盖DirectoryWalker类的handleDirectory方法,提供相应的处理逻辑
④覆盖DirectoryWalker类的handleFile方法,提供相应的处理逻辑  阅读全文
posted @ 2010-03-09 00:26 Paul Lin 阅读(3508) | 评论 (1)编辑 收藏
     摘要: 它们可以分为两大类:
①实质性过滤器:例如针对文件的类型,属性,名称,大小进行过滤的过滤器
②过滤器连接器:典型的包括AndFileFilter、OrFileFilter。用于逻辑连接多个过滤器  阅读全文
posted @ 2010-03-09 00:02 Paul Lin 阅读(1347) | 评论 (0)编辑 收藏
     摘要: 对IOUtils类的剖析  阅读全文
posted @ 2010-03-08 21:24 Paul Lin 阅读(2381) | 评论 (0)编辑 收藏
     摘要: FileUtils总体上来说,主要功能有:
※ 资源的创建、删除
※ 资源的复制、移动
※ 资源的读写
※ 资源的比较
※ 资源的过滤
※ 资源的转换  阅读全文
posted @ 2010-03-08 15:07 Paul Lin 阅读(6565) | 评论 (1)编辑 收藏
     摘要: 使用Apache commons IO包规范文件名  阅读全文
posted @ 2010-03-08 10:56 Paul Lin 阅读(846) | 评论 (0)编辑 收藏
     摘要: 本文通过对Apache commons io包的input,output子类的源代码研究,来揭示为什么使用commons IO包会在性能上由于JDK自带的IO类。

特别是输出流方面  阅读全文
posted @ 2010-03-04 10:28 Paul Lin 阅读(5640) | 评论 (0)编辑 收藏
     摘要: 使用图例全面展示Java中IO的架构,特别是节点流和过滤流及其之间的转换  阅读全文
posted @ 2010-03-02 09:47 Paul Lin 阅读(4306) | 评论 (3)编辑 收藏
     摘要: 良好的编程习惯,对编码和数据传输流程的清晰认识,规范的配置是确保JavaEE应用不会出现乱码的三大法宝  阅读全文
posted @ 2010-02-24 10:25 Paul Lin 阅读(4308) | 评论 (1)编辑 收藏
     摘要: 可以看到该命令对于英文字符,数字不会转换而是直接输出,而对于每个中文字符则转换成以\u开头的4个16进制数字。

通常情况下,如果要进行字符的逆转换,-encoding encoding_name这个参数都会配合-reverse出现。在上面的例子中因为本地系统是中文操作系统,所以即便没有指定-encoding也可以正确地从unicode ---》GBK。如果是在英文平台下由于默认字符集是ISO-8859-1,那么这个时候如果不指定则转换出来的将是?了。  阅读全文
posted @ 2010-02-23 18:41 Paul Lin 阅读(870) | 评论 (0)编辑 收藏
     摘要: 可以看到在Java中,字符的unicode有两种表示显示:一种是10进制形式,一种是16进制形式。它们可以分别通过:int i = (int)(string.charAt(i))和Integer.toHexString(i);获得。而且在java文件和Web页面,同一个unicode的表示形式是不同。web页面需要用&#进行转义,在java文件中则使用\u进行转义。  阅读全文
posted @ 2010-02-23 16:48 Paul Lin 阅读(2120) | 评论 (2)编辑 收藏
     摘要: 在这个专题的第一篇文章【Java基础专题】编码与乱码(01)---编码基础 开头,我们就已经介绍了这个规则:
①得到每个字符的2进制GBK编码
②将该16进制的GBK编码转换成2进制的字符串(2个字节)
③分别在字符串的首位插入110,在第9位插入10,在第17位插入10三个字符串,得到3个字节
④将这3个字节分别转换成16进制编码,得到最终的UTF-8编码。  阅读全文
posted @ 2010-02-22 23:00 Paul Lin 阅读(36966) | 评论 (11)编辑 收藏
     摘要: 谨慎地使用getBytes(NAME_OF_CHARSET)和new String(bytes, NAME_OF_CHARSET),除非你很清楚的知道原始的字符编码和传输协议使用的编码。

推荐使用基于服务器的配置、过滤器设置request/response的characterEncoding、content type属性。还有就是JSP页面的pageEncoding属性、HTML meta元素的content type属性。尽量避免频繁的在代码中进行字符串转码,即降低了效率又增加了风险  阅读全文
posted @ 2010-02-22 17:39 Paul Lin 阅读(3031) | 评论 (4)编辑 收藏
     摘要: 这个方法再次证明了String的getBytes()方法的危险性,如果我们使用new String(str.getBytes(), encoding)对字符串进行重新编码解码时,我们一定要清楚str.getBytes()方法返回的字节数组的长度、内容到底是什么,因为在接下来使用新的encoding进行编码解码时,Java并不会自动地对字节数组进行扩展以适应新的encoding。而是按照新的编码方法直接对该字节数组进行解析。

于是结果就像上面的例子一样,同样是4个原始字节,有些每2个一组进行解析,有些每个一组进行解析,有些每3个一组进行解析。其结果就只能看那种编码方式合适了。  阅读全文
posted @ 2010-02-22 17:18 Paul Lin 阅读(7080) | 评论 (2)编辑 收藏
     摘要: 不要轻易地使用或滥用String类的getBytes(encoding)方法,更要尽量避免使用getBytes()方法。因为这个方法是平台依赖的,在平台不可预知的情况下完全可能得到不同的结果。如果一定要进行字节编码,则用户要确保encoding的方法就是当初字符串输入时的encoding。  阅读全文
posted @ 2010-02-22 16:53 Paul Lin 阅读(4583) | 评论 (1)编辑 收藏
     摘要: Unicode到UTF-8的转换:Unicode的16进制编码<-->对应的2进制编码<-->UTF-8规范的2进制编码<-->UTF-8规范的16进制编码

也就是说,假如我们需要从磁盘文件、数据库记录、网络传输一些字符,保存到Java的变量中,要经历由bytes-->encode字符-->Unicode字符的转换(例如new String(bytes, encode));而要把Java变量保存到文件、数据库或者通过网络传输,系统要做一个Unicode字符-->encode字符-->bytes的转换(例如String.getBytes([encode]))  阅读全文
posted @ 2010-02-16 23:23 Paul Lin 阅读(3665) | 评论 (3)编辑 收藏

在天涯论坛搞到的,要感谢提供这个攻略的网友“海南小椰妹”,不过话说回来,不知道看完这篇攻略,你还有没有兴趣去海南三亚了。有时候旅游就是冲着未知的前方而去的,如果什么都攻略了那就感觉没有啥意外和惊喜了。


再次感谢一下这个海南小椰妹!

海南三亚旅游攻略

posted @ 2010-01-27 15:33 Paul Lin 阅读(329) | 评论 (0)编辑 收藏
     摘要: Informa不仅提供了对不同版本的RSS Feed source的读入和解析,同样也提供了将channel object导出为不同协议版本的XML文件的功能。这个功能是通过exporters包下的各个导出类来完成的。目前仅支持对RSS协议的导出,不支持Atom协议、OPML协议的导出。  阅读全文
posted @ 2010-01-04 10:15 Paul Lin 阅读(398) | 评论 (0)编辑 收藏
     摘要: OPML(Outline Processor Markup Language)协议正是用于解决这样问题的。利用OPML协议,我们可以通过阅读器把已经订阅的频道导出为OPML协议规定的格式,从而作为
一个文件分享出去。  阅读全文
posted @ 2010-01-02 20:56 Paul Lin 阅读(337) | 评论 (0)编辑 收藏
     摘要: 可以看到,对于这个解析过程,一般的步骤就是:
A.获取channnel下的某个子节点元素
B.如果该子节点元素有子元素或属性,则继续递归访问
C.调用该channnel子元素的createXxx方法加载或创建该子元素
D.调用Channel的setXxx方法添加该子元素到channel实例中  阅读全文
posted @ 2009-12-30 10:45 Paul Lin 阅读(244) | 评论 (0)编辑 收藏
     摘要: FeedParser是一个facade类,这个类的工作就是根据读入的RSS Feed的协议系和版本“委托(delegate)”给已经硬编码的规则(concrete rules)指定的解析器,而且这些解析器是私有的。这意味着:用户不能直接调用一个RSS_0_91_Parser类的实例来进行解析工作。  阅读全文
posted @ 2009-12-29 15:56 Paul Lin 阅读(1473) | 评论 (0)编辑 收藏
     摘要: ChannelBuilder对channel object的创建原则就是:
A.如果能够从持久层中找到对应的记录,那么从持久层返回
B.如果找不到,则创建它并持久化它,然后返回该对象(已持久化)

只要记得的一点就是:从ChannelBuilder返回的对象都是已经持久化的。  阅读全文
posted @ 2009-12-28 15:57 Paul Lin 阅读(1232) | 评论 (0)编辑 收藏
     摘要: 经过和impl.basic包中Channel的比较,发现两者的实现有如下的不同:

A.构造方法中多了3个方法,其中两个是使用title和location来构造的,最后一个是使用Element,title,location来构造的
B.从Hibernate中检索出来的是不用设置ID的,而从内存中生成的必须使用IdGenerator产生唯一ID
C.basic实现中没有getLocationString方法和setLocationString方法
D.basic实现中没有getSiteString方法和setSiteString方法
E.basic实现中没有getGroup方法和setGroup方法
F.basic实现中没有getFormatString和setFormatString方法
G.basic中没有setItems方法,而且getItems方法中的实现不同(basic采用了同步的hashset,而hibernate没有)
H.basic中的addItem方法是添加到hashmap,而hib  阅读全文
posted @ 2009-12-28 10:51 Paul Lin 阅读(225) | 评论 (0)编辑 收藏
     摘要: 其中dbscheme是关键,它的主要工作包括:
A.创建用于保存DDL输出结果的scripts目录
B.定义一个名为schemaexport的Ant task,用于把hbm文件导出为ddl文件
C.执行schemaexport任务,把classes目录下的hbm文件export成DDL,并输出到指定的位置
D.输出执行结果信息  阅读全文
posted @ 2009-12-23 10:45 Paul Lin 阅读(1339) | 评论 (0)编辑 收藏
     摘要: 这个ID生成类采用了系统当前时间作为随即数产生的种子,这个并不难理解。但是有一个地方需要我们注意的就是关键字transient的使用。这个关键的作用是告诉编译器假设该类的对象被序列化了,这个值不需要被保存。因为它是“瞬时”的。  阅读全文
posted @ 2009-12-23 00:03 Paul Lin 阅读(1328) | 评论 (0)编辑 收藏
     摘要: 在ChannelBuilder下有几种类型的方法:
★构造方法和初始化方法:即创建Channel对象的方法及初始化的方法
★元素构建方法:即构建Channel子元素的方法
★事务控制方法:即控制构建,析构过程的方法  阅读全文
posted @ 2009-12-22 23:52 Paul Lin 阅读(1263) | 评论 (0)编辑 收藏
     摘要: 总结起来,channel的创建,更新过程如下:
①接收经过ChannelParser解析后的XML Element元素,和其他一系列属性,调用构造方法
②构造方法为channel生成一个全局唯一ID
③构造方法创建item列表,观察者列表,设置好分类(Category),首次更新时间
④如果有新item到来,则添加到item列表,同时更新item的channel归属
⑤如果现有channel更新,则设置最新更新时间
⑥通知每一个已注册的观察者有事件发生  阅读全文
posted @ 2009-12-22 23:31 Paul Lin 阅读(1249) | 评论 (0)编辑 收藏
     摘要: Informa的core包介绍如下:

“This package contains interfaces for the news channel objects, it builds the core API for all news channel storage implementation. ”

从上面这句话来看,core包里面定义的都是关于“news channel objects”的接口---实际上就是RSS协议中的channel和item元素。经过一个多小时查看源代码和阅读API,发现Informa对core包的设计有如下特点:

core包中的元素被分为标记接口、实体接口、行为接口  阅读全文
posted @ 2009-12-21 22:09 Paul Lin 阅读(1237) | 评论 (0)编辑 收藏
     摘要: Informa的API结构如下:

★core包:
核心包。订阅了RSS中channel,item等一系列元素和元数据的接口

★impl.basic包:
基本功能包。使用in-memory模式实现了core包订阅的接口

★impl.hibernate包:
基于hibernate实现的包,使用关系型数据库模式实现了core包定义的接口

★parsers包:
定义了永远解析channel,item的解析器工具

★exporters包:
定义了一组把channel,item导出成各种协议格式的工具

★search包:
定义了用于全文搜索channel,item的工具

★utils.manager.memory包:
定义了一组用于管理“in-memory”模式持久化的工具

★utils.manager.hibernate包:   阅读全文
posted @ 2009-12-21 15:39 Paul Lin 阅读(1251) | 评论 (0)编辑 收藏
     摘要: 选择一个开源框架,我的标准有几条:

★良好的文档和源代码管理:这是最基本的一条,想RSSLibJ这种连文档、官网都没有的一律pass掉
★持续的改进:这是第二个重要的,像上面某些工具从02年后就不再更新了,出了问题你找谁诉苦去
★简单和易上手:在短时间内可以迅速依样画葫芦
★活跃的社区:参与的人越多软件成长得越多。我不是特别在乎软件目前的使用率,因为好的软件都是慢慢出名的  阅读全文
posted @ 2009-12-21 11:52 Paul Lin 阅读(1353) | 评论 (0)编辑 收藏
     摘要: ◆软件必须适应不同的终端,不同的访问方式,不同版本的协议。对设计通用性要求较高
◆软件必须解析和生成XML,涉及到大量的字符串和格式处理。对XML和性能要求较高
◆软件必须具备实时监控功能,且具备主动推送功能,对多线程和异步通讯要求较高
◆软件必须支持不同的持久化方式,对缓存和持久化要求较高
◆软件必须支持基于全文的搜索,对搜索技术有一定要求
◆软件界面必须是支持拖拽功能的,对GUI和Ajax有一定要求  阅读全文
posted @ 2009-12-18 12:14 Paul Lin 阅读(305) | 评论 (0)编辑 收藏
     摘要: SVN是一个开放的、免费的版本控制管理工具,相比CVS,Perforce等其他工具,SVN在版本模型,锁定策略方面要更加灵活高效。下面就让我们开始一步一步地学习如何使用SVN,如何把版本控制融入到日常工作中,更重要的是在学习版本控制的过程中树立起团队合作的理念。

关于SVN的参考资料,最好的莫过于其官方文档《Version Control with Subversion》,作为新手一定要看的是里面的第一章《Fundamental Concepts》和第二章《Basic Usage》以及第九章《Subversion Complete Reference》。

为了做到真正的In Action,我采用了Step-by-Step的方式,模拟一个项目从检出项目开始,到修改本地副本,再到提交变更,解决冲突等一系列的实际工作中会遇到的场景,期望通过这些场景和任务来对SVN和版本控制、团队合作有一个基本的认识  阅读全文
posted @ 2009-12-13 12:29 Paul Lin 阅读(3461) | 评论 (5)编辑 收藏
     摘要: SVN日常操作基本命令总结
1. 导入/导出资源:svn import、svn checkout
2. 更新工作副本: svn update
3. 添加变化:svn add、svn delete、svn copy、svn move
4. 检查变化:svn status、svn diff
5. 撤销变化:svn revert
6. 解决冲突:svn resolved
7. 提交变更:svn commit  阅读全文
posted @ 2009-12-11 18:23 Paul Lin 阅读(433) | 评论 (0)编辑 收藏
     摘要: 这时就需要用到SVN提供的清理功能了。清理功能是通过svn cleanup 命令来完成的。当执行这个命令时,SVN会首先完成log文件中没有完成的剩余工作,释放锁定,最后删除log文件。通常我们都是在项目的根目录来执行这个命令  阅读全文
posted @ 2009-12-11 18:19 Paul Lin 阅读(344) | 评论 (0)编辑 收藏
     摘要: 什么时候是Branch?什么时候是Tag?原则如下:

如果你还需要继续向目录提交变更,它就是个分支。如果一旦拷贝后不再提交任何改变哪就是标记。实际上SVN不会强制你不能对名为***tag的目录进行commit操作,这只是通常上约定。即便因为误操作我们也可以轻易的使用update操作回滚到当初创建Tag时的快照版本  阅读全文
posted @ 2009-12-11 17:39 Paul Lin 阅读(358) | 评论 (0)编辑 收藏
     摘要: svn merge的命令用法有三种:
A.svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
B.svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
C.svn merge[[-c M]...|[-r N:M]...] [SOURCE[@REV][WCPATH]]

Step 1:确定要从哪个版本开始~那个版本结束
Step 2: 执行集成
Step 3: 提交集成结果

  阅读全文
posted @ 2009-12-11 12:02 Paul Lin 阅读(448) | 评论 (2)编辑 收藏
     摘要: svn switch [--relocate] URL。该命令有两种用法:一种是不使用参数relocate的,一种是使用relocate参数的。它们的使用原则如下:

A.如果切换后的版本库路径还是在同一个版本库,只是在不同的路径下。那么使用svn switch URL
B.如果切换后的版本库位置已经改变(主机迁移,版本库迁移),但是目录结构不变。就需要加relocate参数  阅读全文
posted @ 2009-12-10 19:02 Paul Lin 阅读(382) | 评论 (0)编辑 收藏
     摘要: 我们看到“创建分支”居然和普通的拷贝动作一摸一样!是的对SVN来说,主干、分支、标记都是普通的目录而已,这些都是人为加上的意义。  阅读全文
posted @ 2009-12-10 17:04 Paul Lin 阅读(388) | 评论 (0)编辑 收藏
     摘要: SVN提供了几种解决冲突的建议:

A.(p) postone 延迟解决
B.(df) diff-full 显示所有冲突的内容
C.(e) edit 启动编辑器解决冲突
D.(r) resolve 标识冲突已经解决
E.(mf) mine-full 用我的版本覆盖他人的修改
F.(tf) theirs-full 用他人的版本覆盖我的修改
G.(l) lanuch 启动其他工具来解决冲突
H.(h) help 启动帮助信息

虽然SVN提供了比较差异和解决冲突的方法,但避免冲突的最好方法永远只有一个:明确的分工和良好的沟通,尽量避免多个人同时修改同一份文件。如果不能避免,那么最好指定一个人在提交前负责合并各人的更新,然后一次性提交。  阅读全文
posted @ 2009-12-09 23:25 Paul Lin 阅读(585) | 评论 (0)编辑 收藏
     摘要: ●使用svn update -r 命令
●使用svn copy命令
●使用svn cat命令配合重定向  阅读全文
posted @ 2009-12-09 17:19 Paul Lin 阅读(421) | 评论 (0)编辑 收藏
     摘要: 默认情况下如果svn log不加任何参数,会显示当前目录下所有资源的变更历史,我们可以通过PATH,URL来限定显示范围,还可以通过URL PATH来显示某个URL下的某个(些)文件的变更历史,甚至还可以指定版本号,版本范围。

各种svn log的用法看似复杂,实际上离不开两样东西:

A.资源路径:本地路径(PATH)或远程路径(URL/URL PATH)
B.版本号或版本范围:-r 18:HEAD或者@19
  阅读全文
posted @ 2009-12-09 16:01 Paul Lin 阅读(298) | 评论 (0)编辑 收藏
     摘要: A.因为SVN为了保护用户不小心update操作而覆盖自己本地的修改,不会对已经被修改但尚未提交的资源进行update操作。像这种情况下只能用svn revert而不能用svn update。

B.和svn update不会对已修改而尚未提交的资源进行update之外,svn del同样不会删除已修改但尚未提交的资源---除非你强制加上--force参数。

C.不要把所有变更都放在最后一次性提交,提交要及时、多次。否则一旦回滚所有其他修改都会跟着撤销。  阅读全文
posted @ 2009-12-09 11:19 Paul Lin 阅读(532) | 评论 (0)编辑 收藏
     摘要: 回滚属性和回滚操作  阅读全文
posted @ 2009-12-09 11:00 Paul Lin 阅读(288) | 评论 (0)编辑 收藏
     摘要: 实际上svn revert命令是一把“双刃剑”。它有几个需要特别小心的地方:

A.回滚是不可恢复的。由于svn revert回滚的是任何未提交的操作,内容,属性。所以意味着SVN不会为你保存任何回滚前的历史版本
B.回滚是不止于一点而是一段时间的。只要你没有提交版本,那么不论你多久之前所做的修改都会被回滚,而不仅仅是最近一次的修改  阅读全文
posted @ 2009-12-09 09:47 Paul Lin 阅读(739) | 评论 (0)编辑 收藏
     摘要: show-updates参数会令客户端显示本地工作副本那些文件是out-of-date的。它并不会立即更新本地副本,而是告诉你那些文件会在下次的svn update中被更新  阅读全文
posted @ 2009-12-08 21:50 Paul Lin 阅读(332) | 评论 (0)编辑 收藏
     摘要: A. svn cat 命令是客户端命令,在客户端运行。而svnlook cat 命令是服务器端命令,只能在版本库所在的机器上运行
B. svn cat 命令可以查看本地工作副本(PATH)或版本库(URL)资源的内容,而svnlook cat 命令只能使用REPOS_PATH PATH_IN_REPOS形式  阅读全文
posted @ 2009-12-08 17:04 Paul Lin 阅读(464) | 评论 (0)编辑 收藏
     摘要: 整个目录的忽略

Step 1: 把目录export到其它目录下
Step 2: 把版本库上的对于目录删除并同步到本地
Step 3: 把原有目录添加回原来的位置下,并加入SVN ignore列表
Step 4: 检查忽略是否生效

  阅读全文
posted @ 2009-12-08 16:29 Paul Lin 阅读(494) | 评论 (0)编辑 收藏
     摘要: 一次性忽略多个文件:

Step 1: 在本地任意目录下创建一个文件,名字假设为ignore.txt
Step 2: 编辑该文件,添加想要忽略的文件名列表
Step 3: 通过文件一次忽略多个条目
Step 4: 提交变更
Step 5: 检查忽略是否生效
  阅读全文
posted @ 2009-12-08 16:15 Paul Lin 阅读(533) | 评论 (0)编辑 收藏
     摘要: 单个文件的忽略:

Step 1: 把文件备份到其他位置
Step 2: 把版本库对应的文件删除
Step 3: 从版本库更新到本地工作副本
Step 4: 把文件拷贝回原有位置
Step 5: 把文件添加到SVN的全局属性svn:ignore
Step 6: 提交属性变更  阅读全文
posted @ 2009-12-08 14:51 Paul Lin 阅读(351) | 评论 (0)编辑 收藏
     摘要: 关于svn add命令我们有2个需要注意的地方:
A.和svn status命令一样,svn add命令只能使用PATH,而不能使用URL作为参数
B.当svn add命令执行完毕后,相关资源并不会马上立即被加入版本控制中,需要再执行一次commit

我们需要在每次commit后立即update,已保证我们最新代码被上传到版本库的同时,他人的最新代码能够被及时更新到本地  阅读全文
posted @ 2009-12-08 11:09 Paul Lin 阅读(351) | 评论 (0)编辑 收藏
     摘要: 使用svn info命令可以查看项目版本控制的静态信息
使用svn status命令可以查看项目版本控制的实时变更信息  阅读全文
posted @ 2009-12-08 10:09 Paul Lin 阅读(441) | 评论 (0)编辑 收藏
     摘要: 把项目import到版本库之后,项目并不会立即就被加入到版本控制中,还需要再从版本库中check out到本地原有位置才是真正地吧项目加入到版本控制。这一点和TCP/IP协议的三次握手过程类似。必须确保双方都知道对方的存在和联系。  阅读全文
posted @ 2009-12-07 16:37 Paul Lin 阅读(406) | 评论 (0)编辑 收藏
     摘要: 下面我们把svn list和svnlook tree命令的用法总结一下:

A.svn list PATH:列出PATH对应的版本库路径下的目录内容
B.svn list URL: 列出URL对应的路径下的目录内容
C.svnlook tree REPOS_PATH:递归地列出REPOS_PATH对应的版本库路径下的目录树内容
D.svnlook tree REPOS_PATH PATH_IN_REPOS: 递归地列出REPOS_PATH下子目录PATH_IN_REPOS路径下的目录树内容  阅读全文
posted @ 2009-12-07 16:12 Paul Lin 阅读(684) | 评论 (0)编辑 收藏
     摘要: 既然暂时还没有人扮演我生命中不速之客的角色,那就让我自己扮演自己生命中的不速之客吧  阅读全文
posted @ 2009-11-16 22:35 Paul Lin 阅读(319) | 评论 (2)编辑 收藏
     摘要: 有些人,有些事总是让我们无奈  阅读全文
posted @ 2009-10-26 09:23 Paul Lin 阅读(539) | 评论 (2)编辑 收藏

习惯了在最后关头,看着希望变成失望


习惯了在失落后,用满不在乎和自嘲来告诉他人我还很好

习惯了深夜时分一个人舔舐伤口,咀嚼苦涩。然后再次上路

习惯了在文字中,寻找那些失去的东西

习惯了用音乐和电影来麻醉伤痛

习惯了在旅途中体验生活,追求内心的平静

习惯了冷眼看人生,用遗忘拒绝伤害,用笑的方式去哭

... ...

是的,太多的太多,我早就已经习惯

只是

我依然不习惯向命运低头
posted @ 2009-10-09 21:18 Paul Lin 阅读(361) | 评论 (0)编辑 收藏
     摘要:
A. 相同ORACLE_HOME下,INSTANCE_NAME可以相同,但ORACLE_SID必须唯一

B. 不同ORACLE_HOME下,ORACLE_SID可以相同

C.不同INSTANCE_NAME可以对应不同的DB_NAME,也可以对应相同的DB_NAME  阅读全文
posted @ 2009-07-30 14:03 Paul Lin 阅读(1674) | 评论 (0)编辑 收藏
不想说什么了,看看豆瓣网的一个评论


MV拍的很静,是我无意间下载的,James Blunt坐在白色的平台上背靠着一望无际的大海, 天上下着雨,音乐跟进,干净的画面,James Blunt一件一件的脱着外衣背心 ,赤膊盘腿坐在雨中,脱鞋然后摆放整齐,从口袋中掏出几样物品,然后一一摆放整齐,我仔细看清楚最后那样物品是一个吉他拨片。镜头上摇 天空中飞鸟盘旋,镜头回落,James Blunt起身跑向无边的大海 纵深而跃。 
   
后来我要在节目里播放这首歌去查背景资料才得知这是一个从科索沃维和部队坦克上回来的英国人。 
   
歌曲中的那种美我想每个听过后的人都能感觉到,正如mv里的画外语,就算你赤膊上阵把自己扒光也无法得到你想要的人这种痛苦只有转身而跃才能解脱,真正的解脱是自我内心挣扎后需要面对的事实。

http://v.youku.com/v_show/id_XNDc3MDA4MA==.html
posted @ 2009-07-24 00:01 Paul Lin 阅读(363) | 评论 (0)编辑 收藏
     摘要: A.@set OH=C:\Develop\Oracle\product\10.2.0\db_1
B.@set JRE_CLASSPATH=C:\Develop\Oracle\product\10.2.0\db_1\jdk\jre\lib\rt.jar
C.@set I18N_CLASSPATH=C:\Develop\Oracle\product\10.2.0\db_1\jdk\jre\lib\i18n.jar  阅读全文
posted @ 2009-07-23 21:55 Paul Lin 阅读(756) | 评论 (0)编辑 收藏
     摘要: 关联是最普遍,最基础,最简单的关系

聚合是特殊的关联关系,体现为whole-part关系,且容器与元素之间生命周期依赖并不严谨

组合是特殊的聚合关系,体现为元素依赖于容器而存在,容器优先被创建,元素优先被销毁

依赖并不属于UML中的对象关系,而是一种运行时的操作引用

  阅读全文
posted @ 2009-07-19 18:18 Paul Lin 阅读(1945) | 评论 (1)编辑 收藏
这首歌就是三星i908E的广告曲,让人听得热血沸腾,动感无限啊~~。

http://blog.703804.com/?uid-169858-action-viewspace-itemid-200318
posted @ 2009-06-19 17:03 Paul Lin 阅读(351) | 评论 (0)编辑 收藏
     摘要: 那个出乎意料的结尾,以一种温和而坚定的方式解构了西部片,也隐晦地表达了老爷子的晚年信仰。即便是枪支横行的美国,他也愿意以法律和人心来化解戾气,而不作为一个牛仔迅雷不及掩耳地拔出左轮手枪。
  阅读全文
posted @ 2009-06-15 21:25 Paul Lin 阅读(256) | 评论 (0)编辑 收藏
     摘要: 有人说过男人是一本书,老男人是一本百科全书。那么对于克林特.伊斯特伍德来说,他就是一部精装的人生百科全书。因为在他的电影里我看到了很多......  阅读全文
posted @ 2009-06-15 01:34 Paul Lin 阅读(436) | 评论 (0)编辑 收藏
最近外出吃饭的次数多了起来,用手机拍下来记录一下。发表在天涯论坛的“羊城美食”版:

http://bbs.city.tianya.cn/tianyacity/Content/5109/858.shtml#Bottom
posted @ 2009-06-13 09:43 Paul Lin 阅读(207) | 评论 (0)编辑 收藏
     摘要: 转自JavaEye的一篇文章,讨论如何处理项目中出现的需求变更。很有实用价值  阅读全文
posted @ 2009-06-02 09:40 Paul Lin 阅读(341) | 评论 (0)编辑 收藏
                将进酒

君不见,黄河之水天上来奔流到海不复还
 
君不见,高堂明镜悲白发朝如青丝暮成雪
 
人生得意须尽欢,莫使金尊空对月

天生我材必有用,千金散尽还复来

烹羊宰牛且为乐,会须一钦三百杯

岑夫子,丹丘生,将进酒,杯莫停
 
与君歌一曲,请君为我倾耳听.

钟鼓馔玉不足贵,但愿长醉不复醒

古来圣者皆寂寞,唯有钦者留其名.

陈王昔时宴平乐,斗酒十千姿欢谑.

主人何为言少钱,径须沽取对群酌

五花马,千斤裘,呼儿将出换美酒,与尔同消万古愁!

========================================================

最欣赏里面的“人生得意须尽欢,莫使金樽空对月”。人生苦短,何苦在一些小事上纠缠不休。喜怒哀乐,千般滋味须得品尝个够才不枉在人世走一遭。古人云:天下攘攘,皆为利往;天下熙熙,皆为利来。只是到头来怕是一场空,能够带走的只有自己的回忆罢了。

人生在世,不求什么大富大贵,功名利禄。只求活得痛快,活得舒心,活出自己想要的生活。最是羡慕古人大块吃肉,大碗喝酒的潇洒与张狂。用力爱,用力恨。敢爱敢恨,快意恩仇,这才叫生活。

忽然想起自己以前的一句QQ签名:全情投入,活得精彩。看来自己还是和李白他老人家有点共通的。

posted @ 2009-05-13 10:06 Paul Lin 阅读(1078) | 评论 (1)编辑 收藏

一部好的电影总是不能缺少动人的音乐,如果说剧情是大餐,那么音乐就是甜点。精美的甜点可以让整道大餐的味觉得到升华,《入殓师》再一次证明了这个道理。

《入殓师》的背景音乐中出现最频繁的就是小林大悟用大提琴拉奏的曲子,低沉而缓慢的琴声,伴随清脆的钢琴声,好阵阵的微风拂面而过,又好似一滴滴的水珠滴落在石头上,撞击出美妙的音符。每一个包含感情的音符似乎在诉说着无尽的心事,特别是剧中有一段是小林大悟在田地旁拉着大提琴的片段,被导演拍得无比唯美。

下面是我最喜欢的音乐:11-joe_hisaishi-okuribito_-on_record--cocmp3.mp3

posted @ 2009-05-03 22:02 Paul Lin 阅读(1666) | 评论 (7)编辑 收藏
星期天的晚上犯了糊涂,把星期天当成了星期六过,半夜十一点翻出《入殓师》来看,结果看到一点多,两只眼睛肿得像桃一样的去睡觉。两年前的春节,我的父亲去世,早上醒来的时候,母亲从医院打电话过来,说父亲不行了,让我赶紧过去,把平素里准备好的衣服和鞋帽都带去,我迷迷糊糊的按照母亲交代的跑到柜子里翻找,这样的事情,在父亲生命里的最后三年不知发生过一次,于是这让我心里还抱着一线希望,也许——还不是这一次。
  
  但是,就是这一次了,该结束的终究要结束,我跑到医院,已经有很多人在那里,明晃晃的屋子里面,他们在走来走去,我有点发懵,记不住他们的面孔,但是我知道,悲伤的只有我母亲一个人。我长这么大来,从没办过丧事,母亲也并没有经验,于是我莫名其妙的被什么人领到楼下的寿装店里去买给死者身上盖的单子,还有嘴里含的铜钱,脚上垫着的脚垫,寿装店里的灯光昏暗,几根人在打麻将,一个人叼着烟,找出个绣得非常粗糙俗气的缎子被单来,还有其他的东西,说,八百块。我很吃惊,但是想到在楼上等着的母亲,我说,四百块,那个人很不高兴,说这种事还能讲价啊?我说那就不要了,我本来就觉得我爸爸不该盖这种东西。他一听,赶紧把那些东西一股脑的都塞给了我,抢过我手里的四百块钱。
  
  我回到楼上,医院的医生跟母亲说,你们要尽快把人拉走,你们不能把他放在这里。母亲说,我儿子马上就赶来,我想让他在这里看到他父亲。后来哥哥来了,母亲抱着他哭,哥哥没哭,我们忙着联系殡仪馆之类的事,我只是看着哥哥在没人的时候,偷偷的躲在窗户边抹了眼泪。把父亲抬下去的时候,和殡仪馆跟着过来的某个人叫我和哥哥对着灵车磕头,我和哥哥都磕了,站起来,他们管我们要两百块钱,说是因为他指点了我们,要收开口费。给完了钱,我才开始稍微恢复了一点思考能力,突然意识到,在父亲病房里绕来绕去的陌生人,都是干这个的。他们像秃鹫一样,围在尸体旁,等着分食死者的尸体。趁失去亲人的家属悲伤之际,能多捞一点钱就多捞点,这种感觉,在送父亲去殡仪馆的路上更明显。殡仪馆的路旁,不断的有人跟着我们车一路走,一路说着各种套话,后来在殡仪馆,我们把父亲的遗体从一个地方送到另外的地方去入殓,灵车前也围了很多这样的人,嘴里念念有词,不给钱,他们就一直跟着不肯走,司机跟哥哥说,你要每人给他们个十块二十的就行了,哥哥终究没给。母亲说,那一刻,感觉就像那些人好像地狱里的恶鬼一样围上来。
  
  但这只是殡仪馆外面的人,其实殡仪馆里的人也好不到哪里去,父亲遗体告别的时候,莫名其妙的进来一个穿着制服的军乐队,上来就要演奏,哥哥想起来,就突然问他,你这个是另收费的吗?领头的那个女人,含含糊糊的回答,诸如哪家遗体告别不需要爱乐之类的话。哥哥又问,我们是要放磁带,你们是另收费的吗?问了三四遍,才知道,另加2千块钱。哥哥强忍着怒气把他们轰走了,走的时候,那女的用故意的谁都可以听得见的声音说,付不起就说付不起……
  
  说了这么多和电影不相关的话,但是我想,曾经失去过至亲的人,知道我在说什么,看懂了《入殓师》这部电影的人,知道我在说什么。
  
  性格懦弱,总是怯生生的小林君,在走进死者的家中的时候,也是被人指责为“赚死人钱的。”但当他的手温柔的握着死者的双手,抚摸过他们的脸颊,额头,为他们擦拭身体,为老奶奶穿上丝袜,为儿子梳好头发,为妻子点上口红的时候,失去亲人的人们,知道他们把自己最爱的人托付给了值得信任的人。我的父亲卧病十七年,最后三年,他浑身插满管子躺在那里,被人们搬来搬去,翻来翻去,我一直很希望,人们可以对待他温柔一点,但你知道你无能为力,你不是医生不是护士,不是殡仪馆的工作人家,你不能挑人家的不是,这个世界上,粗暴是大多数普通人对待他人的方式,我们被粗暴的对待,然后又粗暴的对待别人,这似乎已经成为一种循环,大多数人内心已经麻木,浑然无觉。所以,在一个连活人都不能被温柔对待的世界里,就更别说对死者的尊重了。
  
  是因为这样,佐佐木先生才一眼看到了小林君内心里的温柔的吧。他像一个孩子一样的软弱,没有竞争能力,却善良,温柔的可以平等对待每一个死者,不管他们是怎样的死法。内心里还有这样温柔的人,在这个冷酷的世界里,是多么难得的珍宝啊。看电影的时候,我一边流泪一边想,如果是我的父亲,要是也能让小林君来帮助,温柔的握着他的手,走完最后的路,那该有多好。《入殓师》的英文海报上,有一句话写到——The gift of the last memories. 而我关于我父亲的最后的记忆,是充斥了那许多粗暴贪婪的嘴脸的记忆,太不美好了,所以很少回忆。能遇到小林君这样的人,是多么的幸运啊。它照亮了生者的回忆,的确是上天的礼物。作为一个内心深处的自毁者,我活在一个人人互相粗暴相待的世界中,我从来不曾奢求我自己可以死得其所,我可以对自己很无情,可是在我不曾被温柔对待过的此生里,仍然有我内心最柔软的部分,长在我爱的人的身体里。我深爱过的人,我是多么希望你们能够被这个世界温柔的对待,哪怕是在你们离去的时候,能够有一双手,温柔相握。
  
  小林君,谢谢你曾经这样温柔的对待这个世界。在这样的世界里可以用自己的温柔的方式生存下去的人,是了不起的人。我知道这个世界,是那些粗暴,强壮而冷酷的人们的,他们崇尚无情,以为这样就可以让他们少受痛苦。但是,当我审视自己的内心,发现在深深深深的地方,温柔还在,我还可以,用我自己温柔的方式,对待这个世界,那是很好的一件事情。好得就像,在尘埃里静静绽放的一朵花一样
posted @ 2009-05-01 15:49 Paul Lin 阅读(292) | 评论 (0)编辑 收藏

最近的经历,让我明白有些人,有些事对自己来说才是最宝贵的。我曾那么害怕、那么害怕失去这一切,没有一件事能让我感觉到如此的惊慌失措。尽管我已经无数次地想过,我以为我会有足够的心理准备,可是事实让我明白当面对这一切时我还是那么的无力与无奈。

好在这次是有惊无险,但它改变了我对未来的打算。人不单是为自己而活,这就是为什么我们的词汇中会有“亲人”,“家庭”的原因。

想起《士兵突击》里面许三多经常说的一句话:有意义就是好好活着,好好活着就是有意义。

posted @ 2009-04-26 16:21 Paul Lin 阅读(340) | 评论 (0)编辑 收藏
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜