Archive for the ‘Techs’ Category

WordPress插件:欢迎新用户

Sunday, August 3rd, 2008 | 36 views

插件主页的中文版本

WordPress插件:欢迎新用户   英文版本主页

介绍

插件的功能非常简单,但有访问者从别的站点连接到自己blog上时,页面会有一个小提示,欢迎用户的到来,并且问他是否愿意订阅本blog。

可以在WordPress管理后台->Settings(选项)处自定义feed地址,自定义欢迎语的内容和欢迎界面的外观。

WordPress版本要求:

WordPress2.5以上能正常运行,2.5以下的版本不做保证。

安装方法:

  1. 下载本插件
  2. 解压缩
  3. 将目录welcome-visitors拷贝到 /wp-content/plugins 下面
  4. 在后台激活即可
  5. 在Settings菜单下的Welcome Visitor子菜单可以对插件进行一些个性化

更多使用方法:

如果需要改变欢迎语言的显示位置,可以编辑文件welcome_visitor.php 将以下代码注释掉:

 //add_action('wp_head','say_it');

然后将以下代码拷贝到要显示的位置即可。

 < ?php  say_it();  ?>

1.00以后的版本,还可以自定义欢迎语言,比如:

欢迎来自于 <strong> <a href="[REFERER_URL]">[RE_SITENAME]</a></strong>的朋友,如果您喜欢这个站点,你可以订阅 <strong> <a href="[RSS_ADDRESS]">[IMG]subscribe</a></strong>它。

下面介绍下各个标记的意思,如果有人从googlev.com搜索到我的blog,http://www.kylogs.com/blog, 那么 [REFERER_URL] 就是 ‘www.google.com’, [RE_SITENAME] 就是 ‘Google’. [RSS_ADDRESS] blog的 rss 地址. [IMG] 显示一个feed小图标.

下载地址:

您可以在这里下载到最近版本的插件,在这里下载到中文提示语的插件。其实两者的差别就在于欢迎语言的分别,但是由于欢迎语言可以在后台自定义,所以推荐您去这里下载能够获得最新的版本。由于最近在实验室任务繁重,我并没有很多时间去维护,也没有时间去将其国际化,由此带来的不便很抱歉。

中文维基百科可以访问了哦

Thursday, July 31st, 2008 | 21 views

半夜爬上来发个帖子,就为了庆祝一件事情:
中文维基百科现在可以访问了。不信试一下

感谢CCTV,感谢奥运,感谢GFW

让我们猜猜什么时候中文维基会再度消失呢?我猜是2天。

猜错了,看来要自由到奥运结束了,哇哈哈。

设计模式学习笔记:单例(singleton)模式

Monday, July 28th, 2008 | 63 views

From Wikipedia: the singleton pattern is a design pattern that is used to restrict instantiation of a class to one object.

文中关于设计模式的描述与实现很可能跟Java语言特性有关。

单例模式是很简单的一种设计模式,它的主要目的是保证在程序运行过程中,某个特定的类只存在一个实例。很多时候,我们采用将类的成员和方法静态化也可以实现这样的需求。有的时候,这样做是无伤大雅的,但是有的时候采用静态方法来替代单利模式是不恰当的。且这还会跟具体的语言特性相关。

Java采用构造器来创建一个新的实例,因此只需要将构造器设为私有,便可以阻止其他类不负责任的随意构造实例,同时,我们还需要有一个静态的方法来返回或者构造一个实例。简单代码如下:

1
2
3
4
5
6
7
8
9
10
11
public class Singleton{
        private static Singleton foo;
        private Singleton(){}
        /*
         a lot of other codes here
        */
        public Singleton getInstance(){
                 if(foo==null) foo=new Singleton();
                 return foo;
        }
}

可以看到,单例模式无论从概念上还是实现上都是比较简单的。但是,如果我们的代码运行在多线程环境中,会发生什么情况呢?如果运气足够的不好,方法getInstance()可能同时由几个线程在调用,而此时恰好foo还是null,那么就会创建多个实例。我们的getInstance方法不是线程安全的,如何解决呢?

方法1:getInstance()方法仅仅在实例还没有被创建的时候才会出现线程不安全的问题,如果我们非常早的就创建了实例,那么就没有这个问题了,比如这样:

