Posts

Quit docker-desktop

wsl --shutdown

Export Docker Desktop data

wsl --export docker-desktop-data D:\data.tar
wsl --unregister docker-desktop-data

Import the exported data to your desired location

wsl --import docker-desktop-data D:\wsl\docker-desktop-data  d:\data.tar --version 2

restart docker-desktop

λ wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu2                Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2

每隔几年 ,我总要把《明朝那些事儿》最后一章拿来读读,给自己的人生纠偏,而唯一的准星,就是自己本心。最后一章内容如下: “其实历史和小说不一样,因为历史的答案,所有人都知道,崇祯同志终究是要死的,而且肯定是吊死,他不会撞墙,不会抹脖子,不会喝敌敌畏,总而言之,我不说,你们都知道。 所以结局应该是固定的,没有支线。 但是,我的结局,并不是这个。换句话说,我的文章,有两个结局,这只是第一个。 我读了十五年历史,尊重历史,所以这篇文章从头至尾,不能说无一字无来历,但大多数,都是有出处的。我不敢瞎编。 所以第二个结局,也是真实的,只不过比较奇特,它一直在我的脑海里,最后,我决定把这个比较奇特的结局写出来。 第二个结局徐宏祖出生的时候,是万历十五年。 在这个特定的年龄出生,真是缘分,但外面的世界,跟徐宏祖并没有多大关系,他的老家在江阴,山清水秀,不用搞政治,也不怕被人砍,比较清净。 当然,清净归清净,在那年头,要想出人头地,青史留名,只有一条路——考试(似乎今天也是)。 徐宏祖不想考试,不想出人头地,不想青史留名,他只想玩。 按史籍说,是从小就玩,且玩得比较狠,比较特别,不扔沙包,不滚铁环,只是四处瞎转悠,遇到山就爬,遇到河就下,人极小,胆子极大。 此外,他极其讨厌考试,长大后,让他去考科举,死都不去。该情节,放在现在,大致相当于抗拒高考。 这号人,当年跟今天的下场,估计是差不多,被拉回家打一半死不活,绝无幸免。 然而徐宏祖的父母没有打他,非但没有打他,还告诉他,你要想玩,就玩吧,做自己喜欢做的事情就行。 这种看似惊世骇俗的思想,似乎很不合理,但对徐家人而言,很合理。 对了,应该介绍一下徐宏祖同志的家世,虽然他的父母,并非什么大人物,也没名气,但他有一位祖先,还算是很有名的,当然,不是好名。 在徐宏祖出生前九十年,徐家的一位先辈进京赶考,路上遇到了一位同伴,叫做唐寅,又叫唐伯虎。 没错,他就是徐经。 后来的事情,之前讲过,据说是徐经作弊,结果拉上了唐伯虎,大家一起完蛋,进士没考上,连举人都没了,所以徐经同志痛定思痛,对坑害了无数人(主要是他)的科举制度深恶痛绝,教育子孙,要与这个万恶的制度决裂,爱考不考,去他娘的。 对这段百年恩怨,徐宏祖是否了解,不清楚,但他会用,那是肯定的。更重要的是,徐家虽说没有级别,还有点钱,所以他决定,索性不考了,出去旅游。 刚开始,他旅游的范围,主要是江浙一带,比如紫金山、太湖、普陀山等等。后来愈发勇猛,又去了雁荡山、九华山、黄山、武夷山、庐山等等。 但这里,存在着一个问题——钱。 旅行家和大侠的区别在于,旅行家是要花钱的,列一下,大致包括以下费用:交通费、住宿费、导游费、餐饮费、门票费,如果地方不地道,还有个挨宰费。 我说过,徐家是有钱的,但只是有点钱,没有很多钱,大约也就是个中产阶级。按今天的标准,一年去旅游一次,也就够了,但徐宏祖的旅行日程是:一年休息一次。 他除了年底回家照顾父母外,一年到头都在外面,但就这么个搞法,他家竟然还过得去。 原因很简单,比如交通费,他不坐火车、也不坐汽车(想坐也没),少数骑马,多靠步行(骑马爬山试试)。 住宿费,基本不需要,徐宏祖去的地方,当年大都没有人去,别说三星级,连孙二娘的黑店都没有,树林里、悬崖上,打个地铺,也就睡了。 餐饮费,也没有,我考察过,徐宏祖同志去的地方,也没什么餐馆,每次他出发的时候,都是带着干粮,而且他很扛饿,据说能扛七八天,至于喝水,山里面,那都是矿泉水。 门票费也是不用了,当年谁要能在徐宏祖同志去的地方,设个点收门票,那只能说明,他比徐宏祖还牛,该收。 挨宰费是没有的,但挨宰是可能的,且比较敞亮,从没有暗地加价坑钱,都是拿刀,明着来抢。要知道,没门票的地方,固然没有奸商,却很可能有强盗。 据本人考证,徐宏祖最大的花销,是导游费用。作为一个旅行家,徐宏祖很清楚,什么都能省,这笔钱是不能省的,否则走到半山腰,给你挖个坑,让你钻个洞,那就休息了。 就这样,家境并不十分富裕的徐宏祖,穿着俭朴的衣服,没有随从,没有护卫,带着干粮,独自前往名山大川,风餐露宿,不怕吃苦,不怕挨饿,一年只回一次家,只为攀登。 从俗世的角度,徐宏祖是个怪人,这人不考功名,不求做官,不成家立业,按很多人的说法,是毁了。 我知道,很多人还会说,这种生活荒谬,是不符合常规的,是不正常的,是缺根弦的,是精神有问题的。 我认为,说这些话的人,是吃饱了,撑的,人只活一辈子,如何生活,都是自己的事,自己这辈子浑浑噩噩地没活好,厚着脸皮还来指责别人,有多远,就去滚多远。 徐宏祖旅行的唯一阻力,是他的父母。他的父亲去世较早,只剩他的母亲无人照料。圣人曾经教导我们:父母在,不远游。 所以在出发前,徐宏祖总是很犹豫,然而他的母亲找到他,对他说了这样一番话:“男儿志在四方,当往天地间一展胸怀!” 就这样,徐宏祖开始了他伟大的历程。 他二十岁离家,穿着布衣,没有政府支持,没有朋友帮助,独自一人,游历天下二十余年,他去过的地方,包括湖广、四川、辽东、西北,简单地说,全国十三省,全部走遍。 他爬过的山,包括泰山、华山、衡山、嵩山、终南山、峨眉山,简单地说,你听过的,他都去过,你没听过的,他也去过。 此外,黄河、长江、洞庭湖、鄱阳湖,金沙江、汉江,几乎所有江河湖泊,全部游历。 在游历的过程中,他曾三次遭遇强盗,被劫去财物,身负刀伤,还由于走进大山,无法找到出路,数次断粮,几乎饿死。最悬的一次,是在西南。 当时,他前往云贵一带,结果走到半路,突然发现交通中断,住处被当地土著围,过了几天,外面又来了明军,又开始围,围了几天,就开始打,打了几天,就开始乱。徐宏祖好歹是见过世面的,跑得快,总算顺利脱身。 在旅行的过程中,他还开始记笔记,每天的经历,他都详细记录下来,鉴于他本人除姓名外,还有个号,叫做霞客,所以后来,他的这本笔记,就被称为《徐霞客游记》。 崇祯九年(1636),五十岁的徐宏祖决定,再次出游,这也是他的最后一次出游,虽然他自己没有想到。 正当他考虑出游方向的时候,一个和尚找到了他。 这个和尚的法号,叫做静闻,家住南京,他十分虔诚,非常崇敬鸡足山迦叶寺的菩萨,还曾刺破手指,血写过一本法华经。 鸡足山在云南。 当时的云南鸡足山,算是蛮荒之地,啥也不通,要去,只能走着去。 很明显,静闻是个明白人,他知道自己要一个人去,估计到半路就歇了,必须找一个同伴。 徐宏祖的名气,在当时已经很大了,所以他专门找上门来,要跟他一起走。 对徐宏祖而言,去哪里,倒是个无所谓的事,就答应了他,两个人一起出发了。 他们的路线是这样的,先从南直隶出发,过湖广,到广西,进入四川,最后到达云贵。 不用到达云贵,因为到湖广,就出事了。 走到湖广湘江(今湖南),没法走了,两人坐船准备渡江。 渡到一半,遇上了强盗。 对徐宏祖而言,从事这种职业的人,他已经遇到好几次了,但静闻大师,应该是第一次。此后的具体细节不太清楚,反正徐宏祖赶跑了强盗,但静闻在这场风波中受了伤,加上他的体质较弱,刚撑到广西,就圆寂了。 徐宏祖停了下来,办理静闻的后事。 由于路上遭遇强盗,此时,徐宏祖的路费已经不足了,如果继续往前走,后果难以预料。 所以当地人劝他,放弃前进念头,回家。 徐宏祖跟静闻,是素不相识的,说到底,也就是个伴,各有各的想法,静闻没打算写游记,徐宏祖也没打算去礼佛,实在没有什么交情。而且我还查过,他此前去过鸡足山,这次旅行对他而言,并没有太大的意义。 然而他说,我要继续前进,去鸡足山。 当地人问:为什么要去。 徐宏祖答:我答应了他,要带他去鸡足山。 可是,他已经去世了。 我带着他的骨灰去。答应他的事情,我要帮他做到。 徐宏祖出发了,为了一个逝去者的愿望,为了实现自己的承诺,虽然这个逝去者,他并不熟悉。 旅程很艰苦,没有路费的徐宏祖背着静闻的骨灰,没有任何资助,他只能住在荒野,靠野菜干粮充饥,为了能够继续前行,他还当掉了自己所能当掉的东西,只是为了一个承诺。 就这样,他按照原定路线,带着静闻,翻阅了广西十万大山,然后进入四川,越过峨眉山,沿着岷江,到达甘孜松潘。

