Skip to main content

wKevin
对衍生品的要求Apache2MITGPLLGPLBSD说明
传染性不允许允许不允许库不允许
App 允许
允许是否允许衍生品更改 License?
许可条款允许允许允许允许允许是否允许修改、分发原项目的源代码?
保留原始版权声明必须无需必须库必须各版本不一致是否在修复、分发、衍生品中保留 License?
开源要求强制开源不要求强制开源库强制开源
App 可选
各版本不一致衍生代码是否必须开源?
专利许可授予不授予不授予不授予不授予是否允许衍生品免费使用原开源项目的专利?
附加条款允许不允许不允许不允许各版本不一致是否允许衍生品增加个性化条款?
是否可商用允许允许允许允许允许开源都可用于商用,概念其实不相关
  • 粗体仅表示与同行不一致。
  • BSD 有 FreeBSD、NetBSD 等多个差异化较大的版本,不像 GPL 等虽然版本也升级,但继承性较好。
  • 不使用 X、√ 来表示,因为担心误导为错误、正确,每种 License 都有自己的规约,没有对错之分。
  • 希望项目得到广泛应用和贡献: 考虑 Apache、MIT —— 简单而宽松的要求可以让项目快速拓展用户,形成生态
  • 希望项目得到分享和改进:考虑 GPL —— 能够始终保持项目的凝聚力,汇聚想为项目本身贡献力量的群体,而不是伸手党
  • LGPL 即 Lesser GPL,是 GPL 的宽松版,是为基于 Linux 开源底层开发闭源上层(APP、Framework 等)而设计的
    • 开发库代码,希望与衍生品(应用程序、二创等)代码保持解耦。
    • 有实力的公司或组织可以底层开源一部分,上层闭源收银子,自建生态。
  • Apache 项目请仔细阅读是否原作者添加了附加条款,以免掉到坑里。

wKevin

摘要:

假设一个文件中包含下面几句:

if __name__ == "__main__":
print("Hello")
exit

如果在 git master 分支中修改了一句:

    print("Hello world")

另外一个分支 b1 先做了相同的修改,做了 git 提交,然后后删除了 world 回到原始状态,又做了 git 提交。

此时 merge 两个分支:

alt text

结果中 world 有?还是没有?

wKevin

前天的工具优化了一下:

  • 输出的改为 markdown 表格: 这下拷贝到 blog 就更方便了。那今天就看看 web 框架的对比数据吧。
  • 处理 License 为空的情况。
  • 直接把 markdown link url 放进去。

这里的 Web 框架不包括 Web Server(HTTP Server、CGI Server……),也不包括微服务框架,仅是 MVC 层面上的框架。

还是按 star 数量排序。

Go

NOProjectNameStar/kFork/kSize/MCreateDateLatestPushLicenseRepo
1gin74.87.83.22014-06(10)2024-03-17mitgin-gonic/gin
2beego30.75.611.42012-02(12)2024-03-12otherbeego/beego
3echo28.22.26.42015-03(9)2024-03-13mitlabstack/echo
4iris24.82.517.82016-01(8)2024-03-13bsd-3-clausekataras/iris
5gf10.71.5119.62017-06(7)2024-03-17mitgogf/gf
6bud5.50.225.72022-04(2)2023-11-24mitlivebud/bud
7hertz4.60.42.72022-05(2)2024-03-10apache-2.0cloudwego/hertz
8algernon2.60.157.72015-03(9)2024-03-10bsd-3-clausexyproto/algernon

-------- 采样时间: 2024-03-20

wKevin

最近有个新项目,要重新选型 Admin 系统,但发现 https://www.githubcompare.com/ 频频异常,就自己写了个脚本,从 https://api.github.com/repos/... 下获取数据,然后抓取出自己关心的字段,再做横向对比。

数据抓取结果如下:

仅前端 & VUE3 & TS

ProjectName          CreateDate  LatestPush  Star/k  Fork/k  Size/M  License  Repo
vue-vben-admin 2020-07(4) 2024-03-15 21.7 5.9 23.2 mit vbenjs/vue-vben-admin
vue-manage-system 2016-11(7) 2024-01-12 18.1 5.9 3.1 mit lin-xin/vue-manage-system
vue-pure-admin 2020-11(3) 2024-03-17 13.2 2.5 192.6 mit pure-admin/vue-pure-admin
Geeker-Admin 2022-04(2) 2024-03-04 6.1 1.3 28.5 mit HalseySpicy/Geeker-Admin
naive-ui-admin 2021-07(3) 2024-03-04 4.5 0.8 1.3 mit jekip/naive-ui-admin
yudao-ui-admin-vue3 2023-02(1) 2024-03-01 0.9 0.4 10.2 mit yudaocode/yudao-ui-admin-vue3
-------- 采样时间: 2024-03-18

wKevin

将 rust 标准库中的几个常用类型的方法安装第一个入参(即:Move、借用、可变借用)分组整理,以便开发时做个参考。

Type(..)(self..)(&self..)(&mut self..)
Cowfrom()into_owned()to_mut()
Cellfrom()
from_mut()
new()
into_inner()set()
get()
take()
replace()
get_mut()
RefCellfrom()
new()
into_inner()borrow()
borrow_mut()
take()
replace()
get_mut()
Vecfrom()
new()
with_capacity()
into_boxed_slice()len()
capacity()
is_empyt()
insert()
append()
push()
pop()
remove()
drain()
clear()
splice()
reserve()
resize()
shrink_to()
truncate()
BTreeMapfrom()
new()
into_keys()
range()
get()
len()
keys()
values()
iter()
get_key_value()
first_key_value()
last_key_value()
contains_key()
is_empyt()
insert()
append()
extend
retain()
remove()
pop_first()
pop_last()
entry()
first_entry()
last_entry()
HashMapfrom()
new()
keys()
into_keys()
capacity()
get()
len()
values()
iter()
is_empty()
insert()
extend
retain()
drain()
remove()
remove_entry()
reserve()
entry()
Boxfrom()
new()
leak()
pin()
downcast()
split()
borrow()borrow_mut()
consume()
read_line()

wKevin

std::borrow::Cow 是个枚举,包含 2 个变体(rust 中枚举的元素称为 Variant,变体)Borrowed、Owned,一般理解为代表对资源、数据的两种状态:借用、拥有所有权。

pub enum Cow<'a, B>
where
B: 'a + ToOwned + ?Sized,
{
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}

两种状态,比较难理解,其实是从使用用途来说的,具体到代码中后面会看到并不难理解。

matplotlib 中作图时常遇到中文显示乱码的问题,本文探索一下原因,并在文末给出一个通用的解决方案。

import os
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.FontManager

matplotlib 中有个字体管理类,可以查询、添加、删除字体,包括系统安装、matplotlib 安装、用户自己安装的 3 类字体。

fm = mpl.font_manager.FontManager()
print(len(fm.ttflist))
print(fm.ttflist[0])
print(len(fm.afmlist))
print(fm.afmlist[0])

print(f"manager 找到了 {len(fm.ttflist)} 个 ttf 字体,{len(fm.afmlist)} 个 afm 字体。")
551
FontEntry(fname='/data/kevin/workspace/venv/venv310/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf', name='DejaVu Sans', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')
138
FontEntry(fname='/data/kevin/workspace/venv/venv310/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/afm/putb8a.afm', name='Utopia', style='normal', variant='normal', weight='bold', stretch='normal', size='scalable')
manager 找到了 551 个 ttf 字体,138 个 afm 字体。