#591 PMP & IPMP

2021-08-15

在软件开发领域,最知名的项目管理证书应该就是 PMP 了。与之对应的有 IPMP, CPMP。

PS:此外还有 6Sigma 等。
PS:PMI 协会除了 PMP 认证之外,还有 ACP 敏捷项目管理认证,PgMP 项目集管理认证。

PMP

项目管理专业人士资格认证 Project Management Professional

组织单位:美国项目管理协会 Project Management Institute (简称PMI)
费用:大概 3800 人民币
要求:3 年以上担任项目经理经历

IPMP

国际项目经理资质认证 International Project Manager Professional

  • A 级 (IPMA Level A) 证书:特级项目经理 Certified Projects Director
  • B 级 (IPMA Level B) 证书:高级项目经理 Certified Senior Project Manager
  • C 级 (IPMA Level C) 证书:项目经理 Certified Project Manager
  • D 级 (IPMA Level D) 证书:助理项目经理 Certified Project Management Associate

其中 C 级对应 PMP 认证。

组织单位:国际项目管理协会 International Project Management Association (简称 IPMA)
费用:大概 1200 人民币
要求:3 年以上担任项目经理经历(C 级), D 级没有要求。

CPMP

中国项目管理师 China Project Management Division

组织单位:人社部

  • 高级项目管理师(一级)
  • 项目管理师(二级)
  • 助理项目管理师(三级)
  • 项目管理员(四级)

如果不是专门查这一块资料,我应该都不知道有这个东西。

参考资料与拓展阅读

#590 Thunderbird 91 与邮件迁移

2021-08-14

Thunderbird 91 发布了,我本地用的还是去年发布的 78,据说新版本改版挺好的,只是不能从老版本直接升级过来,我就手动下载下来看看。

  1. 界面布局没有怎么变,但似乎感觉风格确实有一点变化;
  2. 更新机制变得和 Chrome 一样了,自带更新管理,打开 “关于Thunderbird” 就开始检查更新;
  3. 新增了 OpenPGP 功能,之前需要通过插件来实现;

下载

wget -c --trust-server-names https://download.mozilla.org/?product=thunderbird-91.0-SSL&os=linux64&lang=zh-CN
tar -xjvf thunderbird-91.0.tar.bz2
mv thunderbird ~/Tools/

迁移

还是官网提供的老方法 (Moving Thunderbird Data to a New Computer):

  1. 打开旧的客户端:菜单 > 帮助 > 更多排障信息 > 配置文件夹,
    拿到配置目录: ~/.thunderbird/jum510ej.default
  2. 新版本客户端同样操作,
    拿到配置目录: ~/.thunderbird/ksml2udy.default-release-1
  3. 关闭两个客户端,如果像之前跨机器迁移的话,应该是删除新目录,把旧目录复制过来改成新目录名称。
    但我这是一个电脑上,我直接删除新目录,然后创建软链就行了。
    # ~/.thunderbird/profiles.ini
    rm -rf ~/.thunderbird/ksml2udy.default-release-1
    rm -rf ~/.cache/thunderbird/ksml2udy.default-release-1
    ln -s jum510ej.default ~/.thunderbird/ksml2udy.default-release-1
    ln -s jum510ej.default ~/.cache/thunderbird/ksml2udy.default-release-1
    

替换旧版本

# type thunderbird        # thunderbird is /usr/bin/thunderbird
# ll /usr/bin/thunderbird # ../lib/thunderbird/thunderbird.sh
sudo ln -sf ~/Tools/thunderbird/thunderbird /usr/bin/thunderbird
# sudo apt remove thunderbird

#589 煮鸡蛋(卤蛋/茶叶蛋)

2021-08-10

先把鸡蛋用清水煮熟,然后用钢勺子敲裂,加入佐料,继续煮两个小时。

  • 茶叶,也不用太多
  • 酱油: 生抽,几勺子(看着办)
  • 酱油: 老抽,一点点
  • 冰糖
  • 八角

#587 OCSP 联机证书状态协议

2021-08-08

