少湖说 | 科技自媒体

互联网,科技,数码,鸿蒙

简介

Alibaba Cloud Linux 是一个基于 CentOS 的 Linux 发行版,它提供了许多高级功能,如云服务器、云数据库、云服务器监控等。Alibaba Cloud Linux 的安装和配置与 CentOS 的安装和配置基本相同,只是需要安装一些额外的软件包。

以下是安装 Docker 和 docker-compose 的步骤:

  1. 安装 Docker:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置 Docker 源
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker
dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus
dnf -y install docker-ce --nobest

# 查询版本号
docker --version
dnf list docker-ce

# 启动并设置 Docker 为开机启动
systemctl start docker
systemctl status docker
systemctl enable docker

# 验证安装
docker ps
  1. 安装 docker-compose:
1
2
3
4
5
6
7
curl -SL https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
#将可执行权限赋予安装目标路径中的独立二进制文件
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证安装
docker-compose --version

参考资料

开启远程桌面

  1. 参考文章Windows server开启远程桌面教程打开服务管理器。
  2. ECS 配置安全组,开启 3389
  3. Telnet 验证网络联通性 telnet x.x.x.x 338
  4. 安装 Windows App,登录验证

安装 ASP.NET 3.5

1.参考文章Windows Server 2012安装 .NET Framework 3.5
Windows Server 2012上安装.NET Framework 3.5

打开服务器管理器,选择“添加角色和功能”,依次点击下一步进直到入“功能”,勾选 .NET Framework 3.5 功能,点击安装。

  1. 打开IIS,在新建的网站处右键,配置网站使用的应用程序池,选择 .NetCLR 版本 2.0

注意虽然我们安装的是 ASP.NET 3.5, 但整体核心架构是基于.NET2.0, 所以 IIS 中没有3.5的选项, 所以这里配置 .NetCLR 版本 2.0。

选择应用程序池

  1. 启动应用程序池

启动应用程序池

  1. 安装 URL Rewrite 模块

参考文章 IIS安装和使用URL重写工具-URL Rewrite

在页面IIS官网下载并安装 URL Rewrite 模块(X64位下载),安装 URL Rewrite。

常见问题处理

Windows 远程桌面 RDP 连接不上

尝试从以下几个方面进行排查:

  1. 检查服务器是否已开启了远程桌面服务
  2. 检查 ECS 安全组是否放行了RDP端口,一般是3389
  3. 账号密码是否正确
  4. 检查本地办公网络是否拦截RDP端口,尝试使用代理或者VPN绕过拦截

安全性异常

说明: 应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别。
异常详细信息: System.Security.SecurityException: 请求“System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:

1
2
3
4
5
[SecurityException: 请求“System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。]
System.Reflection.Assembly._GetType(String name, Boolean throwOnError, Boolean ignoreCase) +0
System.Web.Compilation.CompilationUtil.GetTypeFromAssemblies(AssemblyCollection assembliesCollection, String typeName, Boolean ignoreCase) +227
System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +362
System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +64

版本信息: Microsoft .NET Framework 版本:2.0.50727.9179; ASP.NET 版本:2.0.50727.9175

解决方案:修改应用程序池配置,修改“加载用户配置文件”为 True。

加载用户配置文件

参考资料

大家好,《鸿蒙Flutter实现实战》推出以来,得到不少小伙伴的好评,最近我们也在和华为开发者联盟合作,以期把这个系列做成最佳实践,在论坛推荐给更多需要的开发者。

教程是有了,但在实际操作过程中,总是会遇到各种意想不到的问题和挑战,有些甚至和语言、SDK无关,特别是配置环境,需要我们对自己的电脑操作系统有更深的了解,诸如环境变量怎么生效这样的问题。

本系列则是对实战的补充,通过具体的案例,描绘问题的排查和解决过程,记录下来也希望对下一个“受害者”有用。

本期受害者叫小天,起初是通过闲鱼找到我,攀谈半天发现他已经是公众号粉丝,这不大水冲了龙王庙么,于是果断邀他扫码入群,开远程协助调研现场。以下是整个问题的排查过程:

小天说安装好 flutter_flutter 以后,运行 app 出错,出错内容如下:

alt text

