百度发布SEO指南

Google的搜索引擎优化指南出来将近两年的时候,百度官方也给出了他自己的搜索引擎优化指南

把指南下下来之后,粗略的看了一下,大概是讲了四点,核心思想还是围绕用户体验中心的:

  1. 域名的注册,服务器的租用
    域名简短,让用户很容易记住;服务器这方面,就是对用户的响应速度。
  2. 网站要让用户看懂,也要让搜索引擎看懂
    包括对HTML元标签的使用, 还有尽量少用Flash和JS等搜索引擎还不太懂的东东。
  3. 网站运营的优化
    增强品牌化,增加用户的信任,注重用户体验。
  4. 搜索引擎惩罚
    惩罚不是目的,但是谁影响了搜索引擎对用户的体验,谁就会受到不同程度的惩罚。

对于这四点,大家也都是很清楚的。但最后的FAQ却引起了我的兴趣:

  1. 自然排序和搜索排序是两个不同的部门
    想想也应该是这样子,而且作为一家大公司来讲,追求的应该是长期可持续发展的收入,而不是杀鸡取卵。
  2. 更换空间需要保留旧空间一段时间
    我个人觉得很有必要,而且很有可能baiduSpider会把域名DNS自己做缓存,所以需要保留旧空间一段时间,也是很有道理的。
  3. 百度是支持nofollow的
    这是肯定的,就算现在支持不好,以后也肯定是这个趋势。不过这个问题应该难不倒百度的工程师。
  4. 百度对Https协议的支持很有限
    可以公开的内容就公开吧。
  5. site语法原本就不是查网站收录数的
  6. title和description原则不要做太大的修改
  7. URL尽量静态化
    人性化的URL也是用户体验的一种表现,友好的URL甚至可以让用户直接输入URL来网站的内容。
  8. 国外空间对于排名没有影响
    关键是访问速度和响应时间。

以上就是我看了百度官方的搜索引擎优化指南的一些内容,其实说起来,大家都了解了,只不过是官方发出来的,自然就更坚定了大家的想法。

Posted in SEO | Tagged , | Leave a comment

Unix IO模型学习

这季度学习java nio及其相关的内容和框架,所以就想先看看Unix下的一些IO模型。结合网络上的资料进行学习,自己也写篇日志,加强一下理解吧。

POSIX中对同步IO和异步IO的规定

  • 同步IO操作:引起进程的阻塞直到IO操作完成
  • 异步IO操作:IO操作不会引起进程阻塞

在UNIX下,有5中操作模型

  1. 阻塞IO
  2. 非阻塞IO
  3. IO复用
  4. 信号驱动IO
  5. 异步IO

按照网络上的说法,前四种是属于同步IO,第五种才属于异步IO,对于这个结论,我的理解是根据用户进程是否阻塞来判断的(而不是内核进程)。关于同步和异步的一些讨论,可以参考http://bbs.chinaunix.net/viewthread.php?tid=947563

阻塞IO

这是我们熟悉的IO模型,一个进程在作IO操作时,非要等到数据从内核空间拷贝到用户进程空间,才会返回。这个模型的优点就是简单,而且在阻塞的时候,CPU还可以进行调度,去执行别的进程。

非阻塞IO

一开始我看是非阻塞IO,觉得应该要比阻塞IO模型先进,可是当我一看使用方法的时候,就知道这个模型是不会被实际使用的,仅仅只能作为理论上存在的IO模型。这个模型的观点是:进行IO操作的时候,不阻塞,如果没有数据准备好,就直接返回错误码(或者是别的代码)。因此,使用者就只能不断进行轮询来调用IO函数。这样的后果就是,不仅在宏观上形成了与阻塞IO一共的“阻塞”效果,而且在微观上,CPU一直被用来轮询,造成了CPU的浪费。所以,这个模型还不如阻塞IO模型实用。

IO复用

