Skip to main content

wKevin

什么是离散事件仿真(DES)

在核心层面上,DES 是一种将系统建模为一系列特定时间点发生的离散事件的方法。每个事件都会触发系统状态的变化,比如机器的启动或停止,顾客的到来或离开,或者信号的发送或接收。通过专注于这些关键时刻,DES 提供了对系统动态的细粒度视图,而不会在连续的时间流中迷失。

DES 的关键特点

  • 事件驱动动态:在 DES 中,事件之间不会发生任何事情。改变仅会在特定事件发生时发生,就像时钟的秒针仅在被推动时才会移动。
  • 时间进展:时间会从一个事件跳跃到下一个事件,忽略两者之间的静默间隙。这种快进机制确保通过集中计算工作在变化时刻上,实现效率。
  • 高效建模:通过仅仿真改变系统状态的事件,DES 能够高效处理复杂的现实世界系统,而无需不必要的计算开销。

DES 的应用

DES 在对时间和资源分配至关重要的行业展现出强大的优势。它的应用与它所仿真的系统一样多样化:

  • 制造与生产:优化生产线、安排维护计划,并管理库存以减少停机时间并提高产量。
  • 医疗保健:在医院中对患者流程进行建模,以改善等候时间、人员配置和资源利用率。
  • 物流:优化供应链运营,从仓库管理到交付路线的优化,确保货物能够高效地从出发地运送到目的地。
  • 电信:管理网络流量,预测拥堵点,并优化数据流以提升用户体验。
  • 基础设施设计:在大型资本项目中探索“假如”情景,以在设计生命周期的早期做出明智决策,节省时间和资源。

SimPy 介绍

进入SimPy - 一个强大的、基于过程的、用于 Python 的离散事件仿真框架。 SimPy 提供了一种清晰简洁的方式来建模 DES 系统,利用了 Python 的简单性和多功能性。通过 SimPy,您可以定义事件、管理资源,并以直观高效的方式仿真过程,使其成为学术界和工业界的优秀工具。

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),
}

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