什么是许可协议?
什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。
不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。
而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。以下是开源界的 5 大许可协议。
GNU GPL
GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:
可自由复制
你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。
可自由分发
在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。
可以用来盈利
你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。
可自由修改
如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。
需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。
GNU LGPL
GNU 还有另外一种协议,叫做 LGPL (Lesser General Public Licence),它对产品所保留的权利比 GPL 少,总的来说,LGPL 适合那些用于非 GPL 或非开源产品的开源类库或框架。因为 GPL 要求,使用了 GPL 代码的产品必须也使用 GPL 协议,开发者不允许将 GPL 代码用于商业产品。LGPL 绕过了这一限制。
BSD
BSD 在软件分发方面的限制比别的开源协议(如 GNU GPL)要少。该协议有多种版本,最主要的版本有两个,新 BSD 协议与简单 BSD 协议,这两种协议经过修正,都和 GPL 兼容,并为开源组织所认可。
新 BSD 协议(3条款协议)在软件分发方面,除需要包含一份版权提示和免责声明之外,没有任何限制。另外,该协议还禁止拿开发者的名义为衍生产品背书,但简单 BSD 协议删除了这一条款。
MIT
MIT 协议可能是几大开源协议中最宽松的一个,核心条款是:
该软件及其相关文档对所有人免费,可以任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版权和许可提示。
这意味着:
你可以自由使用,复制,修改,可以用于自己的项目。
可以免费分发或用来盈利。
唯一的限制是必须包含许可声明。
MIT 协议是所有开源许可中最宽松的一个,除了必须包含许可声明外,再无任何限制。
Apache
Apache 协议 2.0 和别的开源协议相比,除了为用户提供版权许可之外,还有专利许可,对于那些涉及专利内容的开发者而言,该协议最适合(这里有一篇文章阐述这个问题)。
Apache 协议还有以下需要说明的地方:
永久权利
一旦被授权,永久拥有。
全球范围的权利
在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。
授权免费,且无版税
前期,后期均无任何费用。
授权无排他性
任何人都可以获得授权
授权不可撤消
一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码。
分发代码方面包含一些要求,主要是,要在声明中对参与开发的人给予认可并包含一份许可协议原文。
Creative Commons
Creative Commons (CC) 并非严格意义上的开源许可,它主要用于设计。Creative Commons 有多种协议,每种都提供了相应授权模式,CC 协议主要包含 4 种基本形式:
署名权
必须为原始作者署名,然后才可以修改,分发,复制。
保持一致
作品同样可以在 CC 协议基础上修改,分发,复制。
非商业
作品可以被修改,分发,复制,但不能用于商业用途。但商业的定义有些模糊,比如,有的人认为非商业用途指的是不能销售,有的认为是甚至不能放在有广告的网站,也有人认为非商业的意思是非盈利。
不能衍生新作品
你可以复制,分发,但不能修改,也不能以此为基础创作自己的作品。
这些许可形式可以结合起来用,其中最严厉的组合是“署名,非商用,不能衍生新作品”,意味着,你可以分享作品,但不能改动或以此盈利,而且必须为原作者署名。在这种许可模式下,原始作者对作品还拥有完全的控制权,而最宽松的组合是“署名”,意味着,只要为原始作者署名了,就可以自由处置。
延伸资源
Creative Commons Licenses
Creative Common 许可的官方条款与解释
Open Source Initiative
包含各种开源协议资源
Open Source Licenses Comparison
对主流开源协议的对比
Understanding Open-Source Licensing
开源协议详解
HOW TO: Pick an Open Source License
如何选择不同的开源协议
什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。
不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。
而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。以下是开源界的 5 大许可协议。
GNU GPL
GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:
可自由复制
你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。
可自由分发
在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。
可以用来盈利
你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。
可自由修改
如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。
需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。
GNU LGPL
GNU 还有另外一种协议,叫做 LGPL (Lesser General Public Licence),它对产品所保留的权利比 GPL 少,总的来说,LGPL 适合那些用于非 GPL 或非开源产品的开源类库或框架。因为 GPL 要求,使用了 GPL 代码的产品必须也使用 GPL 协议,开发者不允许将 GPL 代码用于商业产品。LGPL 绕过了这一限制。
BSD
BSD 在软件分发方面的限制比别的开源协议(如 GNU GPL)要少。该协议有多种版本,最主要的版本有两个,新 BSD 协议与简单 BSD 协议,这两种协议经过修正,都和 GPL 兼容,并为开源组织所认可。
新 BSD 协议(3条款协议)在软件分发方面,除需要包含一份版权提示和免责声明之外,没有任何限制。另外,该协议还禁止拿开发者的名义为衍生产品背书,但简单 BSD 协议删除了这一条款。
MIT
MIT 协议可能是几大开源协议中最宽松的一个,核心条款是:
该软件及其相关文档对所有人免费,可以任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版权和许可提示。
这意味着:
你可以自由使用,复制,修改,可以用于自己的项目。
可以免费分发或用来盈利。
唯一的限制是必须包含许可声明。
MIT 协议是所有开源许可中最宽松的一个,除了必须包含许可声明外,再无任何限制。
Apache
Apache 协议 2.0 和别的开源协议相比,除了为用户提供版权许可之外,还有专利许可,对于那些涉及专利内容的开发者而言,该协议最适合(这里有一篇文章阐述这个问题)。
Apache 协议还有以下需要说明的地方:
永久权利
一旦被授权,永久拥有。
全球范围的权利
在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。
授权免费,且无版税
前期,后期均无任何费用。
授权无排他性
任何人都可以获得授权
授权不可撤消
一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码。
分发代码方面包含一些要求,主要是,要在声明中对参与开发的人给予认可并包含一份许可协议原文。
Creative Commons
Creative Commons (CC) 并非严格意义上的开源许可,它主要用于设计。Creative Commons 有多种协议,每种都提供了相应授权模式,CC 协议主要包含 4 种基本形式:
署名权
必须为原始作者署名,然后才可以修改,分发,复制。
保持一致
作品同样可以在 CC 协议基础上修改,分发,复制。
非商业
作品可以被修改,分发,复制,但不能用于商业用途。但商业的定义有些模糊,比如,有的人认为非商业用途指的是不能销售,有的认为是甚至不能放在有广告的网站,也有人认为非商业的意思是非盈利。
不能衍生新作品
你可以复制,分发,但不能修改,也不能以此为基础创作自己的作品。
这些许可形式可以结合起来用,其中最严厉的组合是“署名,非商用,不能衍生新作品”,意味着,你可以分享作品,但不能改动或以此盈利,而且必须为原作者署名。在这种许可模式下,原始作者对作品还拥有完全的控制权,而最宽松的组合是“署名”,意味着,只要为原始作者署名了,就可以自由处置。
延伸资源
Creative Commons Licenses
Creative Common 许可的官方条款与解释
Open Source Initiative
包含各种开源协议资源
Open Source Licenses Comparison
对主流开源协议的对比
Understanding Open-Source Licensing
开源协议详解
HOW TO: Pick an Open Source License
如何选择不同的开源协议
24岁那年,郭台铭成立鸿海塑料公司,当时他仅有15名员工,规模只有30万元新台币,但他的奋斗目标很明确,就是要成为台湾地区第一、亚洲第一、世界第一。为号召员工实现这一宏伟目标,一次,他在员工大会上侃侃而谈“四个如果”:
第一个如果:
(1)你只是接电话,告诉客户不知道、没办法。
(2)你只是开订单,不联络、不追踪、有问题不回报、不处理。
(3)你只是打报表,不确定数字的正确性。
(4)你只是接电话,从未希望客户有满意的感觉、从未希望客户多订一些货。
(5) 你只是认为自己是助理,从未想过自己的一言一行代表业务、主管、老板、公司。
那么,你不够格做一个称职的助理,你的工作,任何人都可以取代。
第二个如果:
(1) 你从未将部门业绩目标时时刻刻放在心中。
(2) 你从未想过个人目标攸关部门目标达成。
(3) 送样后,从未想过结果如何,为什么没消息。
(4) 报价后,从未追踪为什么没有订单,差多少可以成交。
(5) 订单多了,从未去想怎么回事,随波逐流、随客户起舞。
(6) 订单少了,不去追查什么原因,毫无感觉、毫无动作。
(7)你从未想过在客户面前更专业、更守信。
(8) 工作不规划、时间不管理、成本不控制、客户不教育。
(9) 你认为开发新客户、新市场、是麻烦的、痛苦的。
那么,你不够格做一个称职的业务人员,你在,是我们大家的负担。
第三个如果:
(1) 你不把客户需求当作是非常的重要。
(2) 你不把客户抱怨当作优先解决的事项并主动追查检讨。
(3) 你时常不准时送货,当作客户永远都会等你。
(4) 业务反应客户的问题,你嫌他烦。
(5) 客户反应品质的问题,你嫌他挑剔,视他为烂客户。
(6) 你经常把「很麻烦」、「有困难」、「不想做」、「不可能」挂在嘴边。
(7) 你每天上班当作例行工作,不主动寻找问题、改善品质。
那么,你不够格做一个称职的生产主管,与你共事,我很疲劳。
每日我们在外努力,却没有良好的品质,没有良好的服务做后盾,一切效果就会打折扣,对客户的承诺就会跳票,我们将会因此变成口才一流,品质二流,服务三流的公司。
第四个如果:
(1) 有骂没有惩罚,有惩罚没有奖励。
(2) 对企业有利的,不立刻行动。
(3) 经常把「再看看」、「再研究」挂在嘴边。
那么,我也只能说,你不是一个称职的领导人。
郭台铭如是讲:“我有一个梦:我希望你们在组织中都有不可取代的地位;我希望每个部门在公司有不可取代的地位;我希望我们的产品、质量、服务,在客户心中有不可取代的地位;我希望我们公司在人类追求文明进步和真善美中,有不可取代的地位。”
30年前在台湾地区,郭台铭名不见经传,所属企业规模在行业内不足挂齿。而如今,郭台铭是叱咤风云、纵横四海的台湾地区首富,麾下企业遍及欧美,员工人数突破十六万。
第一个如果:
(1)你只是接电话,告诉客户不知道、没办法。
(2)你只是开订单,不联络、不追踪、有问题不回报、不处理。
(3)你只是打报表,不确定数字的正确性。
(4)你只是接电话,从未希望客户有满意的感觉、从未希望客户多订一些货。
(5) 你只是认为自己是助理,从未想过自己的一言一行代表业务、主管、老板、公司。
那么,你不够格做一个称职的助理,你的工作,任何人都可以取代。
第二个如果:
(1) 你从未将部门业绩目标时时刻刻放在心中。
(2) 你从未想过个人目标攸关部门目标达成。
(3) 送样后,从未想过结果如何,为什么没消息。
(4) 报价后,从未追踪为什么没有订单,差多少可以成交。
(5) 订单多了,从未去想怎么回事,随波逐流、随客户起舞。
(6) 订单少了,不去追查什么原因,毫无感觉、毫无动作。
(7)你从未想过在客户面前更专业、更守信。
(8) 工作不规划、时间不管理、成本不控制、客户不教育。
(9) 你认为开发新客户、新市场、是麻烦的、痛苦的。
那么,你不够格做一个称职的业务人员,你在,是我们大家的负担。
第三个如果:
(1) 你不把客户需求当作是非常的重要。
(2) 你不把客户抱怨当作优先解决的事项并主动追查检讨。
(3) 你时常不准时送货,当作客户永远都会等你。
(4) 业务反应客户的问题,你嫌他烦。
(5) 客户反应品质的问题,你嫌他挑剔,视他为烂客户。
(6) 你经常把「很麻烦」、「有困难」、「不想做」、「不可能」挂在嘴边。
(7) 你每天上班当作例行工作,不主动寻找问题、改善品质。
那么,你不够格做一个称职的生产主管,与你共事,我很疲劳。
每日我们在外努力,却没有良好的品质,没有良好的服务做后盾,一切效果就会打折扣,对客户的承诺就会跳票,我们将会因此变成口才一流,品质二流,服务三流的公司。
第四个如果:
(1) 有骂没有惩罚,有惩罚没有奖励。
(2) 对企业有利的,不立刻行动。
(3) 经常把「再看看」、「再研究」挂在嘴边。
那么,我也只能说,你不是一个称职的领导人。
郭台铭如是讲:“我有一个梦:我希望你们在组织中都有不可取代的地位;我希望每个部门在公司有不可取代的地位;我希望我们的产品、质量、服务,在客户心中有不可取代的地位;我希望我们公司在人类追求文明进步和真善美中,有不可取代的地位。”
30年前在台湾地区,郭台铭名不见经传,所属企业规模在行业内不足挂齿。而如今,郭台铭是叱咤风云、纵横四海的台湾地区首富,麾下企业遍及欧美,员工人数突破十六万。
今天公司同事反应网站所有的产品详细页面无法打开,任何一个产品信息都报错
The page you are looking for is temporarily unavailable.
Please try again late.
问过了其他的技术,没人修改过网站程序,那么怎么会出错呢?首页和分类,列表页又不出错。
首先怀疑是缓存问题,缓存目录里没有goods的缓存,同时看到了很多Sql_cache是空的,那么先到includes/cls_mysql.php把里面的$max_cache_time = 3600改成$max_cache_time = 0这样sql就不缓存了。
可是这样还是没有解决问题,然后跟踪程序的执行通过了对goods.php,lib_goods.php,cls_template.php,commonfunc.php的分析,最后找到了commonfunc.php中的write2file函数中有个fputs($fp,$msg);语句,只要执行这个语句就会报错,这个语句是标准的PHP函数,没任何错误,后来把$fileName打印出来一看,原来是logs/debug.log。
过去一看,这个文件大小有2G,估计是文件系统已经无法在操作这个文件了。所以就会频频报错。删除这个文件,一切恢复正常!
我ArthurXF倾情奉献,希望能对大家有所帮助。
The page you are looking for is temporarily unavailable.
Please try again late.
问过了其他的技术,没人修改过网站程序,那么怎么会出错呢?首页和分类,列表页又不出错。
首先怀疑是缓存问题,缓存目录里没有goods的缓存,同时看到了很多Sql_cache是空的,那么先到includes/cls_mysql.php把里面的$max_cache_time = 3600改成$max_cache_time = 0这样sql就不缓存了。
可是这样还是没有解决问题,然后跟踪程序的执行通过了对goods.php,lib_goods.php,cls_template.php,commonfunc.php的分析,最后找到了commonfunc.php中的write2file函数中有个fputs($fp,$msg);语句,只要执行这个语句就会报错,这个语句是标准的PHP函数,没任何错误,后来把$fileName打印出来一看,原来是logs/debug.log。
过去一看,这个文件大小有2G,估计是文件系统已经无法在操作这个文件了。所以就会频频报错。删除这个文件,一切恢复正常!
我ArthurXF倾情奉献,希望能对大家有所帮助。
食物选择原则表,请尽量按表上内容选择自己爱吃的肉和菜,中、晚两餐均是两荤一素,早餐多是鸡蛋加豆浆。
附:食物选择表:
荤菜:草鱼、鲳鱼、白鲢、鲈鱼、三文鱼、沙丁鱼、黑鱼、桂鱼、河虾、乌贼、舌鳎鱼、小黄鱼、羊肉(瘦)、鹌鹑、乌骨鸡、海鳗、鳕鱼、大黄鱼、兔肉、鸡(去皮鸡腿肉)、梭子蟹、龙虾、牛肉(瘦)、鳊鱼、黄鳝、猪肉(瘦)、鸡蛋、泥鳅、青蟹、蛏子、花蛤、河蟹、生蚝。
素菜:水芹菜、生菜、小白菜、芥蓝、青菜、油麦菜、地衣、海带、冬瓜、鲜香菇、绿豆芽、大白菜、空心菜、莴苣、平菇、黄瓜、韭芽、韭菜、小葱、豌豆苗、芹菜(白茎)、西兰花、蓬高菜、葫芦、青芥蓝、菠菜、春笋。
(以上各品种每餐食用量小于150克)
应避免的食物:鹅、鸭、动物内脏,牛奶等乳制品,所有的水果(糖分太高),豆类蔬菜,马铃薯,胡萝卜,大米,面食,所有酒类、饮料,糖果类,冰淇淋。
减肥作息
6:30 起床
7:30 吃早饭,背食物热量表
上午 运动半小时,做喜欢做的事情
11:30 吃午饭
下午 逛街,玩,学习
17:30 吃晚饭
21:00 睡觉。
附:食物选择表:
荤菜:草鱼、鲳鱼、白鲢、鲈鱼、三文鱼、沙丁鱼、黑鱼、桂鱼、河虾、乌贼、舌鳎鱼、小黄鱼、羊肉(瘦)、鹌鹑、乌骨鸡、海鳗、鳕鱼、大黄鱼、兔肉、鸡(去皮鸡腿肉)、梭子蟹、龙虾、牛肉(瘦)、鳊鱼、黄鳝、猪肉(瘦)、鸡蛋、泥鳅、青蟹、蛏子、花蛤、河蟹、生蚝。
素菜:水芹菜、生菜、小白菜、芥蓝、青菜、油麦菜、地衣、海带、冬瓜、鲜香菇、绿豆芽、大白菜、空心菜、莴苣、平菇、黄瓜、韭芽、韭菜、小葱、豌豆苗、芹菜(白茎)、西兰花、蓬高菜、葫芦、青芥蓝、菠菜、春笋。
(以上各品种每餐食用量小于150克)
应避免的食物:鹅、鸭、动物内脏,牛奶等乳制品,所有的水果(糖分太高),豆类蔬菜,马铃薯,胡萝卜,大米,面食,所有酒类、饮料,糖果类,冰淇淋。
减肥作息
6:30 起床
7:30 吃早饭,背食物热量表
上午 运动半小时,做喜欢做的事情
11:30 吃午饭
下午 逛街,玩,学习
17:30 吃晚饭
21:00 睡觉。
smarty的date_format中不能有中文的解决方案
2010/02/04 12:51 ArthurXF
{$smarty.now|date_format:"%Y年%m月%d日"} 这样写就成了"2010年%m月%d日"+一些乱码如果给汉字后加上空格就正常了,但是输出也有了空格。
为了解决这个问题,我去读了smarty的插件代码modifier.date_format.php:
发现里面strftime这个PHP函数对于中文支持不好。
所以我修改了modifier.date_format.php函数,一劳永逸啊。大家可以直接复制替换原有内容即可。
而且我这个函数还是支持繁简中文的哦。呵呵
为了解决这个问题,我去读了smarty的插件代码modifier.date_format.php:
发现里面strftime这个PHP函数对于中文支持不好。
所以我修改了modifier.date_format.php函数,一劳永逸啊。大家可以直接复制替换原有内容即可。
而且我这个函数还是支持繁简中文的哦。呵呵
function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
{
if (substr(PHP_OS,0,3) == 'WIN') {
$_win_from = array ('%e', '%T', '%D');
$_win_to = array ('%#d', '%H:%M:%S', '%m/%d/%y');
$format = str_replace($_win_from, $_win_to, $format);
}
$arrTemp = array('年','月','日','时','分','秒','時');
foreach($arrTemp as $v){
if(strpos($format,$v)){
$strFormat = str_replace('%','',$format);
}
}
if($string != '') {
if(!empty($strFormat)) return date($strFormat, smarty_make_timestamp($string));
else return strftime($format, smarty_make_timestamp($string));
} elseif (isset($default_date) && $default_date != '') {
if(!empty($strFormat)) return date($strFormat, smarty_make_timestamp($default_date));
else return strftime($format, smarty_make_timestamp($default_date));
} else {
return;
}
}
{
if (substr(PHP_OS,0,3) == 'WIN') {
$_win_from = array ('%e', '%T', '%D');
$_win_to = array ('%#d', '%H:%M:%S', '%m/%d/%y');
$format = str_replace($_win_from, $_win_to, $format);
}
$arrTemp = array('年','月','日','时','分','秒','時');
foreach($arrTemp as $v){
if(strpos($format,$v)){
$strFormat = str_replace('%','',$format);
}
}
if($string != '') {
if(!empty($strFormat)) return date($strFormat, smarty_make_timestamp($string));
else return strftime($format, smarty_make_timestamp($string));
} elseif (isset($default_date) && $default_date != '') {
if(!empty($strFormat)) return date($strFormat, smarty_make_timestamp($default_date));
else return strftime($format, smarty_make_timestamp($default_date));
} else {
return;
}
}