START PG

version: '2'

services:
  postgresql:
    container_name: pg
    image: postgres:12
    ports:
      - '5432:5432'
    volumes:
      - 'postgresql_data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_PASSWORD=!Qsx4rgb'
      - 'PGDATA=/var/lib/postgresql/data/pgdata'

  # adminer:
  #   image: adminer
  #   restart: always
  #   ports:
  #     - 8080:8080

volumes:
  postgresql_data:
    driver: local

安装pgcli

sudo apt install libpq-dev
pip install -U pgcli
export PATH=$PATH:/home/ubuntu/.local/bin
pgcli -U postgres -h localhost

更改配置

postgres@localhost> alter system set autovacuum = off;
postgres@localhost> SELECT pg_reload_conf();
postgres@localhost> show autovacuum;

因为禁用了下列服务:

Application Information Appinfo

导致无法打开系统高级设置,SERVICES.MSC

https://www.elevenforum.com/t/restore-default-services-in-windows-11.3109/

CAN消息总线格式 DBC格式 BO_ 500 IO_DEBUG: 4 IO SG_ IO_DEBUG_test_unsigned : 0|8@1+ (1,0) [0|0] "" DBG 说明: The message name is IO_DEBUG and MID is 500 (decimal), and the length is 4 bytes (though we only need 1 for 8-bit signal) The sender is IO 0|8: The unsigned signal starts at bit position 0, and the size of this signal is 8 (1,0): The scale and offset (discussed later) [0|0]: Min and Max is not defined (discussed later) ””: There are no units (it could be, for instance “inches”) @1+: Defines that the signal is little-endian, and unsigned: Never change this!