看起来一头雾水,于是我让他检查下环境,使用
flutter doctor 查看出现如下错误:

alt text

看起来像是在 Dart 版本不对,经过询问发现,小天发现了 dart-sdk 是空的,于是手动复制了一份,查看错误输出,初步判断 dart-sdk 不匹配导致出错。那么问题来了,为什么目录为空?

alt text

我们按照环境配置指南重新安装 sdk,使用 git 克隆 Flutter 的 dev 分支之后,运行时 flutter --version 命令,起初,输出朝着期望的方式进行,但经过短暂 Flutter engine 下载之后,出现一堆红色错误,仔细查看错误原因,dart-sdk 竟然是空的?!

alt text

此时退出命令,再次运行 flutter doctor,这次的输出不一样了

alt text

按照网上的提示,这时需要手动清理 cache,打开 Flutter 安装目录,删除 bin/cache 目录,重新运行,发现,又回到了第一次的情形。

经多几分钟的摸索和分析,我决定尝试手动处理缺失的 dart-sdk,按照命令输出的 url,手动下载解压,复制到 Flutter 目录下的 cache/dart-sdk,现在看看是否能用呢?

alt text

Bingo!已经开始下载编译套件,成功近在咫尺了。

flutter doctor 检查通过,接下来按照正常流程运行,不过又有新的问题出现:

alt text

在这个过程中,杀毒软件频频弹窗,好家伙,竟然是你小子!

Flutter 在安装初始化和编译时会下载和生成大量文件,这就导致监控磁盘的杀软误报,这里必须要点击允许,不要因为忽略而关掉告警,否则无法往下进行。

第一次在鸿蒙设备上运行 Flutter,会下载鸿蒙相关的依赖套件,控制台输出 downloading ohos-x64/arm64...,需要耐心等待。

alt text

最终,经过比较漫长的编译等待,熟悉的画面在真机上出现了,完美收官。

本来以为故事到这就结束了,第二天,小天又传来消息,事态升级,发来一张截图,打开一看直接无语了

alt text

这回杀毒软件直接把 Dart SDK 当成病毒清理了,好吧,这回除了卸载软件,也没啥好办法了。

以上就是本次 Windows 电脑下安装鸿蒙 Flutter 的一次冒险了,忙活大半天,一度陷入自我怀疑和沮丧,终其原因,竟然是杀毒软件拦截的锅,知道真相后,小天觉得自己又行了。那么,你是否也遇到过类似的遭遇呢,欢迎在评论区或者私信分享你的故事。

2月24日,gitee 上的开源鸿蒙组织,所有代码停止更新,查看代码仓显示已关闭,不少小伙伴以为停止更新了,发生了什么?

alt text

原因很简单,所有代码仓迁移至 Gitcode,至于为什么改用 Gitcode,从其官方帮助文档可以得到答案。

GitCode 是一款由 CSDN 开发者社区与华为云 CodeArts 联合打造的新一代开源代码托管平台。 作为开发者的全能助手,GitCode 集代码托管、协同研发、项目管理与开源运营支持于一体,为个人开发者、团队和企业提供高效、安全、智能的解决方案。 高效协作:分支管理、代码审查、超级仓支持,让开发更流畅。 自动化流程:内置 CI/CD 功能,自动化构建、测试和部署,缩短产品交付周期。

自家产品,当然优先选择。笔者也第一时间试用了 Gitcode,界面清爽,总体感觉还不错。

下面进入正文,讨论现有环境、工程、代码如何调整。只要是涉及 git 仓库的地址需要调整,只需要修改域名即可,例如原来仓库为

https://gitee.com/openharmony-sig/flutter_flutter

改为 https://gitcode.com/openharmony-sig/flutter_flutter

鸿蒙Flutter实战

为了更方便开发者使用,系列仓库也同步至 gitcode

Flutter鸿蒙适配指南

Gitee: https://gitee.com/zacks/awesome-harmonyos-flutter

GitCode: https://gitcode.com/zacksleo/awesome-harmonyos-flutter

Flutter鸿蒙版Demo

Gitee: https://gitee.com/zacks/flutter-ohos-demo

GitCode: https://gitcode.com/zacksleo/flutter-ohos-demo