对于IO复用,我的理解有三点:

  1. 在一次系统调用中,实现了询问多个描述符的IO准备情况 —— 根据事件通知
  2. 为了实现第一点,就需要把阻塞的地方进行转移。把一次系统调用,分为两次系统调用。第一次系统调用可以询问多个描述符的IO准备情况,在这个地方进行阻塞;而第二次系统调用,是针对已经准备好IO的描述符进行调用,此时,理论上(按照我的理解),也是会发生阻塞的,只不过是此时内核已经把数据准备好了,阻塞的时间可以忽略不计罢了。
  3. 本质上,还是阻塞的。

信号IO

我们都知道,信号是UNIX提供了进程间进行通信的一种方式。我们常用的 kill -9 命令(kill是向进程传递信号量,9只是众多信号中的一个代号),或者是 Ctrl + C 的时候,就是向某个进程发出终止的信号,这样进程就退出了。

而对于信号IO的模型,我是这么理解的:进程在发起IO操作,系统调用之后,直接访问,内核会在IO数据准备好之后,以某个信号通知发起IO操作的进程,从而使得该进程的信号处理函数可以读取IO数据的操作。

本质上,这也是阻塞的IO模型,因为在信号处理函数中,同样也是要进行阻塞的,只是在在这个时候发起系统系统,内核已经把数据准备好了。

异步IO

这是真正的异步IO了。实现的机制是:用户在发起异步IO的系统调用时,会把相应的数据处理函数作为回调函数,等到IO数据准备好,内核会主动调用此回调函数。可以看出,用户进程在这种模型下,只调用了一次系统调用,而且是立即返回的,因此,就不会出现让进程阻塞的情况,也就符合了POSIX中异步IO的定义。

其实我理解起来,思路是和信号IO差不多的,唯一不同的地方,对于IO数据的操作,异步IO是由内核主动发起的,而信号IO是由用户进程发起的。

以上是我结合网络资料,对UNIX IO模型的一些学习和理解,如果有错误或者不当的地方,请随时留言指出,谢谢!

Posted in NIO | Tagged , , , , | Leave a comment

杭州收音电台频道

我喜欢听收音机,买了收音机也有一年了,之前一直听的是FM97.9中央人民广播电台经济之声,虽然这个频道的质量很高,比如《冬吴相对论》。但令我郁闷的是,每次周末的下午,中央人民广播经济之声都会放导航仪的广告……

为了在适当的时间收听到适当的电台,我收集了杭州收音各个电台的频道,这里就先放出来(后续如果有可能的话,我会推荐在什么时段听什么频道最合适)!

  • FM88.0 浙江电台新闻综合
  • FM89.0 杭州电台新闻综合 (AM954)
  • FM90.2 中央人民广播电台中国之声
  • FM93.0 浙江电台交通之声
  • FM95.0 浙江电台经济台
  • FM96.8 浙江电台音乐调频
  • FM97.4 浙江电台新闻综合 (AM540/810)
  • FM97.9 中央人民广播电台经济之声
  • FM99.6 浙江电台文艺频率
  • FM102.1 余杭电台
  • FM103.2 杭州电台音乐台
  • FM104.5 浙江电台旅游之声 (AM603/1521)
  • FM105.4 杭州电台西湖之声
  • FM107.0 浙江电台城市之声 (AM1530)
  • FM107.9 萧山电台

以上就是在杭州你能收听到的电台,如果有什么错误,或者有新的电台,也欢迎留言补充 :-)

Posted in life | Tagged , | Leave a comment

Maven默认的标准目录

之前使用maven,一直在网络上搜索maven的标准默认目录,不如就在自己博客上记录下来好了。

src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/assembly Assembly descriptors
src/main/config Configuration files
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/site Site
LICENSE.txt Project’s license
README.txt Project’s readme
Posted in Java | Tagged , | Leave a comment

Spring的BeanFactory体系结构(三) – DefaultSingletonBeanRegistry

接着上面SimpleAliasRegistrt的学习。今天,接着学习 DefaultSingletonBeanRegistry。

一听名字,就知道这是一个SingletonBean注册的地方,此类也实现了SingletonBeanRegistry接口,继承了SimpleAliasRegistry。这也可以理解,DefaultSingletonBeanRegistry既有管理SingletonBean的功能,又提供了别名的功能,那当然可以继承SimpleAliasRegistry了。

