在今天,经历了如此发展历程的开源软件,已经不仅仅是开放源代码的免费软件了。开源软件与商业本身并不冲突,事实上,它也是一种新兴的商业模式。与传统的商业软件相比,开源软件采用了开放源代码、免费分发等形式,这就减少了营销与销售成本,更易于广泛传播。
其实,开源软件可以是成功的商业行为,那么这意味着什么呢?首先,商业公司必须要能够生存和盈利;其次,商业公司生存的意义在于为用户创造价值。下面我们来看看开源软件是如何生存、如何创造价值,并如何借助其创造的价值来获得回报的。
盈利模式之一:多种产品线
在这种模式中,利用开源软件为直接产生收入的专有软件来创造或维持一种市场地位。例如,开放源代码的客户端软件带动了服务器软件的销售,或者借用开源版本带动商业许可版本的产品销售。这种模式应用得比较普遍。
如MySQL产品就同时推出面向个人和企业的两种版本,即开源版本和专业版本,分别采用不同的授权方式。开源版本完全免费以便更好地推广,而从专业版的 许可销售和支持服务中获得收入。再如Red hat自Red hat Linux后将原桌面操作系统转为Fedora项目,借Fedora Core Linux在开源社区的声望而促进Red hat Enterprise Linux AS/ES/WS服务器产品线的销售。
盈利模式之二:技术服务型
在这种模式中,开放源代码软件采用了一种全新的市场定位,并非面向产品,而是针对技术服务。JBoss就是这种模式的典型代表,JBoss应用服务器完全免费,而通过提供技术文档、培训、二次开发支持等技术服务而获得收入。
盈利模式之三:应用服务托管(ASP)
这种模式适用于基于开源软件的应用服务供应商(ASP)。例如,PHP Live就是一种构架于PHP、MySQL之上的开源软件,它可为企业用户提供实时交谈服务。目前已经有数十家公开提供PHP Live托管服务的应用服务提供商。
盈利模式之四:软、硬件一体化
这种模式主要是针对硬件制造商的。随着竞争的普及,市场压力迫使硬件公司开发并维护软件,但是软件本身却并不是利润中心,因而采用开源软件。这种模式被 很多大型公司广泛采纳,比如IBM、HP等服务器供应商巨头,通过捆绑免费的Linux操作系统销售硬件服务器。而Sun公司近期将其Solaris操作 系统开放源代码,以确保服务器硬件的销售收入,也是这种模式的体现。
盈利模式之五:附属品
在这种模式中,出售开放源代 码的附加产品。比如在低端市场,出售杯子和T恤衫等;在高端市场上,出售专业编辑出版的文档和书籍。O’Reilly集团是销售开源软件附加产品公司的典 型案例,它出版了很多优秀的开放源代码软件的参考资料。O’Reilly实际上雇用和支持了一些著名的开放源代码黑客(例如Larry Wall和Brain Behlendorf),并以此提高它在市场上的声望。
盈利模式之六:品牌战略、服务至上
在这 种模式中,开源公司通过开源软件先天的传播优势,以极低的成本建立和传播品牌,并通过向用户提供产品相关的服务来获得回报。康比尔公司的 Compiere ERP&CRM软件就是这种模式的典型案例。康比尔公司开发了开源的ERP&CRM软件,由于其产品优秀,很快便获得了北美、欧洲和亚洲 中小企业用户的认可,Compiere品牌也因此迅速地传播到了世界各地,在企业管理软件市场已经成为全球知名品牌。
盈利模式之七:市场策略
这种模式是一种快速抢占市场的营销策略,主要是为以后增强版产品的销售打下基础。这种情形的案例有很多,比如微软宣称部分公开Office的源代码,就 是执行这种策略;另一个案例则是CRM领域的新星Sugar CRM,这款由速加科技开发的开源版本从公开下载后就广为传播,这为其后来盒装专业版套件做好了口碑上的准备。
Tags: opensource.
disabled和readonly这两个属性有一些共同之处,比如都设为true,则form属性将不能被编辑,往往在写js代码的时候容易混合使用这两个属性,其实他们之间是有一定区别的。
如果一个输入项的disabled设为true,则该表单输入项不能获取焦点,用户的所有操作(鼠标点击和键盘输入等)对该输入项都无效,最重要的一点是当提交表单时,这个表单输入项将不会被提交。
而readonly只是针对文本输入框这类可以输入文本的输入项,如果设为true,用户只是不能编辑对应的文本,但是仍然可以聚焦焦点,并且在提交表单的时候,该输入项会作为form的一项提交。
Tags: HTML.
如何用SQL快捷的获取Oracle版本信息,可以用以下两句SQL:
- select * from PRODUCT_COMPONENT_VERSION;
- select * from v$version;
两句SQL语句都可以取得Oracle版本信息,只是信息展现的方式不一样。
Tags: Oracle.
用Apache Commons FileUpload来实现文件上传的时候,往往会遇到一些中文乱码的问题,有可能是获取的文件路径或者文件名称为乱码,也有可能获取的表单字段为乱码,以UTF-8编码为例,解决的办法如下:
- 调用FileUpload.settingHeaderEncoding(”UTF-8″),这项设置可以解决路径或者文件名为乱码的问题。
- 在取字段值的时候,用FileItem.getString(”UTF-8″),这项设置可以解决获取的表单字段为乱码的问题。
Tags: FileUpload.
position:fixed做为CSS2规范中的一项,可以让元素相对于屏幕来定位,而不是相对于网页,比如有一些网页元素需要始终停留在屏幕上 的某个位置,而不是随着页面滚动而位置变动,这个时候这项特性是非常有用的,但这项特性却不被ie支持,以下是一些实现这种效果的变相方式,基本上在所有 主流浏览器中都适合。最简单是把修饰元素的position改为absolute,然后在css中加上以下style:
html, body {
height: 100%; overflow: auto;
}
更多参考文章:
Tags: CSS.
网页设计中圆角的使用越来越多,往往多是以图片背景的方式来实现,用这种方式实现圆角的缺点是图片加载增加了网络传输量,同时如果圆角的大小需要改 变,需按照尺寸重新制作圆角图片。这里介绍一种用javascript来灵活实现圆角的方式,开发人员要实现圆角效果,不用每次都去求助美工了。
首先从curvycorners.net下载一个rounded_corners.js的js文件,遵循LPGL协议,最新的版本是1.2.9,支持对HTML中DIV元素实现圆角(rounded corners)修饰。主要特性:
- 免费
- 易于使用的javascript对象
- 不需要任何图片
- 反锯齿支持
- 可以在背景图片上实现反锯齿
- 可以修饰带有背景图片的DIV
- 可变的高度和宽度设置
- 支持solid border,也就是可以实现带颜色的圆角border
- 用户可以自定圆角半径
- 支持所有主流浏览器
用法:
<script type=”text/JavaScript” src=”rounded_corners.js”></script>
<DIV id=”myDiv”></DIV>
<script type=”text/JavaScript”>
window.onload = function()
{
settings = {
tl: { radius: 20 },
tr: { radius: 20 },
bl: { radius: 20 },
br: { radius: 20 },
antiAlias: true,
autoPad: false
}
var divObj = document.getElementById(”myDiv”);
var cornersObj = new curvyCorners(settings, divObj);
cornersObj.applyCornersToAll();
}
</script>
更 加详尽的用法参考它自带的demo,大概的工作原理是curvyCorners一个像素一个像素的画出圆角,每一个像素用一个div实现,同时通过给每一 个像素加上一定的不透明性来实现反锯齿。可以同时给多个div实现圆角,通过newCornersObj = new curvyCorners(settingsObj, divObj1[, divObj2[, divObj3[, . . . [, divObjN]]]]);
Tags: Javascript.
Spring开发过程中常用的几种模式或者说最佳实践。
- Exception Translator (异常转换):常常会遇到API中有一些checked Exceptions需要处理,如果catch这些异常,然后写error log或者return error code,通常都不是很有效的方法而且会影响到事务的处理,正确的方法是把这些异常捕获然后重新抛出一个runtime exception。
- Template(模 板):在Spring提供的一些API中,如HibernateTemplate、JdbcTemplate,往往对一些资源的处理都被封装成为一个 template,一个Template就是对资源处理的API封装,这样你就不必关注资源处理的一些琐碎问题,如写jdbc代码的时候经常需要 finally里写一堆close逻辑,这些逻辑你都可以封装在Template中,想自己写一个Template可以先去看看 HibernateTemplate、JdbcTemplate的源代码实现。
- Exporter (导出者):往往遇到一些情况,已经有了一个service bean,不想或者不能改变它的接口、参数和返回值,比如原先传入的是一个List对象,返回Map对象,现在需要传入一段XML String同时返回XML String,这个时候可以用Exporter这种模式,如远程调用的时候,我们需要把一个bean导出为EJB接口或者Hessian服务,这个时候可 以用Spring中提供的HessianServiceExporter。遇到类似情况,可以自己写一个Exporter。
- Proxy (代理):同Exporter模式一样,主要用于远程调用情形下,通过Proxy,用户只需关注bean的API而不必关注如果从远程接口中如何取得这个bean,因为这些都可以通过spring配置来实现。
Tags: Spring.
REST(Representational State Transfer),有人翻译成中文为“具象状态传输”,最近在开发者社区中被广泛讨论,可以把它理解为同MVC和Ajax一样,是一种架构模式,来源于 最初对互联网web架构的定义,在URI和HTTP这类标准之上的一套web通用架构,URI表示资源,HTTP协议提供GET/POST/PUT /DELETE四种基本操作动作,任何动作都可以由这四种最原子的动作组成。当然REST只是一种架构和思想,所以也不限于URI和HTTP协议,用户可 以自己定义新的协议实现REST架构,如用直接在TCP/IP协议上来实现REST架构。
因为现有的浏览器软件提供商都没有实现HTTP协 议中的PUT和DELETE方法,所以严格来讲,现在的web应用都不是REST架构,包括html中的form method也只能是GET和POST方法,但是很多web应用服务器都已支持PUT和DELETE方法,如java servlet api可以看到put和delete接口。一些http client如apache commons httpclient也支持这两种方法。在现阶段要实现REST架构的应用程序,我们只能借助ajax(XMLHttpRequest可以支持PUT和 DELETE方法)或者在某些情况下自己写客户端。
REST架构的特点在于把一些逻辑放在了客户端,客户端与服务器端的交互就是对服务器端资源的操作,或者可以理解为远程资源调用,Ruby on Rails在REST架构上已经有所尝试,估计在今后几年内,REST架构会有一个大的发展。
资源:
Tags: REST.
越来越多的人采用Subversion代替CVS来构建版本控制系统,Subversion默认提供两种服务模式,一种是自己实现的 svnserve,可以通过svn协议访问,另一种也是采用最为广泛的一种方式是借助apache http server来实现,可以通过http webdav方式访问,这里主要介绍第二种方式的安装和使用,安装环境为Windows XP。
- 下载apache HTTP server和subversion二进制版本
- 安装apache服务器,解压缩subversion安装文件到如D:\svn
- 修改Apache下的httpd.conf文件,找到
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
去掉注释,同时在文件末尾加上以下配置
LoadModule dav_svn_module D:/svn/bin/mod_dav_svn.so
<Location /svn>
DAV svn
SVNParentPath D:/svn/svnparent
AuthType Basic
AuthName “Subversion repository”
AuthUserFile D:/svn/svn-auth-file
Require valid-user
</Location>
- 用apche下的htpasswd命令创建用户验证文件,添加用户
C:\apache\bin>htpasswd -cm D:\svn\svn-auth-file collin
New password: *****
Re-type new password: *****
Adding password for user collin
C:\apache\bin>htpasswd -m D:\svn\svn-auth-file collin2
New password: *****
Re-type new password: *****
Adding password for user collin
- 创建资源库
D:\svn\bin>svnadmin create D:\svn\svnparent\repository
- 重启apache服务器
安装完成,更详细的说明和配置参考svnbook。
其他资源:
Tags: Apache,Svn.
- 下载安装包resin-2.1.17.tar.gz
- 上传到Linux下的usr/local
- 执行以下脚本:
cd /usr/local
tar xvfz resin-2.1.17.tar.gz -C /usr/local
cd /usr/local
mv resin-2.1.17 resin
cd resin
./configure
make
make install
- 执行 /usr/local/resin/bin/httpd.sh start
- 浏览http://linuxhost:8080/
注意几点:
必须先安装有JDK环境,如果该服务器上安装有Tomcat等其他应用程序服务器,确定不会出现端口冲突。更详细的安装文档见这里
Tags: Linux,Resin.