鸿蒙原生应用demo

Gitee: https://gitee.com/zacks/arkts-ohos-demo

GitCode: https://gitcode.com/zacksleo/arkts-ohos-demo

环境

1. Flutter 3.22

如果你使用的是3.22 的鸿蒙sdk,暂时不需要调整,仍然使用,https://gitee.com/harmonycommando_flutter/flutter

2. Flutter 3.7

如果你使用的是3.7的鸿蒙sdk,需要修改 sdk 的 git 地址, 进入鸿蒙 flutter sdk 的目录,修改其 remote 仓库地址:

1
vim .git/config

修改 gitee.com 域名为 gitcode.com

修改后的内容像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://gitcode.com/openharmony-sig/flutter_flutter.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "dev"]
remote = origin
merge = refs/heads/dev
vscode-merge-base = origin/master

其他仓库

flutter engine: https://gitcode.com/openharmony-sig/flutter_engine

flutter packages: https://gitcode.com/openharmony-sig/flutter_packages

flutter samples: https://gitcode.com/openharmony-sig/flutter_samples

插件,同步修改域名,如 flutter inappwebview

https://gitcode.com/openharmony-sig/flutter_inappwebview

修改完重新执行 pub get

AI显然可以提高我们的工作效率,但另一方面,副作用也非常明显。

举例来说,现今还有几个人可以清晰的记得一座城市地标的所在方位,一段通往邻近高铁站的道路是如何蜿蜒曲折,你应该在第几个路口左拐至那条乡间小道。

每个人重度依赖导航,依赖到甚至看不懂地图,只知道听从云端下发的左右指令,一个由机器合成、娇柔暧昧的声音,却成了你最喜欢的旅行伴侣。

Deepseek 已经家喻户晓,每个人蜂拥而入注册和使用,云服务商第一时间支持快速部署号称端云一体的盘古大模型小艺助手也添加支持主机厂陆续宣布接入车机大屏;企业喊出全面拥抱AI的口号。这一切都不过一两个月的时间,世界已经翻天覆地。
如何使用AI,每个人都可以找到适合自己的方式和途径,即使你不使用,它也会在某个背后发挥着作用。
2024年11月,复旦大学发布了限制本科论文使用AI的规定,明确核心研究内容禁止使用AI,这很好理解,科学研究显然不能用人工智能生成假数据,也不应该由它产生结论。

对于企业而言,大规模使用AI可以显著提升生产工作效率,无论是枯燥的例行文件,还是各种汇报PPT,甚至是应付性八股文,这些都可以由AI协助完成,让我们从烦躁的键盘鼠标活动中解放双手。
专家知识库,技术性的、业务性的、规章等等,一切知识都可以借由AI学习吸纳,在你需要的时候与他对话询问,他就像一位无所不知的老领导,不尽其烦的回答你想知道的一切。

在生产端,AI可以根据需求生产文字、图片、代码等等等等,甚至可以从零帮你搭建整个项目、工程。

懒惰是人的天性,当有了这一切的便利,变带来了能力的退化。前面讲过关于导航定位的案例,同样适用于AI,过度依赖人工智能的生成能力,长此以往,如果任何事情交由AI,自己放弃思考和创造,相关能力很可能快速下降。道理很简单,任何后天能力都是通过反复锻炼强化而来。

一个残酷的现实是,Deepseek 的推理能力,强过大部分人,Deepseek 的行文表达,远远抄越大部分人。一个可以联网搜索,几乎全知全能,逻辑缜密的机器,正在改写一切,也可能吞噬一切。

如果你没有创造力,甘愿做一名劳力,当AI机器大生产到来的时候,唯一的劳动价值,也将不复存在。

安装

  1. 开通 ECS 服务器

服务器镜像,建议选择 Alibaba Cloud Linux、CentOS、Ubuntu 或 Anolis OS

  1. 安装 os-copilot

如果是 Alibaba Cloud Linux/CentOS,执行以下命令安装 os-copilot:

1
sudo yum install -y os-copilot

如果是 Ubuntu:

curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash

配置

1.配置 RAM 用户

由于需要使用 AK,SK, 这里先添加 RAM 用户

