通过《实战做项目如何选择开源许可协议(一)-了解协议》大概知道了有哪些开源协议和各个协议的作用和区别。我们准备把代码开放出去时,需要了解各个代码托管平台如何设置开源协议。目前常用的平台有:googlecode、github、sourceforge、codeplex。下面分别列一下这些平台如何设置开源协议:

1、googlecode,google推出的代码托管平台,整体可用还是比较强的,如果不是经常被墙用这个也可以。支持svn、git协议。要在这个上面共享代码,

  • 首先需要注册一个google账号,登录。
  • 在url输入 http://code.google.com/intl/zh-CN/ ,打开网页后,最下方有个 create a new project。

  • googlecode1

  • 点击创建工程后,可以选择自己工程的开源协议。预定义协议支持不是太多,主要有常见的BSD、GPL、MIT、APACHE、ECLIPSE、MPL。没有包含的可以选择other open source 填写。

  • googlecode2

2、github, 这个后期之秀,由于git协议本身的优势这几年也赚足了眼球。更有2011年的报道: Github 的提交次数超过了Sourceforge、Google Code和微软的CodePlex。 这么火的代码托管工具我们当然也要在这个上面共享代码,

  • 需要注册一个github账号,登录。
  • 在首页中间有个 create repositories,创建代码工程。

    github1

    和google code 不同的是,github没有直接选择开源协议这一项。这篇文章可以看得出GitHub一族,正在推动开源软件走向无授权时代。如果要在github设置开源协议如何设置呢?其实很简单,在刚创建的工程主页,点击添加文件按钮。

    github2

    新建一个文件LICENSE(这个命名随意,只要能说明清楚就行),把你需要设置的协议内容复制到对应的文件中去就可以了。当然你想特别说明一下,也可以在项目主页的readme.txt中说明。比如 https://github.com/apache/activemq 的license 设置。
    这个license可以根据自己需要设置,不过最好还是标准模板大家更规范一些。

github3

刚写完github没法设置,今天登录却发现github已经增加了开源协议选项,csdn也有了相关的新闻《Github 终于开始认真考虑开源项目许可证了》。看来任何地方都还是需要规范化,毕竟开源本身就是一个社会群体活动,有了大家的积极参与才能长久持续下去。

github4

ps:托管Git (开源或闭源)项目的网站闭源需要收费,最低7$/月起,另有免费的300G空间,超过也要单独收费,不过作为咋普通开源项目也足够了。

3、sourceforge,曾经很辉煌的全球最大开放源代码软件开发平台和仓库,现在虽然有github这样的竞争者追赶,但依然还是老大。它有这些优势:无带宽限制、提供下载统计分析、每天巨大的流量增加你的文件的曝光率、SourceForge 在开源领域可信度高、支持svn和git协议。

  • 注册登录到sourceforge。
  • 创建project。sourceforge的创建project隐藏的有点深。在登录后的右上角有个me,旁边小三角点击弹出层选中Account。

  • sourceforge1

  • 然后在account页选中projects tab,右边有个 Register a New Project超链接,点击就可以创建项目了。

  • sourceforge2

  • 设置开源协议,点击项目进入项目主页,选择admin tab =》 左侧导航Categoryization =》 页面 license。

sourceforge4

sourceforge的协议支持非常多,有开源协议控的可以多看看,不得不说这个界面操作还是有点复杂。

4、codeplex。最后再看看微软的这个代码托管工具。打开页面设计的还比较直接,显示了几个大按钮,可以很容易就点击到。看到首页界面不知道设置开原协议如何操作?是不是像界面这几个按钮一样简单。

codeplex1

  • 登录codeplex,可以使用微软账号登录。
  • 创建项目,在项目创建页依然没有协议设置,只有googlecode有。
  • 点击创建的project,进入project的设置页面,选择 license tab,点击 tab下方右边一点的 change license链接后 找到自己需要的协议设置。它支持的协议和google code差不多,多了微软协议和CDDL。

    codeplex2