DefaultSingletonBeanRegistry是一个通用的存储共享bean实例的地方,通过bean的名字获得bean。同时,它也给提供一次性bean的注册功能。

这个类的主要作用是,给BeanFactory的实现,提供基本的管理 singleton bean 实例功能。

这个类中,使用了三个主要的存储器(map)来分别存储 singletonObject,singletonFactory,earlySingletonObject。

当注册一个 singleton object 的时候,会在 singletonObject 的存储器中加入此 object,而在其他的两个存储器中移除。当然,这样的行为是可以在子类中去复写的。

在 getSingleton的时候,spring的默认实现是,先从 singleton object 的存储器中去寻找,如果找不到,再从 early singleton object 存储器中寻找,再找不到,那就在寻找对应的 singleton factory,造出所需的 singleton object,然后返回。

而 contains singleton 就是直接检查 singleton object 存储器了,其他的存储器不做检查。

而 get singleton counts 也是统计 singleton object 的数量。

看完了代码,再仔细想想,为什么这个类要使用三个存储器呢?

我想, singletonObjects 就是直观的存储着 singleton 的,而 singletonFactories 是存储的制造 singleton 的工厂,还有一个 earlySingletonObject, 在看了代码之后,我更觉得这是一个 singletonFactory 制造出来的 singleton 的缓存。

个人感觉,看spring,就像读一篇很好的文章,非常的流畅,而且也很值得细细品味。

Posted in Java, Spring | Tagged , , , | 1 Comment

Spring的BeanFactory体系结构(二) – SimpleAliasRegistry

接着之前Spring的BeanFactory体系结构,再进行学习。这次我学习的是SimpleAliasRegistry。

SimpleAliasRegistry实现的是AliasRegistry,也就是提供了别名的注册场所。

AliasRegistry是一个通用的管理别名的接口,BeanDefinitionAliasRegistry接口就是继承此接口。

此接口定义的方法(服务)也很简单:

  • registerAlias 注册一个别名
  • removeAlias 删除别名
  • isAlias 判断是否是别名
  • getAliases 获得一个名字的所有别名,以String数组的形式返回

那它的实现SimpleAliasRegistry,其内部采用了一个ConcurrentHashMap来进行别名的存储。因为方法的数量比较少,所以分别对这四个方法进行详读。

void registarAlias(String name, String alias)

首先,会看看 name 是否和 alias 相等,如果相等,就把存储器中的 alias 删除。

然后,其内部还定义了一个 allowAliasOverriding 的方法来判断是否允许覆盖。子类可以复写此方法,调整其策略。

void removeAlias(String alias)

很容易理解,但是这里需要注意,如果这个alias找不到,那么程序是会直接抛异常的,而不是默默的忽略。这个点在接口中也有提到的。

boolean isAlias(String name)

判断其是否是别名。

String[] getAliases(String name)

此方法会同步其内部的存储器,然后递归的进行查找,直到把所有的别名找出为止。

这里有个问题,为什么synchronized的对象,是这个内部的存储器呢?

经过一系列的研究,终于了解。原来,内部的存储器,是一个ConcurrentHashMap,而对这个存储器进行上锁,可以有效的防止在获取别名是,其他线程对存储器的修改。

Posted in Java, Spring | Tagged , , , | Leave a comment

Spring的BeanFactory体系结构(一)

本文使用的代码是: Spring 3.0

接触Spring也有很长一段时间了。但是,每次都是直接使用Spring直接提供的API,时间久了,自然也会想探索Spring里面的奥秘。今天上午,整理出了Spring的BeanFactory的一个体系结构(当然不是完整的,是以XmlFactory为最终目标),如下图(点击可到图片页面):

beanFactory

沿着XmlBeanFactory向上追溯,可以形成上面的BeanFactory体系结构。虽然不是很全面,但是如果这个图能理解透,我相信,Spring的BeanFactory就能理解透了。之后的系列我也会以这个图为中心,深入的去学习Spring的BeanFactory。