证书使用者拿到证书之后会对其进行完整性校验,可信性校验,有效期校验,适用范围校验。可是其中少了一环:如果证书使用者出于什么原因主动注销证书,如何通知已经在使用该证书的人呢?
PKI (公开密钥基础建设) 有 CRL ((Certificate Revocation List 证书撤销列表) 和 OCSP (Online Certificate Status Protocol 联机证书状态协议) 两套机制。

#586 视频编码

2021-08-07

压缩技术

  • 1929:首次出现帧间压缩
  • 1952:差分脉冲编码调制
  • 1959:使用时间压缩的帧间预测编码
  • 1967:行程长度编码
  • 20世纪70年代:早期数字视频算法
  • 1972:数字视频的首次压缩
  • 1973:DCT技术成为一种图像压缩算法
  • 1974:混合编码的发展过程
  • 1975:混合编码的进一步发展
  • 1977:更快的DCT算法
  • 1979~1981:运动补偿DCT视频压缩
  • 1984:首个数字视频压缩标准——H.120
  • 1988:用H.261举行视频会议
  • 1992:使用Motion JPEG(MJPEG)的PC多媒体应用
  • 1993:使用MPEG-1的视频CD
  • 1994:使用H.262和MPEG-2的电视广播和DVD
  • 图像采样
  • I帧,P帧和B帧
  • 1995:使用DV存储数字视频
  • 1996:使用 H.263 的新一代视频会议标准
  • 1999:使用 MPEG-4 第二部分的互联网视频
  • 2003:使用 H.264/MPEG-4 AVC 的蓝光、DVD、视频直播和广播电视
  • 2013:使用 H.265/HEVC 的 360° 沉浸式视频、AR和VR
  • 2013:谷歌 VP9 (H.265 的竞争对手)
  • 2018:使用 AV1 的高质量网络视频
  • 2020:使用 H.266/VVC 实现商业上可行的 4K、8K
  • 我国拥有自主知识产权的第三代 “信源编码” 标准——AVS3

编码格式

或者说编解码技术,可能一种技术编码很复杂,但是解码简单。

  • 国际电联的 H.261、H.263、H.264
  • 运动静止图像专家组 (M-JPEG)
  • ISO 运动图像专家组 (Moving Picture Experts Group, MPEG)
  • Real-Networks
  • RM (Real Media)
  • RMVB, 相比较于 RM,支持非固定压缩比,在画面变化小时,更好的压缩文件。
  • 微软公司
  • WMV
  • AVI(Audio Video Interleaved,音频视频交错)
  • ASF(Advanced Streaming Format,高级流格式)
  • 苹果公司
  • QuickTime, MOV 格式
  • 北大和国内企业共同推进的 AVS 系列标准

封装格式

  • 元数据
  • 视频数据
  • 音频数据
  • 字幕数据
  • 可能还有一些版权保护方面的技术。

有一些标准既包括编码格式,也把包括封装格式,如 rm,rmvb,wmv

有一些封装格式可以容纳不同类型的数据,如 mkv

  • 3GP(第三代合作伙伴项目):国际电信行业共同推出,MPEG-4 Part 14(MP4)简化版本,流媒体,常用于移动设备,支持自适应速率。过去很常见,似乎现在没见过了。
  • flv(Flash Video): 采用 H.263 编码,相同质量的前提下,文件更小,资源消耗更少
  • f4v: 采用 H.264 编码

参考资料与拓展阅读

#585 GitHub 上最热门的 PHP 项目

2021-08-06

stars:>10000 为条件过滤,得到 51 个结果,进行简单的过滤,结果如下:

  1. 最火的框架:
  2. Laravel
    1. Maatwebsite/Laravel-Excel
    2. barryvdh/laravel-debugbar
    3. barryvdh/laravel-ide-helper
    4. 管理 z-song/laravel-admin
    5. 管理 the-control-group/voyager
  3. Symfony
  4. CodeIgniter
  5. Yii2
  6. Slim
  7. phalcon/cphalcon
    特色:C语言写的
  8. PHP 包管理工具: Composer
  9. HTTP 客户端: Guzzle
  10. PHP 设计模式 DesignPatternsPHP
  11. 日志库: Seldaek/monolog
  12. 单元测试: sebastianbergmann/phpunit
  13. SMTP 库: PHPMailer
  14. 产品
  15. 文件存储: NextCloud
  16. CMS, WordPress
    1. WP 主题: roots/sage
  17. CMS, getgrav/grav
  18. CMS, octobercms/october
  19. 论坛, flarum/flarum
  20. Personal CRM, Monica
  21. Musici Streaming Server: koel/koel
  22. 网站统计: matomo-org/matomo
  23. 时间处理: briannesbitt/Carbon
  24. PHP Parser: nikic/PHP-Parser
  25. Markdown: erusev/parsedown
  26. 错误处理: filp/whoops
  27. Status Page System: CachetHQ/Cachet
  28. 不再维护 phacility/phabricator
    Phabricator is a collection of web applications for software development.
  29. 图像处理: Intervention/image
  30. 存储封装层: thephpleague/flysystem
  31. 环境变量: vlucas/phpdotenv
    Loads environment variables from .env to getenv(), $_ENV and $_SERVER automagically.
  32. 不再维护 PHPOffice/PHPExcel
    继任者: PHPOffice/PhpSpreadsheet
  33. UUID: ramsey/uuid
  34. 字符串处理: doctrine/inflector
  35. 代码静态分析: phpstan/phpstan
  36. 代码格式化, FriendsOfPHP/PHP-CS-Fixer
  37. doctrine/lexer
  38. doctrine/annotations
  39. doctrine/instantiator
  40. egulias/EmailValidator
  41. JWT tymondesigns/jwt-auth
  42. blueimp/jQuery-File-Upload
  43. fzaninotto/Faker

#584 Python 源码学习 06: tuple

2021-08-05

源码

INIT_TYPE(&PyTuple_Type, "tuple");
SETBUILTIN("tuple", &PyTuple_Type);

**cpython/Include/cpython/tupleobject.h**

typedef struct {
    PyObject_VAR_HEAD
    /* ob_item contains space for 'ob_size' elements.
       Items must normally not be NULL, except during construction when
       the tuple is not yet visible outside the function that builds it. */
    PyObject *ob_item[1];
} PyTupleObject;

当然,与之对应的 PyTypeObject PyTuple_Type 定义在 Objects/tupleobject.c,就不贴出来了。

PyTuple_SET_ITEM 似乎是在完成内存初始化的空间内填充元素时使用的。

成员方法

tuple 类型只有两个成员方法:count, index

#define TUPLE_INDEX_METHODDEF    \
    {"index", (PyCFunction)(void(*)(void))tuple_index, METH_FASTCALL, tuple_index__doc__},

#define TUPLE_COUNT_METHODDEF    \
    {"count", (PyCFunction)tuple_count, METH_O, tuple_count__doc__},

static PyMethodDef tuple_methods[] = {
    TUPLE___GETNEWARGS___METHODDEF
    TUPLE_INDEX_METHODDEF
    TUPLE_COUNT_METHODDEF
    {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
    {NULL,              NULL}           /* sentinel */
};

引用计数

Py_INCREF
Py_DECREF
Py_XINCREF
Py_XDECREF

#583 Git 命令

2021-08-04

看到有篇文章说是 git “新增”了 switch 和 restore 两个命令,仔细一看,原来就是 2019 年就引入了的两个命令,不过我确实没有用过。

这里重新整理一下现在 git 的命令。

git version
git version 2.30.2

apt list --installed | grep ^git
git-doc/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]
git-extras/hirsute,hirsute,now 6.1.0-1 all [已安装]
git-flow/hirsute,hirsute,now 1.12.3-1 all [已安装]
git-man/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装,自动]
git-svn/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]
git/hirsute,now 1:2.30.2-1ubuntu1 amd64 [已安装]
gitg/hirsute,now 3.32.1-1 amd64 [已安装]
gitk/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]