比较了目前最常见的集中开源项目托管平台对开源协议的支持和如何操作,大家按自己需求选择吧。

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 实战做项目如何选择开源许可协议(二)- 开放代码

目前国内开源项目正在逐渐升温,中国也开始有不少优秀的开源项目突显出来。在大家摩拳擦掌准备加入开源大军时,也要知道这个圈子里的规则。技术人员不能只是研究技术,任何圈子都有规则,要知道了才能玩得好。前段时间有件关于开源软件的事情挺热闹的,关于国内一个开发者把自己作品开源出来被别的公司的人拿去包装成自己的产品高价卖出去。大部分做开源软件的开发者都不太怎么关注版权这些,具体微博如下:

hoowa_sun
做开源后,发现大部分都被别人拿去学习,然后copy,然后自己闭源卖出去。这里不缺乏大公司,有一家公司拿我的开源系统修改后卖给了一个国内的运营商,卖的还非常贵至少几十万一套。所以我郑重的建议大家,做软件还是要英文版开源,中文版封闭不要开源。

在国内大家习惯了使用盗版、破解,看到这种免费的软件也觉得是理所当然的拿来主义,甚至直接封装到自己的商业组件卖出去。如果你正在这样做,马上停下来研究一下使用的这些开源组件的许可协议,不然某一天你会意外收到一封法院的传票。如果你在开发或者准备开发开源软件,但尚对开源许可协议不了解,也看下这篇文章,选择一种开源许可协议保护你的开源软件。

常见的开源许可协议有:GPL、LGPL、BSD、Apache Licence vesion 2.0、MIT。这些协议有什么区别呢?

  • GPL,全称 GNU General Public License。它的主要内容为:只要在一个软件中使用(“使用”指类库引用或者修改后的代码) GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这个协议就不太适合商用软件,或者准备使用GPL开源组件的商用项目。基于这个协议的项目,极大的提高了开源软件的数量。上面那个微博的案例,如果作者使用了GPL协议,而使用方所写代码的软件包再发布时没有公开源代码就是违反了协议(多谢Sunny2038纠正)。目前用的多的是GPLV1,GPLV2。这两个什么区别看后面那张树形图。采用这个协议的开源软件有:Linux、 MySQL 。
  • LGPL,最初是Library GPL的缩写,后来改称作Lesser GPL。由于GPL太严格,限制了很多商用软件使用GPL组件才推出了这个LGPL。LGPL允许商业软件通过引用类库的方式使用LGPL组件(不直接使用源代码),这样可以不需要开源商业软件的代码。但是如果要修改原始组件的代码,则涉及修改部分的代码和基于原来代码衍生的代码都必须采用LGPL协议。LGPL不适合以LGPL协议为基础的代码进行二次开发的商业软件,但是商用软件可以采用编译后的类库引用就不需要公开源代码了。采用这个协议的开源软件有: JBoss、 FCKeditor 、 Hibernate。之前extjs就因为从LGPL转换到GPL带来了不少的震动。详情点击
  • BSD,全称 Berkeley Software Distribution。这个协议相对上面两个协议宽松很多,允许使用者修改和重新发布代码,也允许使用或在BSD代码基础上开发商业软件发布和销售,因此是适用于商业软件的。使用者别太高兴,使用时还必须做到满足三个条件:1)如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
    2)如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
    3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。适用BSD协议的开源软件有: nginx、CruiseControl、Redis。
  • apache Licence vesion 2.0,这个协议除了为用户提供版权许可之外,还有专利许可。与BSD协议权限类似, 允许代码修改,再发布,适用商业软件。但是也需要满足以下条件:1)需要给代码的用户一份Apache Licence。
    2)如果你修改了代码,需要再被修改的文件中说明。
    3)在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
    4)如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

    除了这些条件它还有这些好处:

    1)永久权利 一旦被授权,永久拥有。
    2)全球范围的权利 在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。
    3)授权免费 无版税, 前期、后期均无任何费用。
    4)授权无排他性 任何人都可以获得授权
    5)授权不可撤消 一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码

    使用apache Licence vesion 2.0协议的开源软件有:Hadoop 、apache httpserver、Spring Framework、MongoDB 。

  • MIT,源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称X11协议。MIT与BSD类似,但是比BSD协议更加宽松,是目前最少限制的协议。这个协议唯一的条件就是在修改后的代码或者发行包包含原作者的许可信息。适用商业软件。使用MIT的软件项目有:jquery、Node.js。