下面是对各个接口的理解。

BeanFactory

这个就是BeanFactory容器的最原始接口,也是spring容器提供的最原始客户端接口。

AutowireCapableBeanFactory

拥有自动装配能力的BeanFactory。这个BeanFactory并非是要用到应用中去的,在应用中要用,就用BeanFactory或者是ListableBeanFactory。这个接口更多的作用是用于和其他框架的结合,把不在Spring容器中的Bean加入到Spring容器声明周期管理中来。

需要注意的是,在Spring的ApplicationContext(Spring的应用容器)中,并没有实现这个接口,因为这个接口在应用中,确实很少用到。

不过,你可以通过ApplicationContext的getAutowireCapableBeanFactory()方法获得。或者,你也可以实现BeanFactoryAware(这个接口就是为了取得BeanFactory的),然后把BeanFactory转换成AutowireCapableBeanFactory。

HierarchicalBeanFactory

有层次的BeanFactory。如果实现了这个接口,可能就以为着你也需要实现ConfigurableBeanFactory。因为ConfigurableBeanFactory定义了设置父容器的方法,而HierarchicalBeanFactory的方法只有获得父容器的方法。而一般情况下,ConfigurableBeanFactory接口直接继承了HierarchicalBeanFactory。所以,它的实现,也是肯定要设置父容器的。

ListableBeanFactory

顾名思义,此BeanFactory是可以把容器中的bean循环枚举出来,而不是按照名字一个一个去取。

如果实现此接口的同时,也实现了HierarchicalBeanFactory,那么这个接口中的方法是不会去考虑父容器中的bean的。

需要注意的是:除了getBeanDefinitionCount和containsBeanDefinition方法之外,其他的方法最好不要直接在代码中调用,因为其实现可能会非常慢。

SingletonBeanRegistry

这个接口定义了一个注册singleton bean的容器。此接口可以被BeanFactory的实现实现,用来形成一个统一管理singleton bean的风格。ConfigurableBeanFactory接口就继承了此接口。

ConfigurableBeanFactory

此接口定义了BeanFactory的扩配置功能,几乎所有的beanFactory都会实现这个接口。

同样,此接口也不推荐在常见的应用代码中使用(还是推荐使用BeanFactory和ListableBeanFactory)。这个接口也赋予了BeanFactory可扩展的功能,

ConfigurableListableBeanFactory

又是可配置,又是Listable的BeanFactory,就可以实现这个接口。除了ConfigurableBeanFactory的功能之外,它还提供了访问和修改BeanDefinition,预实例化singletons。

AliasRegistry

管理别名的公共接口。

BeanDefinitionRegistry

注册BeanDefinition(Spring内部映射Bean的数据结构)的接口。

在这个体系中,接口部分,我就看了上面这些。下篇文章,我会深入去学习每个接口的实现,就是上图中右边的那些实现。

Posted in Java, Spring | Tagged , , , , | Leave a comment

Java运行时内存模型

Java在运行时,可以根据声明周期大致把内存分为两部分:与JVM声明周期一致的内存,与线程生命周期一致的内存。根据Java虚拟机规范第二版,Java在运行时内存可以分为以下6个部分:

  • PC计数器
  • 方法区
  • 运行时常量池
  • 本地方法栈

PC计数器

每个线程都有自己的PC计数器。在不是本地方法的时候,PC计数器始终记着下一条需要执行的指令。在执行本地方法的时候,PC计数器里面是undefined。

每个线程对应着一个栈。栈(stack)是用来存储帧(frame)的,栈只对帧进行pop和push的操作,每个方法对应一个帧。

堆(heap)的生命周期和JVM是一致的,所有的线程都可以共享堆。当堆里面的东西没有被引用时,垃圾回收器就会回收他们。

方法区

方法区也是和JVM的生命周期一致,逻辑上是堆的一部分。里面存着每个class的数据,包括常量池,字段,方法等等。

运行时常量池

是方法区的一部分。存储着类或者接口的常量。

本地方法栈

也就是在执行本地方法时所需的栈(不怎么了解)。