three main use cases for metadata repositories: Finding data assets For example, a data architect may want to know which tables in which databases contain a Customer_ID. Tracking lineage (provenance) Many regulations require enterprises to document the lineage of data assets—in other words, where the data for those assets came from and how it was generated or transformed. Impact analysis If developers are making changes in a complex ecosystem, there is always a dan‐ ger of breaking something.

启动EDGEX核心服务 使用容器主机网络 wget https://raw.githubusercontent.com/edgexfoundry/edgex-compose/jakarta/docker-compose-no-secty.yml 在开发环境使用host网络,便于核心服务和各种设备能在同一个子网,替换 networks: edgex-network: {} 为 network_mode: host CONSUL 配置CONSUL绑定到指定以太网卡 environment: CONSUL_BIND_INTERFACE: ens3 配置DNS /etc/hosts 10.166.44.182 edgex-core-consul 10.166.44.182 edgex-core-command 10.166.44.182 edgex-redis 10.166.44.182 edgex-core-metadata 10.166.44.182 edgex-core-data 10.166.44.182 edgex-support-notifications 10.166.44.182 edgex-support-scheduler 10.166.44.182 edgex-ui-go 10.166.44.182 edgex-kuiper 10.166.44.182 edgex-app-rules-engine 启动核心服务 docker-compose -f docker-compose-no-secty.yml up -d 检查核心服务启动正常 docker logs -f edgex-core-command edgex-core-data edgex-core-metadata 在本地启动设备服务 git clone [email protected]:edgexfoundry/device-camera-go.git 修改cmd\res\configuration.toml 注册服务,消息队列,核心服务的所在的主机配置 [Registry] Type = "consul" Host = "10.