列出了常用协议,还有一些比较常用的大家就谷歌了,比如: Mozilla Public License、Creative Commons、Eclipse Public License 1.0等。

有一篇博客的树形图很好阐述了当前主流许可协议的区别。
src1
另附一张目前github上项目采用的许可协议比例图:
src2
下一篇介绍一下如何在项目网站上添加开源许可协议。

参考:
http://www.aqee.net/a-short-guide-to-open-source-and-similar-licenses/
http://www.iteye.com/news/27616

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 实战做项目如何选择开源许可协议(一)-了解协议

记得刚做javaweb开发的时候被这个编码问题搞得晕头转向,经常稀里糊涂的编码正常了一会编码又乱了。那个时候迫于项目进度大多都是知其然不知其所以然。后来有时间就把整个体系搞了个遍,终于摸通了来龙去脉。

在C++的CGI开发时大家喜欢用latin,这个属于字节方式的编码格式,存储mysql节约空间,而C++也是比较容易控制到byte级别的语言。所以经过框架封装基本也问题不大。

在Java语言中,要涉及修改编码问题的地方还真多。一个地方没有设好就会乱码满天飞。大概总结包括以下这几部分:浏览器、服务器、数据库、操作系统。

浏览器:
如果使用模板语言,html需要设置显示的字符集。这个适用于浏览器判断什么编码显示。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

扩展,浏览器识别编码的顺序:
1.如果HTTP头部申明了charset,则会使用HTTP头部的,
2.让HTTP头部没有设置,则会去解析meta标签的,
3.如果meta也没有的话,浏览器会根据是否设置了auto detect来进行编码识别,
4.否则会使用本地UI的字符编码。

服务器:
对于JSP等动态语言,需要在jsp头部设置编码格式,J2EE服务器解析这个JSP的时候才会把整个页面编码为UTF-8输出,不然就按照系统默认编码格式ISO-8859-1输出了。JSP设置格式如下:

<%@ page language= "java" contentType = "text/html; charset=UTF-8"
      pageEncoding ="UTF-8" %>

大家都知道,JSP对应的就是servlet。servlet的编码对应如下设置:

public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
response.setContentType("text/html;charset=utf-8");
}

还有不要漏掉大家常用的spring工具类,编码转换filter,很实用。在你用struts、spring mvc时这个过滤器帮你转换没有设置的编码过滤。如下设置:

       <filter>
             <filter-name> Set Character Encoding</filter-name>
             <filter-class>
                  org.springframework.web.filter.CharacterEncodingFilter
             </filter-class>
             <init-param>
                   <param-name> encoding</param-name>
                   <param-value> UTF-8</param-value>
             </init-param>
       </filter>

万一还有乱码怎么办呢?doGet方式的参数传递肯定会有乱码问题。只需要在tomcat的监听器里设置编码字符集如下(文件一般存储在 /tomcat安装目录/conf/server.xml ):

<Connector port="80" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" URIEncoding="utf-8"   />

大家在开发的时候别忘了java文件本身也是有编码格式的。在类文件右键查看属性。
eclipse属性

 

 

如果开发时忘记更改文件的编码格式,windows默认是GBK的,后来又要一直到utf8编码的linux怎么办。文件巨多,总不能一个一个去更改吧。其实很简单,只需要在java命令的环境参数设置 -Dfile.encoding=GBK 解决。