1
  private static Singleton foo=new Singleton();

因此,解决单例模式线程安全问题一种方法就是非常早的实例化

方法2:利用Java的同步机制,对getInstance()方法加锁,可以彻底避免线程安全问题,比如:

1
  synchronized getInstance(){..

,这种方法能解决问题,但是性能相当底下,不推荐使用。

方法3:同方法2一样的思路,只是不是对方法本身加锁,而只是对方法内部其中的一块加锁。这种特性只有Java5.0以后才支持。真正造成线程安全问题的是getInstance中创建实例的部分,只需要同步这部分即可。

1
2
3
4
5
6
7
8
  public Singleton getInstance(){
           if(foo==null) {
                  synchronized {
                      if(foo==null)    foo=new Singleton();
                  }
              }
           return foo;
        }

WP-Plugin: Welcome Visitors

Monday, July 28th, 2008 | 1,166 views

Project Homepage

Welcome Visitors Projects
Chinese Version homepage
Introduciton

Welcome-visitor is a wordpress plugin, which will welcome visitors ( which come from others sites, eg:google search, yahoo! serach or your friends’ links), and ask them to bookmark your site or to subscribe your rss feed. It will help you to get more readers and more attentions!

System requirements

  1. wordpress2.3+

Installation

  1. Download the plugin
  2. Unachinve it
  3. Upload to wp-content/plugin/
  4. Login to plugin page and activate it
  5. Maybe you wanna change the default settings, then go to settings page, choose menu Welcome Visitor.

Usage

If you need to change the default display location, you can edit the welcome_visitor.php file, comment off the code

 //add_action('wp_head','say_it');

and copy the code

 < ?php  say_it(); ?>

to anywhere you want to insert. For example,  you can insert the preview code after <body> tag in your  theme’s index.php.

If you are using version1.00+, you can customize the welcome words. Here is the example.

Welcome friend from <strong> <a href="[REFERER_URL]">[RE_SITENAME]</a></strong>, if you are new here,
 you may want to <strong> <a href="[RSS_ADDRESS]">[IMG]subscribe</a></strong> this site.

If someone search “semantic web notes” in Google, some of the results google return are about my blog, he/she click one of them, and visits my blog:http://www.kylogs.com/blog,  then [REFERER_URL] is ‘www.google.com’, [RE_SITENAME] is ‘Google’, and [RSS_ADDRESS] is your blog’s rss address. label [IMG] display a small feed icon.
download latest

Donate for this plugin (Paypal)

Thanks for your supporting!  :)

change log

  • 0.9        2008/7/27    first version
  • 0.91      2008/7/28    0.9version will cause an error in Dashboard->incoming links area. It was fixed in 0.91
  • 0.92      2008/7/30 fix some bugs
  • 0.93      2008/7/31 fix a serious bug, add a small feed img
  • 1.00      2008/8/1 now you can custome your own welcome words. :)

关于Eclipse将Java APP项目打包成jar的问题

Saturday, July 26th, 2008 | 220 views

前两天有位师弟问我,如何将写完的Java代码打包?由于他的源代码中使用了不少第三方的lib,因此有必要将lib也一并打包进去。他用Eclipse的Export功能直接打包到.jar文件,第三方lib是打包进来了,可是使用的时候还是提示找不到相应的包。

其实,为了自己的便利将别人发布的lib打包进自己project的包中不是一种合适的做法。这样做之前务必要检查一下对方的license,但不管是不是将对方的lib包括进来,既然自己的代码用到了,为了让它们正常工作,指明哪些包在那是必不可少的。师弟其实需要一个MANIFEST.MF文件,利用Eclipse生成jar文件的时候,请不要让其自动生成MANIFEST.MF,而是应当由你自己写好一个MANIFEST.MF,然后告诉 Eclipse:请使用这个文件。想了解细节,请阅读SUN的这篇规范(VIA),或者是IBM网站上的这篇JAR文件揭秘,偶这里就不多写了。

另外,Eclipse其实还有一个输出到可执行jar的功能,该功能能够帮你编写合适的MANIFEST.MF文件,帮你将你引用的第三方lib一并打包(注意license哦)。

软件项目的一些困难

Saturday, July 26th, 2008 | 9 views

