最近访问wordpess官网都是429,导致无法在线升级。
手动升级的步骤也不是很复杂,首先下载最新的中文版本,地址https://cn.wordpress.org/latest-zh_CN.zip。这个地址要么用迅雷,或者用国外的IP下载。
现在以后解压删除wp-content目录,然后把本机wordpress中的wp-admin和wp-includes删除,最后复制下载的目录内容到服务器的wordpress目录。
最后访问后台,可能会提示要数据库升级,点击确认即可。…

最近访问wordpess官网都是429,导致无法在线升级。
手动升级的步骤也不是很复杂,首先下载最新的中文版本,地址https://cn.wordpress.org/latest-zh_CN.zip。这个地址要么用迅雷,或者用国外的IP下载。
现在以后解压删除wp-content目录,然后把本机wordpress中的wp-admin和wp-includes删除,最后复制下载的目录内容到服务器的wordpress目录。
最后访问后台,可能会提示要数据库升级,点击确认即可。…
之前博客使用的是Nginx,证书是从let’s encrypt申请的。Nginx配置是比较多,但是从各种参考参考,还是能够配置的。唯一的问题是let’s encrypt证书需要定时更新,更新以后需要Nginx重新加载一下,操作上始终有些繁琐。
Caddy是一个综合解决方案,结合了防火墙、代理、证书等功能,最重要的是使用方便,配置简单。
从Nginx迁移只需要几分钟,我之前使用的docker-compose管理,所以配置如下
Caddy相关配置
caddy:
image: abiosoft/caddy:1.0.3
restart: always
container_name: caddy
external_links:
- blog
environment:
- CADDYPATH=/etc/caddycerts
ports:
- 80:80
- 443:443
volumes:
- /alidata/data/caddy/Caddyfile:/etc/Caddyfile
- /alidata/data/caddy/certs:/etc/caddycerts
而最关键Caddy配置文件只有几行,主要就是代理一下,顺便强制跳转http到https
huangyunkun.com {
redir https://www.huangyunkun.com{uri}
}
www.huangyunkun.com {
redir {
if …文档对于软件来说是非常重要的一部分,特别是对于开源软件来说,在接触源代码之前,一般会先接触文档。
文档可以给新的使用者一个清晰的快速上手说明,也可以给已有使用者提供更多细节上的信息,帮助使用者更好的使用各种特性。
我认为一个合格的文档应该满足以下几个要求:
常用的做法有以下几种:
这是一种相对省心的方案,一般可以直接构建完整的网站,并附带对于文档的支持。
比如react-native使用的docusaurus,这是一个全套解决方法。对于文档本身使用markdown书写,对于多语言翻译使用的是crowdin工具,搜索支持来源于algolia。对于不同语言还有版本的支持都是基于目录的。而多版本切换入口在页面顶部的logo旁。
以react-native为例,版本切换在https://facebook.github.io/react-native/versions中,而不同版本路径如下:
https://facebook.github.io/react-native/docs/getting-started
https://facebook.github.io/react-native/docs/0.60/getting-started

类似的工具还有docsite、vuepress、docsify等,但是对比与docusaurus多多少少有一些功能缺失。
上面一种其实是网站+文档解决方案,如果只是需要文档,那么方案可以更纯粹一些。
可以参考spring-boot的方案,在spring-boot的项目中有一个spring-boot-docs文档,其中有adoc为后缀的文件。这些文件都是asciidoc格式的,通过asciidoc的maven插件生成对应的html、pdf、epub格式的文档,并上传到对应目录,而文档版本引导页面是自己独立编写。

这种操作的优势在于文档输出格式多,且网站样式自由度高,理论上只需要加上不同版本的链接即可。
对于功能比较直接的,可以直接将文档附加在分发物中,比如放在readme中,或者作为软件的一部分,比如命令行工具的help指令。这种一般针对于功能直接的小型软件。
Dubbo目前的文档基于docsite建设,语法使用markdown语法,支持多语言(目录模式)。唯一的缺少的主要是两个
文档版本化可以考虑简单思路就是仿造docsite用docusaurus一样的方式支持版本化。
目前Dubbo文档源文件目录如下:
而支持版本化的目录结构如下:
| Version | Tag | URL |
|---|---|---|
| 1.0.0 | 1.0.0 |
算法工程师和业务开发工程师掌握的技术集和工具是不同的,特别是当两者运用的语言不同的时候更严重。算法辛苦作出的模型业务开发用不了会极大影响很多事情的落地。
常见的合作模式如下算法负责模型训练和导出模型,业务开发导入模型并且做预测。一般算法使用python,R等,而业务开发使用java。可选的部署方法有以下几种:
可以简单点直接用Rserver或者python-httpserver,这种需要额外的服务,也存在调用问题,即引入了网络超时,重试等问题。性能上的话小数量可以保证95%在100ms返回,但是数据量大了就需要仔细控制。
这种情况考虑到基础设施的情况,特别是RPC框架等情况,同时要考虑水平扩展,最好使用PMML。这种额外依赖外部环境的方式可以提供较高的工程稳定性,但是PMML必然导致一些算法精度的损耗。
对于T+1的计算和产出,部署上无疑最简单,直接使用脚本搭配一个监控和调度平台就可以获得较好的收益。
对于PMML,java中的选择是https://github.com/jpmml,对于各种语言和模型都有较好的支持。当然由于较高的通用性,PMML会丧失特殊模型的特殊优化,例如上线XGBoost模型,也可以使用XGBoost4J,该包会链接一个本地环境编译的 .so 文件,C++实现的核心代码效率很高。不过PMML格式通用性,在效率要求不高的场景可以发挥很大作用。…
升级的第一个重点就是maven插件需要升级到最新版本,因为大部分项目还是在Java 8状态,而Java 9新增了Jigsaw,还有部分API的废弃,所以大部分maven插件都有相应的支持调整。所以插件版本是第一个需要升级的。
如果使用的插件比较多,可以使用versions-maven-plugin来检查可用的升级版本。
<plugin<groupIdorg.codehaus.mojo</groupId<artifactIdversions-maven-plugin</artifactId<version2.7</version<configuration<generateBackupPomsfalse</generateBackupPoms</configuration</plugin
执行mvn versions:display-plugin-updates
升级完成之后需要修改编译使用的版本,之前的maven-compiler-plugin需要指定source和target参数,现在只需要release参数就行了
<plugin<groupIdorg.apache.maven.plugins</groupId<artifactIdmaven-compiler-plugin</artifactId<version3.8.0</version<configuration<release11</release</configuration</plugin
另外由于JDK的升级,当有setAccessible(true)调用的时候会有warning消息
…WARNING: Please consider reporting this to the
平时经常在自己的电脑上运行Docker,有时候是快速试用新东西,有时候是搭一个环境用一下,都不是长期使用的。久而久之Docker占用的空间越来越大。
网上有很多清理的脚本,可以清理的无非是以下几样:
相关的命令网上也有,可以存储下来做成一个简单的命令。
还有一个方法就是用docker-gc镜像,命令如下:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
…
文章首发于阿里云开发者社区(https://developer.aliyun.com/article/717213),修改后发布于本博客
讨论仿真系统之前我们需要明确什么是系统,这个概念可以帮助我们理解边界和范围。
那么什么是系统?
德谟克利特的著作《世界大系统》有一段关于系统的阐述:
任何事物都是在联系中显现出来的,都是在系统中存在的,系统联系规定了每一个事物,而每一个事物又能反映系统的联系的总貌。
中国著名学者钱学森的观点是:
系统是由相互作用相互依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个有机整体又是它从属的更大系统的组成部分。
词典对于系统的解释是:
组成一个复杂整体的一组互相作用、互相联系或者依存的事物。
用一个汽车总装线来举例,各种零部件通过传送设备(履带或者其他设备),再有工人(或者是机械手臂)按照顺序组装。在这个系统中,工人,机械手臂,零部件相互作用。履带的速度影响零部件的到达,进而影响装配,流水线自身的划分和设计又影响了整体效率。
从上面这个例子可以感受到我们看系统的时候有两个重要的点:
一是边界,即确认需要研究事物范围,比如货币的供应量从某种程度上也可能对流水线有影响,但是我们并不会考虑它。
二是抽象,针对研究内容的不同,需要考虑的事物的详细程度也是不同的,比如机械手臂的出产公司虽然也是一种外部输入,但是会被统一抽象为机械手臂,对于其的特征建模也可以按照平均来计算。
还有一种更通用的描述系统的方式,即三要素,分别为实体,属性和活动。实体确定了系统构成,属性描述了实体特征,而活动描述了系统内部的相互作用。
仿真一般是指对现实中的系统进行模仿,观测并产生人造过程记录的过程。
仿真最早用于水利研究,逐渐用于航空、航天和原子能技术等领域。后来随着计算机技术的大力发展,扩展到各行各业。
针对互联网公司,特别是线上线下融合较深的业务,由于线上试错成本高,反馈周期慢,通过仿真可以很好服务以下几点:
构建仿真系统流程如下:
系统可以是离散,也可以是连续的。当然对于现实中的大多数系统,这两种变化都是共存的,一般我们取其中占多数的为准。
大部分自然系统都是连续系统,比如湖面的水位,由于降雨,自然蒸发等处于一个时刻变化的状态,而离散系统一般只在离散时间点发生变化的系统,绝对部分人造系统都属于离散系统。
除了特别的需要以外,大部分系统设计上都会做成离散系统,因为连续系统可以通过引入采样装置转为离散系统,比如上面提到的湖泊系统,就可以通过引入定时采样水质,水位等的装置让系统变成离散系统以方便处理。
需要明确系统中的实体(包括属性),事件,活动。
我们以外卖配送来看,实体即骑手,顾客,商家,属性可能包括骑手速度,顾客位置,商家位置等,属性可以是从真实系统中获得,也可以是统计上的数据。
事件主要是对于整个配送有重要影响的,点外卖的时候有一些外卖APP会有进度提示,比如商家接单,商家出餐,骑手抢单,骑手送餐,送达顾客处等,当然这些只是展示出来的事件,系统内部可能更复杂,还有更多事件,确认核心要素的时候一般需要业务专家或者领域专家。


大部分系统单单靠事件就可以驱动了,但是有时候还需要明确活动。
一般两个相邻且有先后顺序的事件,如果从逻辑上导致了状态的转移,那可以化为一个活动。比如外卖配送中从待取餐状态转移配送中状态,其实暗含了到店和取餐两个事件。活动并不是必须的,如果研究目的不涉及可以不关注。
目前有四种成熟仿真算法:

本文首发于阿里云云栖社区,修改后发于本博客。原链接:https://yq.aliyun.com/articles/714659
技术圈新鲜的词汇和概念层出不同,有些是新的理念,有些是新瓶装旧酒,还有就是已经广泛应用了但是最近才理论抽象化的。
那么Serverless是什么?
Serverless还真算不上一个全新的词汇。从字面上看就是无服务器的意思,最早的时候就是单纯指不需要服务器端的软件,绝大部分本地软件都属于这个范畴。
到了云时代,这个词就囊括了不需要关心服务器的相关技术和服务,比如使用了LeanCloud作为数据库,使用了Auth0作为用户认证服务等。此类服务对于使用者而言屏蔽了服务器等概念,一般也称为Baas(Backend as a Service)。Baas更偏向于服务外包,因为不管是服务器还是内在代码本身都是不透明的,使用者也无法感知。
再进一步,Faas(Function as a service)出现了,即函数服务/函数计算。这里的函数就是一个代码块,这个代码块没有明确的定义,但是在实际使用了为了响应速度,这个代码块的冷启动时间必须在毫秒级。
这样就可以在只有需要的时候才调用,做到按需运行,按量扣费。结合云服务商的其他服务,实现多种方式驱动和调度,做到真正的无服务化。当然这里的无服务化只是针对使用方而言的。
实现这个的本质其实是将一部分或者说一大部分控制都托付给了云服务商。Faas让开发者专注于业务逻辑本身,实际上也只有业务代码本身是开发者受控制,其运行环境,预热时间,缓存机制等都不再受控。
所以说Faas是Serverless的一种,而且CNCF也将提供Faas和Baas中一种或两种的服务商算作Serverless服务商。但是因为Faas的变革性更大,目前很多场合基本混用Serverless和Faas两者。
所以本文接下来讨论的Serverless专指Faas,中文也有函数计算,云函数,无服务器计算等称呼。
对于公有云平台的任何技术,使用者的主要顾虑就是单一服务商绑定。
因为一旦绑定,将造成数据和业务迁移困难,后续发展可能缺乏选择。还需要考虑云平台出现故障的情况,是否有异构容灾能力,是否会对业务造成不可逆的影响等。
虽然乍一看,因为业务代码是受控的,且不依赖特定环境,Faas似乎不像Baas那样有绑定问题,但是仔细看Serverless的使用范围不光受代码语言影响,更重要的是驱动的事件。
对于部署的函数,最终都需要使用云服务商提供的事件来驱动。
来看下使用Serverless的简要步骤:
云服务商提供的事件类型越丰富,Serverless的适用面越广。比较通用的事件是HTTP调用和定时调度,其他大部分都是云服务商独有的,所以Serverless是存在较大绑定性的。
从Amazon在2014推出Lambda至今已有5年,各大云服务商基本都是陆续跟进提供了Serverless服务。
主流大玩家们包括:AWS Lambda,Azure Functions,Cloud Functions,国内阿里云,腾讯云,华为云等都提供类似服务。
还有一派自然是开源类型的,需要自建Serverless平台,包括:IBM OpenWhisk,kubeless,knative等。
云服务商中对于语言的支持基本类似,包括主流的Java,Python,Nodejs,AWS Lambda还支持C#,Ruby,Go等,应该是支持语言中最多的。
事件类型方面是云服务商强绑定的,比如阿里云支持OSS事件触发器,HTTP 触发器,定时触发器,MNS …
最近被朱一旦的B站视频洗脑了,专门把BGM翻出来。是国产凌凌漆的插曲。
曲谱
(6)3 (6)3 (6)#2
(6)1 (6)1 2(7)
(6)1(6) (7)1 2(7) 12 3 543
36 36 34
65 25 23
5 41 41 2(6) 2(6) (7)(3) 1(7)(6)
播放


(3 4323)1(7 3 432376)
(6 76#56)54 4445443
123322 232211
(67)121(7)31(6)
(3 4323)1(7 3 432376)
(6 76#56)54 4445443
123322 232211
(67)121(7)31(6)