打开 https://ram.console.aliyun.com/users,点击创建用户,填写登录名称,访问方式勾选 使用永久 AccessKey 访问,点击确定。

复制 AccessKey,AccessSecret,后面会用到。

2.分配权限

点击用户名称,在标签栏处,点击权限管理,新增授权,在权限策略处,搜索 “AliyunSysOMOSCopilotAccess”,然后勾选,点击 “确认新增授权”

权限管理

新增授权

这样,RAM 用户就拥有了 os-copilot 的权限。

3.在命令行中配置 AK,SK

让我们回到服务器的命令行,执行以下命令:

1
2
export ALIBABA_CLOUD_ACCESS_KEY_ID=<AccessKey ID>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<AccessKey Secret>

替换为上面您自己复制的 AccessKey。

测试

1.使用普通模式

1
copilot 当前服务器的健康度

输出以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@moguyun ~]# copilot 当前服务器的健康度

[Copilot]:
要检查当前服务器的健康度,可以执行以下几个步骤来获取相关信息:
1 检查CPU使用率: 使用 top 命令可以查看当前系统的CPU使用情况。
top -b -n 1
2 检查内存使用情况: 使用 free 命令可以查看内存使用情况。
free -h
3 检查磁盘使用情况: 使用 df 命令可以查看磁盘空间使用情况。
df -h
4 检查网络连接状态: 使用 netstat 命令可以查看网络连接状态。
netstat -tuln
5 检查系统负载: 使用 uptime 命令可以查看系统的平均负载。
uptime
6 检查系统日志: 使用 journalctl 命令可以查看系统日志,帮助发现潜在的问题。
journalctl -xe
7 检查服务状态: 使用 systemctl 命令可以查看系统服务的状态。
systemctl list-units --type=service --state=failed

通过以上命令,你可以全面了解服务器的健康状况。如果有任何异常,可以根据输出的信息进一步排查问题。

[Copilot]发现如下命令:
1. top -b -n 1
2. free -h
3. df -h
4. netstat -tuln
5. uptime
6. journalctl -xe
7. systemctl list-units --type=service --state=failed

[Copilot]: 请选择要执行的命令或者保存所有命令,从[s, 1, 7]中进行选择,回复's''save'进行保存,回复'n''no'进行取消,回复'r''retry'重新生成回答。
请输入: 1

[Copilot]: 确认执行该命令[top -b -n 1]?(y/n)
请输入: y
top - 15:53:04 up 94 days, 22:14, 1 user, load average: 0.01, 0.02, 0.00
Tasks: 224 total, 1 running, 220 sleeping, 0 stopped, 3 zombie
%Cpu(s): 3.1 us, 3.1 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3581.4 total, 668.4 free, 1285.0 used, 1628.1 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1834.3 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3216368 root 20 0 0 0 0 I 6.7 0.0 0:01.06 kworker+
1 root 20 0 169548 6352 3068 S 0.0 0.2 1:40.93 systemd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+

...

3219422 root 20 0 2744 816 708 S 0.0 0.0 0:00.23 copilot
3219423 root 20 0 517300 73980 17776 S 0.0 2.0 0:01.34 copilot
3219447 root 20 0 227204 4668 4020 R 0.0 0.1 0:00.00 top

[Copilot]: 执行结束。

可以看到,这种模式下,Copilot 会根据用户的输入要求,给出对应的建议命令,然后需要手动选择、确认执行。

2.使用自动模式,在命令后面增加参数 -t

1
copilot 当前服务器的健康度 -t

输出以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[Copilot]:
为了评估服务器的健康状况,我们需要检查一些关键指标,比如CPU使用率、内存使用情况、磁盘空间和网络状态。这些信息可以通过执行一系列的命令来获取。

[Copilot]:
从top命令的输出可以看到,CPU的使用率大约为6.2%(用户进程3.1% + 系统进程3.1%),空闲率为93.8%,这表明CPU的负载较低。

[Copilot]:
从free -m命令的输出可以看到,总内存为3581MB,已使用的内存为1284MB,空闲内存为669MB,缓冲/缓存占用1627MB,可用内存为1834MB。这表明内存使用情况良好,没有出现内存不足的情况。

接下来,我们检查磁盘空间和网络状态。