一个项目成功与否,一个极为重要的因素就是需求分析。良好的需求分析可以带来一个明显的好处——就是能尽量的减少开发中需求的变更。在大型的建筑工程项目中,需求分析往往是由开发商(业主)聘请专业的咨询公司来做的,在做完所有基础性工作,比如需求分析,图纸设计之后,才开始发送投标邀请,寻找承包商。而软件项目往往是由承包商来做完差不多全部的基础性工作。因此,当由需求变更产生时,软件项目很难向传统项目那样索赔工期和费用。

分析,设计的责任推给了软件开发者,但是费用却并不增长,这是一个不合理的地方。

需求的变更,费用的变化,工期的变化等等问题都会软件项目的管理带来难度。业主与承包商之间的有效沟通就变得极为重要。遗憾的是目前的软件项目中还没有出现传统项目中Engineer(国内叫监理工程师,或者咨询工程师)这样一个比较中立,既能帮助业主跟承包商进行有效的沟通,又具有专业知识,能够(替业主?)管理项目,监督承包商的工作的角色。当然,这样角色的出现,首先依赖于一个合理的通用合同的出现(类似FIDIC,或者世行)。目前的软件行业中没有这种得到公认的标准合同,使得软件项目的管理起来更加的复杂,更加的不可琢磨,如果项目巨大,给管理者的挑战是巨大的,远不是传统行业的项目管理的难度可以比拟的。

jsp的三种包含方式

Saturday, July 26th, 2008 | 19 views

JSP学习笔记

JSP一共可以有三种方式包含其他页面:

1. < %@ include file=”target resource” %>
2.
3.

这3种方式是互相区别的。第一种方式下,该命令仅仅在一个JSP页面被编译的时候的才会调用,可以将其想象成inline的函数。target resouce的内容通过硬编码的方式整合到这个JSP生产的Serlvet中,之后对该页面的调用都与target resource无关了。因此,这种相对静态的方式,性能开销相对小一些。从定义上说,当A页面< %@ include file=”target resource” %>, target resource是B页面,当A编译生成Serlvet之后,B页面的改动不能够再从A页面中反应出来,除非重新编译。这是该种方式的最主要缺陷。不过当前一些主流的Web服务器能够检测到B页面的动态变化而重新编译A页面,不过,我们不能依赖于此。 :)

第二种方式与第一种方式的区别就在于,每次该JSP页面被访问时,此动作都会执行一次。修正了前一种方式的缺陷,可以反映出target resource的动态变化,当然,前一种方式开销小的优势也没了。这两种方式的区别很像函数调用跟内嵌函数的区别。

第三种方式是利用了JSTL的核心库,c是该库url的简写。它的工作机制跟第二种方式是很相似的,只是功能更加强大。第二种方式的target resource只能是引用容器内部的,而第三种方式的target resource可以是任意url。

OWL解惑(二):关于Domain和Range

Monday, April 7th, 2008 | 1 views

这是第二篇 :) 。只是这篇文章有点名不副实,说是解惑,其实是谈惑,因此我也并不清楚我对domain和range的理解是否是完全正确的,或者只是我的一厢情愿,若有错误的,请回复或者mail我。

domain跟range是来自于rdf的语法,owl也继承了下来。在owl文件中使用domain和range是完全符合规范的。

domain和range,直观的理解就是定义域和值域,这样的理解也勉勉强强可以说是正确的。比如有一个谓词(property): hasBeautifulHair,我们可以定义它的domain是PEOPLE,值域是HAIR。这样的定义跟我们的常识中对于定义域和值域的理解是一致的,不必多说。

在如上的定义下,我们如果加入了以下这样的声明:ASmallDog hasBeautifulHair Bluehair,其中,ASmallDog是类DOG的一个实例,Bulehair是HAIR的一个实例。如果从日常的观点,或者说从熟识的数学的角度理解,这样的陈述是的,也就是说它违背了之前定义的公理,即hasBeautifulHair的定义域是PEOPLE,而不是DOG。但事实上,从RDF或者OWL的观点看来,这个陈述的真假是不知道的,它与之前的公理并没有发生冲突。

看到这里,就会有些疑问了,为什么会没有冲突?如果没有冲突,那么domain跟range的约束就根本没有意义,会什么还要加上呢?下面对此问题的解释是一些我自己的理解,正确与否尚待思考。:)