Posted in Java | Tagged , | Leave a comment

虎年新气象

自从参加了在公司的第一个项目之后,博客就一直没有更新,而自从发现老博客的回归后,就更加变得犹豫不决。而自从参加工作后,人却也变得懒惰起来,迟迟不愿意更新。在博客合并的过程中,发现了mysql版本的问题之后,就一直不愿意花时间去合并,而是不断的以此为理由,让自己不更新博客变得理直气壮——这明显就是借口。

回到家过年,参加同学聚会,很反感的一点就是,一年难得聚一次,也跑到网吧去打游戏。我尽量让大家去茶座喝喝茶,聊聊天,这样才有聚的感觉。 在聊天中,也突然想到了我这个博客,今年貌似还没有更新,而博客这东西对于我,可以沉淀一些知识,一些感受,想想,也算是在虎年对博客有个新的期待吧。

新的一年,我将坚持更新此博客。

Posted in life | Tagged , | Leave a comment

此博客将被老博客并购

最新进展:貌似合并得有些问题,我需要深入的考虑一下这两个网站的命运了  :-(

别激动,那个老博客也是我的,说并购只是一个噱头 :-) ,其实只是说这个博客要被原来的老博客合并了,原因有四:

  1. 抛弃了很久的博客,终于被解封了,于是迅速把数据备份下来; 在所有的博客中,这个老博客是我坚持的最久的;
  2. 今天回顾了这个老博客,一下子让我爱上了以前的老博客;
  3. ZavaKid 这个名字和域名并不太好记,很难推广起来; 而老博客的域名和作者的名字,都十分好记;
  4. 这个博客有两个月的时间,可是原来的老博客有两年的时间;

不久前收到弟弟的消息,说我的老博客被解封了,欣喜之余,经过不断的尝试,终于试出了登陆的密码,也试出了空间的密码。不想那么多,马上备份下来,哈哈。

如果两个博客一起运营,那我的精力不够的。因此,在这个博客还没有形成之际,我需要赶快把这个博客合并到原来的老博客上去。

现在看到之前的那些文章,一下子就让我想起了在学校的时光。

由于我对网络营销很有兴趣,因此,老博客上面的内容也充满了各种网络营销、网赚、建站工具等等内容,这次老博客的复活,我一口气阅读了很多的之前写的文章,真是获益无穷啊! :-)

还有那博客上面的广告也还存在!那是在大三的时候申请的 Google Adsense,哈哈,也还在那里放着,进去一看,已经有了40多美元的进账。但是付款地址还是写着学校的地址,于是马上修改成了现在公司的地址。

还有友情链接,于是顺着友情链接一个一个去看看,诶……发现有很多人已经不更新了!那些链接里面,可是有很多SEO牛人啊!

在看文章的过程中,一下子让我想起了以前注册过的经典论坛,比如 IM286,Admin5, 嬴政论坛,点石论坛等等这些著名的论坛,甚至还有一段时间关注过 black hat seo的国外论坛;还有以前写过一些教程,比如 Joomla,也对 WordPress 和 Drupal 等这些PHP开源程序。

老博客的标题,也很有诗意,想想,那应该是在学校图书馆看过的一本书。想想那个时候啊,对文学还是蛮感兴趣的。

再看看我的博客订阅者,原来已经有90多个了!

还有很多很多……都值得我再去回味。

以上的种种重温,都让我吃惊:原来学生时代时的我在网络上是这么的有活力 :-)

以前写博客,就是写了,也没有去回顾;但经过今天这次回顾,让我更加觉得写博客真是太美妙了!我一定要把这两个博客合并在一起,并且持续的写,不停的写;过两年,再来看看,我之前都做了什么!

接下来,就是技术问题了:这两个博客如何合并?因为碰到了数据库的版本不一样,还有很多的数据,图片等等这些问题。因此,我需要一些时间来整理一下,反正已经拿到数据了,整合应该不是问题。

因此,现在应该会暂停写一下博客,等到两个博客合并完成,再继续更新博客 :-)

Posted in life | Tagged , , | Leave a comment