[Copilot]:
df -h命令的输出可以看到,根文件系统的总大小为79GB,已使用36GB,剩余40GB,使用率为48%。这表明磁盘空间还有足够的余量,没有出现磁盘空间不足的情况。

最后,我们检查网络状态。

[Copilot]:
从netstat -tuln命令的输出可以看到,服务器上运行着多个监听端口的服务,包括HTTP (80), HTTPS (443), SSH (22)等常用服务。这些服务都在正常监听状态,没有异常。

综合以上信息:

• CPU使用率较低,约为6.2%。
• 内存使用情况良好,没有出现内存不足的情况。
• 磁盘空间还有足够的余量,使用率为48%。
• 网络状态正常,各服务都在正常监听状态。

因此,当前服务器的健康状况良好,没有明显的性能瓶颈或资源不足的问题。

[Copilot]:
当前服务器的健康状况良好,没有明显的性能瓶颈或资源不足的问题。具体指标如下:

• CPU使用率:约6.2%
• 内存使用情况:总内存3581MB,已使用1284MB,空闲669MB,缓冲/缓存1627MB,可用1834MB
• 磁盘空间:根文件系统总大小79GB,已使用36GB,剩余40GB,使用率48%
• 网络状态:各服务都在正常监听状态,没有异常

3.使用文件定义任务

新建一个文件,定义需要执行的任务

1
2
3
4
5
cat task.txt

1.查找日志中大于200M的文件,列出来,显示每个文件的名称和大小
2.用户确认是否清理
3.确认以后删除这些文件

测试结果

copilot 执行任务

1
co -f ~/task.txt -t
1
2
3
4
5
[Copilot]:
我需要先找到大于200M的日志文件并列出它们的名称和大小。这可以通过find命令实现。

[Copilot]:
Observation:

4.测试解释命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat /etc/sysctl.conf |co "使用中文解释"

[Copilot]:
这些配置项都是用于调整Linux内核参数的,下面我将逐一解释每个配置项的意义: vm.swappiness = 0
• 含义:vm.swappiness 参数控制了系统使用交换空间(swap)的倾向性。值为0表示尽可能避免使用交换空间,只有当物理内存不足时才会使用。
• 作用:减少磁盘I/O操作,提高系统性能。 kernel.sysrq = 1

• 含义:kernel.sysrq 参数启用了“魔术 SysRq”键功能。当设置为1时,允许通过组合键(通常是 Alt + SysRq + <command>)执行某些低级别的内核操作。
• 作用:在系统出现严重问题时,可以用来诊断和恢复系统。 net.ipv4.neigh.default.gc_stale_time = 120

• 含义:net.ipv4.neigh.default.gc_stale_time 参数设置了邻居表项(如ARP缓存)中过期条目的垃圾回收时间。值为120秒表示过期条目将在120秒后被清理。
• 作用:防止邻居表项占用过多内存,保持网络连接的高效性。 net.ipv4.conf.all.rp_filter = 0

...

• 注释:net.ipv4.tcp_max_syn_backlog 参数设置了SYN队列的最大长度。值为65536表示最多允许65536个未完成的连接请求。
• 作用:增加SYN队列长度,提高服务器处理大量并发连接的能力。
• 注意:此参数仅在 net.ipv4.tcp_syncookies 设置为0时生效。

这些配置项通常用于优化系统的网络性能和安全性,确保在高负载情况下系统的稳定性和响应速度。

参考资料

智能助手OS Copilot使用说明

背景

App主体迁移,没有及时更新 apple-app-site-association 文件,导致唤起微信报错“由于应用unversal link校验不通过”

Unversal link

Uncersal link 是苹果推出的替代 schema 的一种跨应用跳转方案。
需要先生成 app-site-association 文件,然后放在跳转域名的指定目录 /.well-known/apple-app-site-association 文件中。

如果通过nginx可以使用如下配置

1
2
3
4
location ~ /.well-known/apple-app-site-association {
charset UTF-8;
default_type application/json;
}

上面的配置可以省略,只要返回这个文件就可以,至于反回的头格式(header),苹果并不关心