解释:为什么没有冲突?将hasBeautifulHair的domain(定义域)和range(值域)定义成PEOPLE和HAIR,从rdf的角度看来,这只是它(本体,知识库)增加了一条关于hasBeautifulHair的知识,而不是增加了一条约束。因为我们有个前提:OWA(Open Word Assumption,开放世界假设):不能确定的陈述并不认为是假的。只是指明了hasBeautifulHair的定义域是PEOPLE,就不能认为其他的取值为假,除非显式的说明。就像一个小孩学到了一条知识:猫会叫。对他来说,狗能叫这样的陈述,他是不知道这句话是对的还是错的。如果将rdf想象中这样一个小孩,对这点的理解会容易得多。

那为什么还要加上约束呢?正如前面的分析,对这个知识库或者本体来说,这是一条关于它的知识,因此是有必要的。在实践中,这也是有意义的。因为,它可以利用这条知识来进行推理。还是举刚才那个小孩的例子,小孩学到了一条知识:猫会叫。如果这个小孩某天见到一个没见过的动物(可能是狗,可能是猫,可能是其他…)对着他叫,他根据他现有的知识,他会认为(infer)这个动物很有可能是。显然,我们可以认为这样的推理是合乎逻辑的。随着知识的增多,我们的推理可以更加准确(比如,知道猫的叫声,狗的叫声等等)。pellet等推理机支持这种类型的推理。这也是domain和range这样的语法存在的意义。增加知识,有益推理

OWL解惑(一)–AllValuesFrom与Range的区别

Wednesday, April 2nd, 2008 | 362 views

这篇文章是最近打算写的关于owl系列的第一篇。 :)

AllValuesFrom这样的约束是OWL语言新加的,也是OWL比RDF表达能力更加的证据。初学者,特别是对规范还不熟悉的情况下直接用Protege做东西的朋友们常常会遇到这样的问题:

  • only(AllValuesFrom)跟some(SomeValuesFrom)有什么区别
  • only, some的作用跟domain,range有什么区别?

先说第一个问题,举个例子:有个类tree,有个类leaves,有个属性has,tree has some leaves这样的句子或者说tree has SomeValuesFrom leaves,它的意思其实是很直观的:如果有一样东西(individual)是tree,对于has这个属性而言,那么它至少有一片叶子的实例(individual)(>=1)。由于开放世界的假设,这个陈述并不暗示着它只能有叶子(而不能有其他的)。
但如果是这样的陈述: tree has only(AllValuesFrom) leaves的意思是指如果有一样东西(individual),它是tree,它只能has leaves,不能has其他的,比如根,茎什么的,都是不合法的。
AllValuesFrom还隐含着一点小trick,即如果has的leaves是空,对它来说也是合法的。这点可能有些不好理解,稍做下解释:比如这样一个陈述:P的孩子只能是女孩,那么如果p有一个男孩子,自然与之前的陈述违背,但是p如果没有孩子,逻辑上并没有违背前面的陈述,因此是合法的(没有违背就是合法的是owl的世界观之一)。

接下来是第二个问题。AllValuesFrom与Range的区别。其实这两者表示的逻辑含义有很多相似之处。都可以表达某属性的客体取值能且只能取某个范围。两者很重要的区别在于作用域不同,并且AllValuesFrom看起来意义更加的清晰。
Range的作用范围是全局的,domain:people peroperty:hasChild range: Child,表示hasChild这个属性,不管在哪,都只能有客体是Child,而AllValuesFrom的表达是local的,people hasChild AllValuesFrom Child仅对people这样一个主体有效,同样可以定义monkey hasChild AllValuesFrom BabyMonkey这样的陈述。当然,我们可以通过创建谓词hasChild的子谓词来使得range达到与AllValuesFrom一样的表达效果,但是太不直观。

关于

我叫陈炬,正在天津大学计算机学院->知识工程与科学研究所攻读硕士研究生。今年应届。您可以在我的自我介绍获得更多关于我的信息

订阅我的Blog


本站RSS地址| [这是什么?]
订阅到Google Reader | 订阅到 抓虾 阅读器 | 订阅到 鲜果 阅读器

其他blog

我还有一个英文blog,非常的无聊,琐碎,许多的语法错误。请谨慎访问。
Find entries :