#582 Beego 路由

2021-08-02

基础路由

web.Get(router, web.HandleFunc)
web.Post(router, web.HandleFunc)
web.Put(router, web.HandleFunc)
web.Patch(router, web.HandleFunc)
web.Head(router, web.HandleFunc)
web.Options(router, web.HandleFunc)
web.Delete(router, web.HandleFunc)
web.Any(router, web.HandleFunc)

控制器路由

// func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *HttpServer {
//  return BeeApp.Router(rootpath, c, mappingMethods...)
// }
beego.Router("/admin", &admin.UserController{})
  • 默认匹配 /:id, /?:id
  • 类型匹配 /:id:int, /:id:string
  • 正则匹配 /:id([0-9]+)
  • 星号匹配 /username/* => :splat 变量
    /username/*.* => :path 变量和 :ext 变量

取变量的方式:

c.Ctx.Input.Param(":id")

mappingMethods

映射 HTTP 方法到指定方法。

  1. 支持基础路由中提到到八种方法(Any 用星号代替,优先级最低)。
  2. 如果不指定这个参数,会映射 GET 请求到 Get 方法,以此类推。
  3. 应该不支持指定多个方法。
  4. 应该不支持重复指定方法。
web.Router("/api/food",&RestController{},"get:ListFood")
web.Router("/api/food",&RestController{},"post:CreateFood")
web.Router("/api/food",&RestController{},"put:UpdateFood")
web.Router("/api/food",&RestController{},"delete:DeleteFood")

web.Router("/api",&RestController{},"get,post:ApiFunc")

web.Router("/api/food",&RestController{},"get:ListFood;post:CreateFood;put:UpdateFood;delete:DeleteFood")

注意:控制器可以声明 URLMapping 方法,比 mapptingMethods 参数通过反射实现更加高效。

func (c *CMSController) URLMapping() {
    c.Mapping("StaticBlock", c.StaticBlock)
    c.Mapping("AllBlock", c.AllBlock)
}

自动路由

web.AutoRouter(&controllers.ObjectController{})

URL 采用 /:controller/:method 前缀的方式,后面的部分会转化成 map 参数 (.Ctx.Input.Params)。
method 不区分大小写,对应的处理方法名首字母大写,比如 login -> Login。

注意:/system/config.json 对应到 SystemController.Config 方法,后缀通过 .Ctx.Input.Param(":ext") 获取。

注解路由

  1. 2.0 开始支持,dev 模式生效
  2. 自动扫描指定目录,生成 routers/commentsRouter.go 文件
  3. CommentRouterPath 配置扫描目录
web.Include(&CMSController{})

相应的控制器需要添加这样格式的注解:

// @router /staticblock/:key [get]