验证文件格式

  1. 可以使用 https://yurl.chayev.com/ios-results验证配置的文件是否有效。

  2. 需要注意的是,配置文件一旦发生变更,并不是立即生效,apple CDN有缓存,可能长达1小时以上。

  3. 经过测试,国内CDN节点要比国外慢,如果需要快速验证唤起微信,可以挂VPN,使用海外节点,从而更快刷新CDN缓存。

  4. 手动验证CDN是否刷新,访问网址,https://app-site-association.cdn-apple.com/a/v1/{domain},将{domain}替换为自己的域名,查看返回内容是否生效。

  5. App团队发生变化,如迁移Appstore所属开发者主体,需要更新apple-app-site-association 文件。

  6. 另外,迁移过程中,为了兼容原有应用,app-site-association文件中应该保留原应用的配置信息,追加新应用配置。

参考资料

  1. https://juejin.cn/post/7254809601873690681
  2. https://yurl.chayev.com/ios-results

Flutter 开始支持App扩展

Flutter从3.16开始,支持在应用扩展中使用Flutter,具体操作可以参考官方文档。

注意事项

配置

  1. App extension 与原App是两个独立的项目/进程,无法直接相互调用,代码也不共享

  2. 如果需要共享资源,如存储等,需要配置 App Group,否则不需要

  3. 开发过程中使用的是debug/profile版的Flutter.xcframework,发布时需要手动更改导入的库,改为导入release版的Flutter.xcframework.
    profile/release版通过目录 /bin/cache/artifacts/engine/ios/extension_safe 逐级向上查找,可以找到profile或release相关字样的目录

  4. 不同类型的extension内存有限制,模拟器中没有限制。Flutter需要比较多的内存,所以文档中指出,只能在“内存限制不低于100M”的扩展类型中使用Flutter,例如 share extensions
    限制120M,可以使用Flutter;keyboard extension 内存限制为40M,故不可以使用Flutter。