加载设备配置文件 device-sdk-go: service.init.go: driver.Initialize initializeOnvifClient onvif4go.NewOnvifDevice.Initialize() provision.LoadProfiles(ds.config.Device.ProfilesDir, dic) provision.LoadDevices 驱动服务客户端初始化与核心数据和命令服务 clients.BootstrapHandler -> InitDependencyClients // InitDependencyClients triggers Service Client Initializer to establish connection to Metadata and Core Data Services // through Metadata Client and Core Data Client. // Service Client Initializer also needs to check the service status of Metadata and Core Data Services, // because they are important dependencies of Device Service. // The initialization process should be pending until Metadata Service and Core Data Service are both available.

搭建EDGEX设备服务开发环境 EDGEX简介 EdgeX Foundry 项目成立于2017年,由Linux 基金会主持,目前已经拥有75个会员, 包括重量级的SAMSUNG,Dell,AMD,ANALOG DEVICES … 但其中最重要的角色其实是戴尔。它为EdgeX Foundry提供该公司采用Apache 2.0许可证的FUSE源代码。FUSE包括10多种微服务和12500多万行代码,它们在连接标准、边缘分析、安全、系统管理和服务之间提供了互操作性。FUSE 是Dell 为了拓展边缘计算物联网服务而发展出来的,基于Java SPRING CLOUD 的微服务框架软件。这套软件最大的特征是中立于任何硬件平台和操作系统,高度模块化,可自由扩展。Dell 从私有化完成的那天开始,我们见到它一系列的并购,其中并购VMware,EMC 等动作,都直接剑指云计算和物联网技术。FUSE 的发布,更昭示了Dell谋求转型的决心。物联网的繁荣非常地依赖于物联网生态企业,全球大型IT 公司谋求物联网布局,都会提供框架软件,再培养生态伙伴来形成落地应用。而在生态伙伴的培养过程中,开源的基础框架软件是非常容易被理解和吸收的。 这也是Dell 选择跟Linux 基金会合作,并捐赠和完善代码的重要原因:Dell 需要庞大的生态伙伴,而Linux 具有开源软件界强大的号召力和影响力。 EdgeX Foundry原来是用Java写的,导致平台体积庞大,占用资源,后来Linux基金会用Go语言对其进行了重构. EdgeX Foundry是一系列松耦合、开源的微服务集合。该微服务集合构成了四个微服务层及两个增强的基础系统服务,这四个微服务层包含了从物理域数据采集到信息域数据处理等一系列的服务,另外两个基础系统服务为该四个服务层提供支撑服务。 四个微服务层分别是: 设备服务负责采集数据及控制设备功能。 核心服务负责本地存储分析和转发数据,以及控制命令下发。 支持服务负责日志记录、任务调度、数据清理、规则引擎和告警通知。 应用服务/导出服务负责上传数据到云端或第三方信息系统,以及接收控制命令转发给核心服务。 两个增强基础系统服务: 安全服务、管理服务这两个软件模块虽然不直接处理边缘计算的功能性业务,但是对于边缘计算的安全性和易用性来说很重要 启动EDGEX核心服务 wget https://raw.githubusercontent.com/edgexfoundry/edgex-compose/jakarta/docker-compose-no-secty.yml docker-compose -f docker-compose-no-secty.yml up -d 打开数据和控制服务调试开关 在consul里面配置应用: http://localhost:8500/ui/dc1/kv/edgex/appservices/2.0/app-rules-engine/Writable/LogLevel/edit 修改INFO为DEBUG 在IDE里面启动设备服务 以IP摄像头设备服务为例 打开WEBCAM webcam-to-ip-camera 配置开发环境 git clone [email protected]:edgexfoundry/device-camera-go.git git checkout jakarta cd device-camera-go go mod tidy set EDGEX_SECURITY_SECRET_STORE=false 调整IDE的当前工作目录为:device-camera-go\cmd 否则,设备服务启动会找不到设备配置文件。