编译java代码时,如果使用ant需要在javac里设置编译的字符集。这样打印的log输出到文件或者控制台上就不会乱码了。

<javac debuglevel= "source,lines" source= "1.6"   encoding= "utf-8">

maven编译时设置的字符集:

 < artifactId> maven-compiler-plugin </artifactId >
       < version> 2.5 </version >
                       
         < configuration>
           < optimize> true </optimize >
           < showDeprecation> false </showDeprecation >
           < debuglevel> lines,source </debuglevel >
            < source> 1.6 </source >
            < target> 1.6 </target >
            < encoding> UTF-8 </encoding >
            < meminitial> 128m </meminitial >  
             < maxmem> 768m </maxmem >
                       
         </ configuration>

sqlmap的sql xml,sping的xml 也是需要设置的,因为涉及到跨平台。 顶上添加:

<!--?xml version="1.0" encoding="UTF-8"?-->

数据库:
这里列出大家用的最多的Mysql字符集设置。打开mysql的配置文件( linux 一般在 /etc/my.cnf ,windows在mysql的安装目录 my.ini)。设置如下:

[mysqld]
default-character-set = utf8

[ mysql]
character_set_server = utf8

jdbc需要设置
jdbc : mysql://192.168.0.237:3306/dzh_db?useUnicode=true&characterEncoding=UTF-8

这些都设置了一般的中文是不会有问题的。

不过最近出现了一个问题很搞怪。以前以为所有的字符只要设置好了所有数据都可以录入数据库,结果有些字符就不行,比如●■★这类型的。后来把这些字符变成字节码,居然不是三位utf8的,我擦,大汗淋漓。后来查询可以通过过滤utf8 特殊字符的方式处理。

public static String Utf2String (byte buf[]) {
int len = buf.length ;
StringBuffer sb = new StringBuffer(len / 2);
for (int i = 0; i &lt; len; i++) {

if (by2int(buf[i]) &lt;= 0x7F)
sb.append(( char ) buf[i]);
else if (by2int(buf[i]) &lt;= 0xDF &amp;&amp; by2int(buf[i]) &gt;= 0xC0) {
int bh = by2int(buf[i] &amp; 0x1F);
int bl = by2int(buf[++i] &amp; 0x3F);

bl = by2int(bh &lt;&lt; 6 | bl); bh = by2int(bh &gt;&gt; 2);
int c = bh &lt;&lt; 8 | bl;
sb.append(( char ) c);
} else if (by2int(buf[i]) &lt;= 0xEF &amp;&amp; by2int(buf[i]) &gt;= 0xE0) {
int bh = by2int(buf[i] &amp; 0x0F);
int bl = by2int(buf[++i] &amp; 0x3F);
int bll = by2int(buf[++i] &amp; 0x3F);

bh = by2int(bh &lt;&lt; 4 | bl &gt;&gt; 2);
bl = by2int(bl &lt;&lt; 6 | bll);

int c = bh &lt;&lt; 8 | bl;
// 空格转换为半角
if (c == 58865) {
c = 32;
}
sb.append(( char ) c);

}
}
return sb.toString();
}

或者把mysql的字符集改为 utf8mb4 ,记得这个只有mysql55支持哦!

[mysqld]
default-character-set =utf8mb4

[ mysql]
character_set_server = utf8mb4

操作系统:
windows默认是gbk,一般不需要变动。不过大家又想每个文件都要建立为utf8格式怎么办,不可能我们每个文件建立后都去用属性改变一下?太麻烦!直接在eclipse设置后,同种类型的文件建立都会是utf8格式。

eclipse属性2

 

linux,可以有两个地方修改基本就足够了:
vi /etc/sysconfig/i18n
修改

LANG="zh_CN.GB3212"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"

vi /etc/profile

export LC_ALL="zh_CN.GB2312"
export LANG="zh_CN.GB2312"

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 谈谈WEB开发中的苦大难字符集问题