参考资料

  1. https://flutter.cn/docs/platform-integration/ios/app-extensions

  2. [尝试Flutter开发custom keyboard](https://github.com/zacksleo/flutter-ios-custom-keyboard-extension) 仅能在模拟器运行,真机因内存限制无法运行

2008年,中本聪首次提出了比特币的设想,这打开了去中心化的大门。

比特币白皮书清晰的描述了去中心化支付的解决方案,并分别从以下几个方面阐述了他的理念:

一、由转账双方点对点的通讯,而不通过中心化的第三方,这彻底了解决了信任危机。通过用户签名,保证了信息的所有权,其他人无法更改。

  1. 互联网经过几十年的飞速发展,我们所使用的服务都倾向于集中化发展。这种中性化在给我们带来便利的同时,也带来了巨大的信任危机,这些巨头在尽其所能的采集用户数据和行为,而用户则表现出越来越抗拒,不信任。用户信息泄露,大数据杀熟,用户隐私被侵犯… 种种问题层出不穷,用户与大企业也在某种程度上站在了对立面。要解决这些问题,单单依靠反垄断或者政府司法机关的强力措施,是远不够的。
  2. 所以,我们需要一种从根本上,保证用户可以亲自掌控自己的数据,控制它如何被合理的使用、读取甚至被销毁的无上权利。
  3. 区块链去中心化和签名的思想,给了普通人这样的权利,我们不再依赖巨头也可以使用互联网服务,而这些服务由区块链上的节点提供,由每一个人提供。

二、作恶的代价

  1. 在区块链中,作恶的代价是巨大的。在工作量证明中,任何破坏者只能让 CPU白白浪费算力,而失去了获得奖励的机会,这会使得他们支付巨额的电费账单。
  2. 在共识机制中,大家总会承认最长的链,而忽略较短的链。破坏者如果想要篡改账本,需要进行大量的哈希计算,以求得符合条件的 nonce值,在这个漫长过程中,新的合法区块早已产生,最终他篡改的内容会被大家拒绝。
  3. 与其浪费时间篡改,不如按游戏规则挖矿,这样反而带来可观的收益。而这正是比特币先进独到的地方。

三、双重支付

  1. 比特币通过回溯未花费交易(UTXO)来验证合法性,保证用户花费的财产拥有合法的依据
  2. 同时,在等到第6个区块后再进行链的确认,双重支付的概率也降到了最低

四、互联网向左,区块链向右

  1. 作为区块链的开山鼻祖,比特币未我们带来了一个崭新的世界。一个点对点的世界, Web 3.0的世界。这个世界更加平等和民主,彼此的联系更加紧密,社区自治理念更加深入人心。
  2. 区块链使得去中心化的理念更加深入人心,互联网过度中化的治理方式也得以矫正,我们迎来一个更加美好的未来…

参考资料

问题缘由

在微信小程序开发中,先要在本地使用微信开发者工具进行调试,如果需要在线测试,则需要将编译好的代码上传。
目前,只能通过微信开发者工具手动点击上传,而该过程无法与持续集成/持续部署结合在一起,本文就是为了解决能够实现自动化和持续部署的难题

实现原理

微信 miniprogram-ci 库,提供了命令行调用方式,其中就包括上传的命令,我们可以通过脚本实现自动化集成

步骤

安装并配置 GitLab Runner

这部分文档在 Install GitLab Runner on macOS

安装

首先需要在本机上安装 GitLab Runner, 由于微信开发者工具只提供了 mac 和 windows 版本,所以目前只能在这两种系统上实现持续集成,本文讲述在 mac 的具体实现, windows 上的实现与此类似,只是相关命令和路径需要做些变更

注册 GitLab Runner

1
2
gitlab-runner register

编写 .gitlab-ci.yml

在此之前,你需要对GitLab-CI有一定的掌握,这部分资料参考下方的相关文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
image: node:alpine

before_script:
- export APP_ENV=testing
- yarn config set registry 'https://registry.npm.taobao.org'
stages:
- build
- deploy

variables:
NPM_CONFIG_CACHE: "/cache/npm"
YARN_CACHE_FOLDER: "/cache/yarn"
DOCKER_DRIVER: overlay2
build-package:
stage: build
dependencies: []
cache:
key: "$CI_COMMIT_REF_NAME"
policy: pull
paths:
- node_modules
script:
- if [ ! -d "node_modules" ]; then
- yarn install --cache-folder /cache/yarn
- fi
- yarn build
- cp deploy/project.config.json ./dist/project.config.json
artifacts:
name: "wxpkg-dlkhgl-$CI_COMMIT_TAG"
untracked: false
paths:
- dist
only:
- tags
tags:
- docker
release:
stage: deploy
before_script: []
dependencies:
- build-package
variables:
GIT_STRATEGY: none
script:
- yarn global add miniprogram-ci
- if [[ -z "$CI_COMMIT_TAG" ]];then
#- CI_COMMIT_TAG=$CI_COMMIT_REF_NAME
- CI_COMMIT_TAG="测试版:$(date '+%Y-%m-%d')"
- fi
- COMMIT_MESSAGE=`cat ./dist/release.txt`
- rm -f ./dist/release.txt
# 将单行格式转为多行格式
- LF=$'\\\x0A'
- echo $UPLOAD_PRIVATE_KEY | sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&${LF}/" -e "s/-----END RSA PRIVATE KEY-----/${LF}&${LF}/" | sed -e "s/[^[:blank:]]\{64\}/&${LF}/g" > private.key
- miniprogram-ci upload --project-path=$PWD/dist --appid=$APP_ID --upload-version=$CI_COMMIT_TAG --private-key-path=$PWD/private.key --upload-description="$COMMIT_MESSAGE"
environment:
name: production
url: https://mp.weixin.qq.com/wxamp/wacodepage/getcodepage
only:
- tags
- master

注意,在设置-CI/CD-变量中,需要添加两个变量:

APP_ID 小程序 appid

UPLOAD_PRIVATE_KEY 小程序代码上传密钥, 需要在小程序后台获取

由于配置的密钥,在运行时过去到是单行文本形式,需要转换为多行原始格式,并输出到文件,以便上传使用

于是使用一下命令- LF=$'\\\x0A' - echo $UPLOAD_PRIVATE_KEY | sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&${LF}/" -e "s/-----END RSA PRIVATE KEY-----/${LF}&${LF}/" | sed -e "s/[^[:blank:]]\{64\}/&${LF}/g" > private.key

相关文档

0%