[1] https://www.asyncapi.com/docs/getting-started/coming-from-openapi

REDIS Redis (Remote Dictionary Server)是一个流行的开源内存 提供高级键值抽象的键值存储。 Redis 是单线程的,它只处理一个命令 客户端在进程的主线程中一次。 不同于传统的KV 键是简单数据类型(通常是字符串)的系统,键 在 Redis 中可以用作复杂的数据类型,例如哈希、列表、 集和排序集。 此外,Redis 支持复杂的原子 对这些数据类型的操作(例如,从 一个列表,将具有给定分数的新值插入排序集等)。 Redis 抽象和高摄取速度已被证明特别重要 对于许多延迟敏感的任务很有用。 因此,Redis 已获得广泛采用,并被越来越多的人使用 生产环境中的公司. Redis 支持高可用性和持久性。 高可用性 是通过将数据从主节点复制到 从节点并同步它们。 当一个主进程失败时,它的 对应的从属进程已准备好接管后续进程 称为故障转移。 持久性可以通过以下任一方式配置 以下两个选项: 使用时间点快照文件 称为 RDB(Redis 数据库) 使用名为AOF(仅附加文件)。 注意这三种机制(AOF重写、RDB 快照和复制)依赖 fork 获取 进程内存的时间点快照并将其序列化 (而主进程继续为客户端命令提供服务) 项目简介 最近在做工业自动化(IIoT)项目,涉及到很多场景需要对一系列设备进行监控和信号处理。 该类场景对实时处理能力,系统稳定性,高可用性,容灾能力等等要求非常高。 其中几个核心的需求: 设备数据不能丢失 实时告警(毫秒级延迟) 设备数据必须优先在边缘节点处理,边缘节点的物理服务器只有两台 每个边缘节点接入的设备上行数据量大概6万点/秒,数据包小于1K 中心需要汇聚和分析所有边缘节点的设备数据 技术现状 实时数据处理 实时数据处理是一个自 1990 年代以来一直在研究的问题 。 产生的数据量增加了,加上越来越复杂的软件解决方案 开发,需要满足这些需求出现了流式应用程序,例如 欺诈检测、网络监控和电子交易依赖于实时数据处理 确保所提供的服务被认为是正确和可靠的。 绝大多数现代应用程序使用某种数据库管理系统 处理数据。当应用程序收集或生成数据时,它会被存储和索引 它可以在以后由应用程序查询。但是,对于具有更严格 的实时数据处理的要求,这不是一个合适的选项,而是流 处理开始发挥作用的地方。流处理在接收数据时直接处理数据。实时流 处理应用程序通常具有必须满足的某些关键要求。有的 输入和处理后的数据输出之间的延迟是实现实时的关键特征 应用。更传统的批处理方法需要以这样的方式收集数据 称为批次,其中处理只能在每个批次的最终数据块完成后开始 到达的。对于实时用例,这导致的延迟是不可接受的,因为这些实时的延迟 流应用程序最好在毫秒内。

虎年新春快乐

Maybe this year, we ought to walk through the rooms of our lives not looking for flaws, but looking for potential—Ellen Goodman

社会价值

个人的价值在于为别人和社会解决问题和提供帮助,在帮助别人的过程 中促进个人成长。读书不是目的,读书只是为大脑提供了输入,产生对 社会有用的输出才是读书的真正目的

思考

思考比行动重要。害怕思考,草率行动是懒惰的表现。思考就是抑制动物的 本性过程,思考是个人成长的最快途径

沟通

理解对方是沟通的前提条件。沟通就是让对方认识到自己提议的价值, 让对方受益。无论沟通的对象是朋友,家人,同事,不要首先想着 如何改变别人,重要的调整自己。

业务和技术

软件解决方案的出发点是解决客户问题。解决问题与技术的先进性与否无关, 很多情况下解决方案取决于公司的组织形式和资源条件。运维成本是大型 软件解决方案最主要的成本。监控的目的在于预防失败。 越早发现问题,解决成本越低。

知识积累

价值与风险是统一的,看待机会既要看到可能的价值,同时认识到风险。 巨大的价值必然伴随着巨大的风险。偶然发现的所谓的价值机会可能只是 一个无知陷阱。知识和财富不仅在于积累更在于传承。财富最重要的是 在于保值。

BUILD

mkdir -p $GOPATH/src/github.com/mailflux
git clone https://github.com/wubigo/mainflux.git
cd github.com/mailflux/mailflux/
make
make dockers_dev
make run

Provision the System

mainflux-cli provision test

GET TOKEN

curl -k https://172.21.53.253/tokens

{
  "email": "[email protected]",
  "password": "12345678"
}

Configure an MQTT Client Agent within the IoT Gateway Plug-In for KEPServerEX to send data to Ali IoT. The connection can be made using MQTT over Transmission Control Protocol (TCP) and MQTT over Transport Layer Security (TLS). set up Kepware KEPServerEX IoT Gateway on Windows to connect with the MQTT bridge of IoT Core to push streaming data to Cloud and send control messages from IoT Core back to KEPServerEX

Data catalogs solve the problem by tagging fields and data sets with consistent business terms and providing a shopping-type interface that allows the users to find data sets by describing what they are looking for using the business terms that they are used to, and to understand the data in those data sets through tags and descriptions that use business terms. Data lakes are the do-it-yourself version of a data warehouse, allowing data engineering teams to pick and choose the various metadata, storage, and compute technologies they want to use depending on the needs of their systems.

多租户的运行 不同的应用运行在同一个集群 相同应用的多个实例运行在同一个集群 敏感数据应用独享实例,非敏感数据共享实例 hybrid architectures are also possible, such as a SaaS provider using a combination of per-customer workloads for sensitive data, combined with multi-tenant shared services. 隔离方式 控制面隔离机制 名字空间 访问控制 资源配额 数据面隔离机制 网络隔离 Pod-to-pod communication can be controlled using Network Policies, which restrict communication between pods using namespace labels or IP address ranges. In a multi-tenant environment where strict network isolation between tenants is required, starting with a default policy that denies communication between pods is recommended with another rule that allows all pods to query the DNS server for name resolution

配置

’.azure/config`

[defaults]
location = westus

[cloud]
name = AzureCloud

[core]
output = table
az config set defaults.location=westus2 defaults.group=MyResourceGroup

az v2不支持config,直接修改配置文件

AZURE REGION az account list-locations --query "sort_by([].{DisplayName:displayName, Name:name}, &DisplayName)" --output table 创建函数APP #!/bin/bash # Function app and storage account names must be unique. storageName=mystorageaccount$RANDOM functionAppName=myserverlessfunc$RANDOM region=westeurope # Create a resource group. az group create --name myResourceGroup --location $region # Create an Azure storage account in the resource group. az storage account create \ --name $storageName \ --location $region \ --resource-group myResourceGroup \ --sku Standard_LRS # Create a serverless function app in the resource group.