首页 文章 精选 留言 我的

精选列表

搜索[搭建],共10000篇文章
优秀的个人博客,低调大师

OpenSPG 新版发布:新增大模型知识抽取,3 步快速搭建专属知识图谱

随着 ChatGPT 的横空出世,大模型已然成为人工智能领域的焦点。大模型在语言理解、对话生成方面表现得尤其亮眼,而知识图谱则擅长大模型所无法解决的事实性 “幻觉” 和复杂推理问题。将知识图谱和大语言模型结合起来,充分发挥各自的优势,能为用户提供更优质的人工智能服务和产品。 去年 10 月 26 日,OpenSPG 正式开源,希望和社区一起共同推动知识图谱技术的发展和大模型 + 知识图谱双驱技术的落地应用。今年 1 月 10 日,OpenSPG 发布了 0.0.2 版本,旨在帮助用户进一步降低知识图谱的使用门槛,并通过神经网络框架 NN4K,为 OpenSPG 接入简单易用、模式统一的大模型服务。 GitHub:https://github.com/OpenSPG/openspg,欢迎大家Star关注~ 下面将为大家一一介绍这些最新功能: 亮点一览 镜像版支持一键安装部署,只需 2 行命令即可完成 OpenSPG 服务端和客户端部署; 发布知识建模最佳实践指导原则,只需记住 7 个原则就可以搞定 SPG 图谱建模,无需理解复杂的图谱术语; 基于 KNext 可编程框架,用户只需 3 个步骤即可完成知识构建,Schema 面向对象建模、开发知识构建算子以及编排 BuilderChain,快速完成单图谱构建; 基于 NN4K 支持大模型知识抽取,提供完整的 LLM SFT、SPG Based AutoPrompt 和 LLM Invoker 完整链路,并内置 GPT 链路; 开源逻辑规则推理 Reasoner,可体验完备的逻辑规则与基础事实融合的全新知识推理引擎。 更新 1:2 条命令搞定安装部署 OpenSPG 0.0.2 开始支持镜像版一键安装部署,用户只需要运行 2 条 Docker 命令就可以完成部署。 OpenSPG 将整个应用分为客户端和服务端,客户端包含 KNext 框架,Builder 和 Reasoner 引擎,服务端包含 Schema 服务,TuGraph 图存储引擎,ElasticSearch 搜索引擎。客户端和服务端分别提供 Docker 镜像的快速部署。 👉了解详情:https://spg.openkg.cn/tutorial/installation/installation 更新 2:7 个原则搞定 Schema 建模 为了帮助大家更好地理解和应用 SPG 构建知识图谱,我们从 SPG 建模的最佳实践中总结出 7 个原则,发布在OpenSPG 0.0.2 的用户文档中,并且每个原则都搭配了相关示例进行说明。用户只需要了解这 7 个原则,就能够搞定知识图谱的 Schema 建模。 👉了解详情: https://spg.openkg.cn/introduction/schema https://spg.openkg.cn/tutorial/schema/best_practice 更新 3:升级 KNext 可编程框架,3 个步骤实现知识构建 KNext 框架定义了 Chain,Component,Operator 等抽象模型,用户可以基于这些模型快速构建和使用图谱。 Component 定义图谱组件化能力,比如知识抽取,知识映射,知识推理等。Chain 将这些组件化能力串连完成图谱构建或者推理等流程。Operator 定义了 4 类算子,包含知识抽取、实体链指、关系预测、知识融合,用户可以自定义这些算子完成知识图谱构建过程中的复杂处理。每个任务只需要关注单类型要素及一跳出边的构建,系统会自动完成复杂子图的组装和构造,将图谱构建成本降到更低。 👉了解详情:https://spg.openkg.cn/introduction/knext 更新 4:基于NN4K 的大模型知识抽取 ChatGPT 在多种任务中表现出的智能令人印象深刻,使用 ChatGPT 和其他大语言模型增强知识图谱,可使知识图谱的构建过程更加准确和自动化,为此我们抽象了适合知识图谱的神经网络框架 NN4K。 NN4K 是一个神经网络模型的开发、管理、服务框架,为 OpenSPG 提供简单易用、模式统一的大模型服务。此次发布我们实现了在知识图谱构建过程中,调用大语言模型技术帮助构建图谱。与 OpenAI API 兼容的大语言模型服务,可通过修改配置方便接入;与 OpenAI API 不兼容的大语言模型服务,用户可通过开发自定义 NNInvoker 的方式接入。 👉了解详情:https://spg.openkg.cn/tutorial/knext/nn4k 更新 5:开源规则推理Reasoner 规则推理是知识图谱非常重要的一部分,将图谱的事实知识抽象并关联到具有实际的商业价值的逻辑知识。在 OpenSPG 0.0.2 中开源了完整的 Reasoner 能力,包括语法解析,执行计划,推理执行引擎。同时执行引擎侧定义 RDG 引擎扩展层,允许用户将推理能力迁移到自有图计算引擎。 👉了解详情:https://spg.openkg.cn/introduction/reasoner 作为 2024 年的第一个版本,OpenSPG 在提高易用性,以及和大模型技术结合上迈出了第一步。2024 年我们将持续持续深化 SPG 与 LLM 双向驱动的技术范式,开源新一代知识引擎完整技术栈。在这个过程中,持续提升 SPG 的语义表达能力,提升易用性降低使用门槛,发布更多开箱即用的工具包、案例最佳实践、教学案例视频等。也期待社区同仁一起加入共建新一代 AI 引擎框架。

优秀的个人博客,低调大师

使用MASA全家桶从零开始搭建IoT平台(三)管理设备的连接状态

前言 获取一个设备的在线和离线状态,是一个很关键的功能。我们对设备下发的控制指令,设备处于在线状态才能及时给我们反馈。这里的在线和离线,我们可以简单的理解为设备与MQTT的连接状态。 分析 我们打电话的时候经常能听到:"您拨打的用户已关机“和”用户不在服务区或暂时无法接通“,这两种的区别是什么? 1、当用户开机时,会自动向最近的移动基站注册,基站标记该用户为"attach"(在线)状态。 2、当用户关机时,手机会发起datach流程,告知基站自己关机了,基站标记该用户为"detach"(离线)状态。这样再次拨打就可以节省寻呼资源,直接提示用户关机。 3、当用户忽然进入无网络的环境,或者手机故障,导致来不及发起datach流程,基站还认为用户"在线",当有人拨打用户号码时,基站测会对用户进行寻呼,但是超时得不到回应后,就会提示"不在服务区"或者"暂时无法接通" 的语音。 其实这个方案在IoT上也是可行的,我们可以让设备在线和离线的过程中向特定Topic发送状态消息,但是存在问题,我们需要一个单独的Broker去订阅这个Topic,但是这个单独的Broker很容易成为单点故障点。而且如果设备数量很大,这种意外离线的设备也很难及时发现,需要下发指令后等待设备响应超时才能发现。 方案1:遗嘱消息 MQTT 遗嘱消息可以在客户端意外断线时将“遗嘱”优雅地发送给第三方订阅者,以实现离线通知、设备状态更新等业务。其中意外断线指客户端断开前未向服务器发送 DISCONNECT 消息,比如: 因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭 设备意外掉电 设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等 遗嘱消息在 MQTT 客户端向服务器端 CONNECT 请求时设置,可选属性包括是否发送遗嘱消息 (Will Message)标志,和遗嘱消息主题 (Topic) 与内容(Payload) 以及 Properties。 值得一提的,遗嘱消息发布的时间可能会有延迟:通常意外断线时,服务器无法立即检测到断线行为,需要通过连接保活心跳机制并经过一定周期后才会触发;MQTT 5.0 提供的遗嘱延迟间隔(Will Delay Interval)属性也会影响发布时间。 演示遗嘱消息的使用 我们使用A、B两台电脑使用MQTT X来演示。 我们在A电脑的 MQTT X 中新建一个名为 Test 的连接,Host 修改为 修改为我们的MQTT地址(192.120.5.204),并输入账号密码,在 Advanced 部分选择 MQTT Version 为 5.0,并且将 Session Expiry Interval 设置为 10,确保会话不会在遗嘱消息发布前过期。 然后在 Lass Will and Testament 部分将 Last-Will Topic 设置为 offline,Last-Will Payload 设置为 I'm offline,Will Delay Interval (s) 设置为 5。 完成以上设置后,我们点击右上角的 Connect 按钮以建立连接。 我们在B电脑的MQTTX中新建一个连接Sub,mqtt地址同样指向我们的mqtt服务器(192.120.5.204) 并订阅offline主题 我们用任务管理器直接结束A电脑的MQTTX进程,这是连接会被直接断开,模拟了设备断电的场景,在5s之后,在B电脑的MQTTX订阅中收到了一条内容为 I‘m offline 的遗嘱消息。 实施流程 1、设备遗嘱消息内容设置为offline,该遗嘱主题与一个普通发送状态的主题设定成同一个 {设备名称}/status。例如 284202304230001/status 2、当设备连接时,向主题 {设备名称}/status 发送内容为 online 的Retained消息,其它客户端订阅主题 {设备名称}/status 的时候,将获取到 Retained 消息为 online。 保留消息(Retain ) MQTT 服务端收到 Retain 标志为 1 的 PUBLISH 报文时,会将该报文视为保留消息,除了被正常转发以外, 保留消息会被存储在服务端,每个主题下只能存在一份保留消息,因此如果已经存在相同主题的保留消息,则该保留消息被替换。 当客户端建立订阅时,如果服务端存在主题匹配的保留消息,则这些保留消息将被立即发送给该客户端。 借助保留消息,新的订阅者能够立即获取最近的状态,而不需要等待无法预期的时间,这在很多场景下是非常重要的。 EMQX 默认开启保留消息的能力和服务,可以在 etc/emqx.conf 中修改 mqtt.retain_available 为 false 来关闭保留消息的能力, 这样客户端将被禁止发送 Retain 标志为 1 的 PUBLISH 报文,否则,客户端将会收到原因码为 0x9A(不支持保留消息)的 DISCONNECT 报文。 保留消息的服务会存储和管理客户端发送的保留消息,并发送给相应的订阅者。 3、当客户端异常断开时,系统自动向主题 {设备名称}/status 发送内容为 offline 的消息,其它订阅了此主题的客户端会马上收到 offline 消息;如果遗嘱消息设置了 Will Retain,那么此时如果有新的订阅 A/status 主题的客户端上线,也将获取到内容为 offline 的遗嘱消息。 方案2:使用WebHook 方案1需要设备主动设置遗嘱消息才能实现,那么有没有更简单的方式,直接通过设备与Mqtt的连接事件来获取连接状态呢。 EMQX 设计了一套WebHook系统,可以通过这个自带的WebHook系统获取内部的事件并进行处理。WebHook的原理很简单,当设备与mqtt建立连接或者断开连接时,EMQX会把事件的信息通过我们的配置调用特定的URL上的接口,实现通知。 使用WebHook还可以有限避免单点故障。所以本项目会采用WebHook的方式来实现对设备在线和离线的管理。 开启WebHook 在数据集成 -> 数据桥接 中创建一个Webhook 名称设置为ConnectedEvent,URL 中填写我们的Webhook地址,也就是触发事件之后的调用接口地址,这里我们填: http://192.120.5.204:5000/api/Device/ConnectedEvent 请求方式为Post,其他内容保持默认不变 这里注意URL可以通过${field}的方式拼接,请求体也可以自己指定,如果留空会原样转发消息,我们这里请求体留空 设备在线和离线的事件转发的消息格式如下 { "username": "284202304230001", "timestamp": 1682652598840, "sockname": "172.17.0.5:1883", "receive_maximum": 32, "proto_ver": 5, "proto_name": "MQTT", "peername": "172.17.0.1:48524", "node": "emqx@172.17.0.5", "mountpoint": "undefined", "metadata": { "rule_id": "rule_3hsx" }, "keepalive": 60, "is_bridge": false, "expiry_interval": 10, "event": "client.connected", "connected_at": 1682652598840, "conn_props": { "User-Property": {}, "Session-Expiry-Interval": 10 }, "clientid": "mqttx_c4491df0", "clean_start": false } 我们点击 创建 ,并继续点击 创建规则 我们在创建规则中指定新的规则名称 rule_client_connected,并在SQL编辑器复制以下内容 SELECT * FROM "$events/client_connected", "$events/client_disconnected" 在右侧的事件中,我们可以看到所有可用的事件,我们选择了连接和断开两个事件,在这两个事件触发时会通过Webhook调用我们配置的接口,这样我们就能获取到设备的在线、离线状态了。 我们点击 创建按钮 完成规则的创建 我们可以看见我们创建好的规则 点击规则ID,还可以看到统计数据 在FLows中还可以看到整个工作流程 演示Webhook 我们使用MQTTX模拟一次设备连接和断开动作,可以在规则统计界面看到我们的操作已经被记录。 编写代码 我们这里采用方案2。 我们需要实现之前配置的ConnectedEvent接口 /// <summary> /// 连接事件请求 /// </summary> public class ConnectedEventRequest { /// <summary> /// 设备名称 /// </summary> public string Username { get; set; } /// <summary> /// 时间戳 /// </summary> public long Timestamp { get; set; } /// <summary> /// 事件(连接/断开) /// </summary> public string Event { get; set; } /// <summary> /// 连接时间(断开事件中为0) /// </summary> public long Connected_at { get; set; } /// <summary> /// Client ID /// </summary> public string Clientid { get; set; } } /// <summary> /// 更新设备在线状态 /// </summary> /// <param name="deviceName"></param> /// <param name="onlineStatus"></param> /// <returns></returns> public async Task UpdateDeviceOnlineStatusAsync(string deviceName, OnLineStates onlineStatus) { var device = await _ioTDbContext.IoTDeviceInfo.Include(o => o.IoTDeviceExtend).AsNoTracking() .FirstOrDefaultAsync(o => o.DeviceName == deviceName); if (device == null) { return; } else { if (device.IoTDeviceExtend == null) //扩展表为空 { device.IoTDeviceExtend = new IoTDeviceExtend { DeviceInfoId = device.Id, OnLineStates = (int)onlineStatus, }; _ioTDbContext.Attach(device.IoTDeviceExtend); _ioTDbContext.Entry(device.IoTDeviceExtend).State = EntityState.Added; _ioTDbContext.Entry(device.IoTDeviceExtend).Property(o => o.OnLineStates).IsModified = true; await _ioTDbContext.SaveChangesAsync(); } if (device.IoTDeviceExtend.OnLineStates != (int)onlineStatus) //在线状态不一致 { device.IoTDeviceExtend.OnLineStates = (int)onlineStatus; _ioTDbContext.Attach(device.IoTDeviceExtend); //防止更新其他字段 _ioTDbContext.Entry(device.IoTDeviceExtend).State = EntityState.Unchanged; _ioTDbContext.Entry(device.IoTDeviceExtend).Property(o => o.OnLineStates).IsModified = true; await _ioTDbContext.SaveChangesAsync(); } } } 我们根据Event中的内容来判断是 连接(client.connected)/断开(client.disconnected) 的事件 /// <summary> /// 连接、断开事件 /// </summary> /// <param name="request"></param> /// <returns></returns> [HttpPost] public async Task ConnectedEventAsync([FromBody] ConnectedEventRequest request) { var onlineStatus = request.Event switch { "client.connected" => OnLineStates.OnLine, _ => OnLineStates.OffLine }; await _deviceHandler.UpdateDeviceOnlineStatusAsync(request.Username, onlineStatus); } #总结 以上就是本文要讲的内容,我们可以通过MQTTX来测试我们的代码有效性。 该方案还存在部分缺点,例如: 1、每次设备上下线会导致频繁的请求接口,在大量设备接入的场景中需要考虑接口性能。 2、由于网络等问题,Web调用顺序可能不能完全保证,也许离线会比在线事件更早处理,从而导致状态不一致。我们后面会尝试用其他方案来替代WebHook,尝试解决上述问题,在此之前我们都会继续使用WebHook进行功能演示。 完整代码在这里:https://github.com/sunday866/MASA.IoT-Training-Demos 如果你对我们的 MASA 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们 WeChat:MasaStackTechOps QQ:7424099

优秀的个人博客,低调大师

如何搭建一台永久运行的个人服务器?试试这个黑科技!

作者:彭小呆<br> 来源:segmentfault.com/a/1190000021143144 一、树莓派是什么? Raspberry Pi(中文名为树莓派,简写为 RPi,(或者 RasPi / RPI) 是为学习计算机编程教育而设计),只有信用卡大小的微型电脑,其系统基于 Linux。随着 Windows 10 IoT 的发布,我们也将可以用上运行 Windows 的树莓派。 自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是麻雀虽小,五脏俱全。 1. 用我的话理解 用我的话理解就是树莓派就是一台主机,你可以外接显示器,键盘鼠标,u盘等等外设,因为它体积很小,而且又有很多串口和外接的口,可以直接调用很多底层硬件。 2. 市面上的型号 市面上大多是 3 代 B+ 型,淘宝一搜树莓派一大堆都是,价钱纯主板(不要任何外设)在 230+ 左右,有点小贵,超过我的预算,所以我继续寻找廉价的,终于让我发现了一款 100+ 的树莓派。 3. 树莓派 zero w 树莓派 zero w 是一款 mini 的树莓派,体质只有 3b+ 的 1/3。实际到手后,你会发现它真的超级小,超级可爱。以下是我的实物图,你可以看看大小到底有多 mini。 你可以看到,最上面是一根普通的黑色签字笔,接下来是一个即插即用型的外接 wifi 网卡,然后是一个 USB 读卡器,最底下的就是我们今天的主角 zero w。它真的超级小,有木有。真的是完美的诠释了那句“麻雀虽小,五脏俱全”的话。 zero w 这款树莓派的主要参数如下: • BCM2835 处理器,1GHz 主频,512MB RAM • BCM43438 WiFi / BT 芯片 • micro-USB 电源接口 • micro-USB OTG 接口 • miniHDMI 端口 • 复合视频和重置扩展接口 • 脆弱的 CSI 摄像头接口 • micro-SD 卡座,存放操作系统 • 40-pin GPIO 扩展接口 • 尺寸:65mm*30mm 你别看它的 cpu 只有 1 核,内存只有 512MB,就觉得它可能什么都做不了,但是实际上它的性能还是很好的,用于跑一个网站真的是小 case。 4. 更多树莓派 关于更多树莓派型号或者使用教程你可以去树莓派实验室这个网站,上面有丰富的资源。 二、树莓派zero w安装系统 1. 准备 你可能提前需要准备的东西如下: • 16GB or 32GB 的 SanDisk 内存卡(注意是以前那种放在手机上,很小的哦) • 一根最普通不过的 usb 安卓数据线(not type-c) • u 盘格式化工具(推荐使用 SDFormatter) • 系统烧写工具(Win32DiskImager) • 树莓派系统(可以去官网下载) 我使用的是 Raspbian Stretch Lite 这个系统镜像,这个系统是官方制作的,lite 是无桌面版的,只有黑漆漆的控制台,优点是体积小,省性能和内存。 名字带有 desktop 的是有桌面 ui 的,对不熟悉 liunx 系统的朋友可能更友好,但是体积很大,占用的性能也会更高。 2. 第一步下载系统镜像 下载好你需要的系统镜像后,如下图 一开始只有一个 zip 的压缩包,大小大概 360MB 左右,你需要把它解压,得到上图的文件夹。 然后进入文件夹可以看到一个 img 的镜像,大小为 1.7GB 左右。 ps:这个官方的 Raspbian 镜像,如果是其他第三方的镜像,可能下载后的压缩包解压后不是 img 镜像,这种情况请另行百度解决。 3. 使用 Win32DiskImager 往内存卡中写入镜像 把内存卡插入读卡器后,插入电脑。 打开 Win32DiskImager 软件后,选择 img 镜像,设备选择你的 U 盘,然后点击写入就可以了,写入完成后会弹出成功的提示框。 ps: 我上图没有选择设备,因为的没插入读卡器,仅仅是示范而已 4. 修改 boot 分区的文件 先别急着拔出读卡器,此时,我们电脑可以看到 u 盘中只有一个名为 boot 的分区,大小可能只有 40MB 左右,不要着急,因为 window 不识别内存卡中 liunx 系统的其他分区。 4.1 新建 ssh 文件 因为我们的 zero w 有一个 mini hdmi 的接口,但是我不需要屏幕,所以需要使用 ssh 连接到 zero w 中的系统,所以需要在第一次开机就能开启 ssh 功能。 我们进入 boot 分区内,然后新建一个名为 ssh 的文件,注意不要后缀名!!!!也不要往里面写任何东西!! 4.2 新建 wpa_supplicant.conf 文件 因为 ssh 连接是需要 ip 地址的,所以我们需要将 zero w 在第一次开机自动连接 wifi,使其和我们的电脑处于一个局域网,这样我们才可以通过 ssh 连接到 zero w 的系统。 同样的在 boot 分区内,新建一个名为 wpa_supplicant.conf 的文件,然后往里面写入如下内容后保存: country=CN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="你的wifi名字" psk="你的wifi密码" } 5. 组装我们的最小主机并连接 取出读卡器中的内存卡,然后插入到 zero w 中,使用一根 usb 安卓数据线连接电源(5V1A)即可。 等待几分钟,期间我们的 zero w 的指示灯会一直闪烁,很正常,等待指示灯常亮的时候,我们去路由器上,查看一下树莓派的 ip 地址。 可以看到我们 zero w 的 ip 为 192.168.0.104,然后使用 ssh 连接工具(推荐使用 putty)连接树莓派,初始账户为 pi,密码是 raspberry。 连接成功,如上图所示。这样我们的系统就正确无误的安装好了。 ps: 如果是手机开启热点当做一个路由器的话,咱们手机下载一个名叫 android terminal 的 app,然后输入 ip neigh 指令,就可以查到连接到手机的设备的 ip 信息了。 6. 优化咱们树莓派的系统 6.1 修改源 因为国外的源,咱们在国内的连接过去网速很慢,所以我们需要修改为国内的源,我修改的是中科大的源。 6.1.1 修改 sources.list 文件 sudo nano /etc/apt/sources.list --注释其他内容,添加以下: deb http://mirrors.ustc.edu.cn/raspbian/raspbian/raspbian stretch main contrib non-free rpi 6.1.2 修改 raspi.list 文件 sudo nano /etc/apt/sources.list.d/raspi.list --注释其他内容,添加以下: deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian stretch main ui 6.1.3 执行更新 sudo apt-get update sudo apt-get upgrade 6.2 修改时区 sudo dpkg-reconfigure tzdata 找到亚洲 Asia,然后选择 shanghai 就可以了。 6.3 开机自启 ssh 第一种: sudo raspi-config 进入选择找到 interfacing option 选择,然后找到 ssh,按回车使能 enable 就可以了。 第二种: 在终端命令行中启动 SSH 服务后,如果系统重启或关机后启动,SSH 服务默认是关闭的,依然需要手动启动,为了方便可以设置 SSH 服务开机自动启动,打开 /etc/rc.local 文件,在语句 exit 0 之前加入:/etc/init.d/ssh start 建议都试试,反之我的是可以了。 7. 安装 nginx #安装 sudo apt-get install nginx #启动 sudo /etc/init.d/nginx start #重启 sudo /etc/init.d/nginx restart #停止 sudo /etc/init.d/nginx stop 打开浏览器访问 192.168.0.104(你的树莓派 ip 地址),可以看到 nginx 的页面,说明安装好了。 我这边上传了我的博客,如下图 可以正常的看到页面了,但是这样只能在内网(局域网中)看到,我想让所有人都可以访问怎么办? 8. 内网穿透 内网穿透,意思就是将内网(本地)的 web 应用通过 nat 穿透到公网上,从而让别人可以访问到。 内网穿透目前主要由 ngrok 和 frp 两种,都非常好用,国内 ngrok 免费的有 ittun、sunny 和 natapp,这三个都是免费的,前面两个可以自定义域名,后面的需要 vip 版本才可以自定义域名。 我这三种都试过,我发现 sunny 的 arm 版本的 ngrok 客户端在我的树莓派运行不了,ittun 的和 natpp 的 ngrok 都可以,由于需要自定义域名,我使用的是 ittun 的 ngrok_arm 版本的。 使用方法这三者官网都有详细说明,大家自行查看。 这是正常运行时的截图,访问 http://zerow.ittun.com/ 时可以... 因为需要 ngrok 在后台运行,所以我用的是 screen 会话使其可以在后台运行。但是开启自启,还没有实现,万一断电或者断网了,我必须手动去运行一下 ngrok,这是目前没有解决的痛点。 9. 更多 树莓派不仅仅只是可以用于运行一个网站,还有很多很多的功能等待你的开发,可以多去看看树莓派实验室里面,很多大神都写了很多实用的教程。 这个zero w 状态信息如下: 在上面开启了一个 nginx 和 ngrok 服务,内存剩余还有 250MB,还是很舒服的,cpu 温度也不算高,运行两天了,基本在 37-39 之间。 近期热文推荐: 1.1,000+ 道 Java面试题及答案整理(2021最新版) 2.别在再满屏的 if/ else 了,试试策略模式,真香!! 3.卧槽!Java 中的 xx ≠ null 是什么新语法? 4.Spring Boot 2.5 重磅发布,黑暗模式太炸了! 5.《Java开发手册(嵩山版)》最新发布,速速下载! 觉得不错,别忘了随手点赞+转发哦!

优秀的个人博客,低调大师

开放原子读书会第 3 期:如何从 0-1 搭建开源社区

开放原子读书会将于2021年7月28日迎来第3期的聚会,想了解如何创建一个成功的开源社区,并让社区项目保持正常运转吗?7月28日20:00-21:30锁定开放原子读书会直播间,《社区运营的艺术》给你答案! “归属感使人们驻留在社区。这种归属感是社区建设的目标。强大社区的标志就是,它的成员们都拥有归属感。”适合本书读者:专业的社区经理,志愿者和社区领导人,商业组织,开源软件的开发者,市场营销人员,活动家。 本期内容简介 《社区运营的艺术(第2版)》的作者Jono Bacon用自己多年经验和教训试着给读者提供一些参考,包括如何建立战略规划、如何进行有效的沟通、如何创建简单易用的流程、如何运用社交媒体扩大社区的影响力等,同时分享了对知名社区领袖采访的经历,帮助读者窥探顶级社区成功的奥秘。 书籍作者介绍 Jono Bacon 是一位出色的社区经理、顾问,以及四本书的作者。现担任Ubuntu社区这一全球性社区的经理,他写的关于开源软件的博客始终是最受欢迎的博客之一,同时他创立了社区领导人峰会。 本期嘉宾介绍 开放原子读书会第3期,此次读书会主持人由开放原子教育教研总监郭晧担任,直播期间欢迎踊跃向嘉宾提问,此次读书会直播干货满满,不容错过哦~ 我们邀请了微众银行开源管理办公室负责人钟燕清、LFAPAC开源布道师马景贺及ApacheDubbo与Apollo PMC邹毅贤,3位嘉宾将共同探讨交流:如何创建一个成功的开源社区并让社区项目保持正常运转? 邀请好友一起读书还有奖品拿 丰富奖品送到手软! 邀请达人奖品送不停 (开放原子读书会第3期-邀请达人榜奖励规则图) 提前预约,一起读书!如何建立战略规划?如何进行有效的沟通?如何创建简单易用的流程?一切答案就在7月28日20:00-21:30,马上扫描下方海报二维码预约直播: 长按保存 分享立即扫码 预约直播

优秀的个人博客,低调大师

开源可视化搭建平台-码良支持新功能桌面端页面制作

码良新技能 桌面端页面制作 最近码良迎来了一波新功能的上线,并毫无保留地继续进行了代码开源-赶紧star关注 。新上线的功能有桌面端页面制作、”楼层模式“、”正宗“布局组件(容器组件)的开发能力、组件封装、word 文档解析、psd 解析等平台功能和能力。 资源难得赶紧先关注,然后后续学习。 本文将围绕一些具体例子来介绍码良桌面端页面制作功能。 选择画布 画布是码良新引入的一个概念,指的是场景区内用于组件摆放的一个区域,画布的高度可拓展,但是宽度是不能伸缩的。渲染器的页面适配主要是对不同宽度画布生成的页面在不同宽度设备上的适配,因此,我们主要关注画布宽度。 引入画布概念以后,码良内置了 4 个画布,其中三个为移动端画布,剩下一个为桌面端画布。参见下图。 由于制作的是桌面端页面,首先我们点击选择最宽的那个画布指示条,切换到桌面画布。 这时,会询问是否需要切换到”楼层模式“ 那么什么是楼层模式呢 楼层模式 我们看个简单的例子 可以看到,在属性面板可以为某个组件设置布局模式。布局模式决定了其直接子组件的位置排布方式,当设置为”楼层模式“时,子组件如楼层般依次向下扩展,当设置为”自由模式“时,子组件上下堆叠,位置可自由挪动。 实践下来,”楼层模式“更适合桌面端页面的制作。所以当切换画布到桌面画布时,如果根组件(root)的布局模式不是”楼层模式“,则会询问是否需要切换到楼层模式,也就是上节出现的情况。 高度自动 设置了”楼层模式“的组件,因其子组件依次向下排布,我们可以将该组件的高度禁用(样式面板-高-禁用,值实际被设置为auto),这样组件就可以根据子组件的累加高度自动获得高度。 横向布局 “楼层模式”方便了组件沿页面纵向的布局,那么需要组件横向排布时如何做呢?多栏布局组件登场。 页面结构 桌面端页面的内容组织方式通常为顶栏、内容区、页脚,也可能会有一个或多个侧边栏。 结合楼层模式和多栏布局组件,我们可以轻松实现以上各种页面结构。以上图中左下角的页面结构为例,使用码良来实现它。 可以看到,我们通过使用”空容器“组件和”多栏布局组件“,结合上文提到的”楼层模式“纵向布局和”多栏组件“提供的横向布局能力,再辅以”高度自动“技巧,成功实现了一个含侧边栏、顶栏、主内容区、页脚的页面布局。 填充内容 制作了页面骨架以后,根据实际需要向页面各个部分添加内容。 由于目前专门为桌面画布开发的组件还比较少,在制作桌面端页面时,需要灵活组合基础组件(如图片、文本、富文本等)来实现一些复杂的效果和功能。 现在,码良团队正在加紧开发桌面组件,随着这些封装程度更高、使用更简便的组件面世,桌面页面制作将大大提速。 也希望读者能参与到这一过程中,积极向码良组件商城贡献组件,点点 star 也行。 设备适配 不同桌面端设备的宽度存在差异,在制作桌面端页面时需要考虑页面在不同设备上的实际显示效果。不同于移动端页面能通过简单的缩放视口来实现设备适配,码良对于桌面端页面没有采取任何主动适配策略。那么针对具体页面,如果实现合适的显示效果呢? 考虑到大部分桌面端页面的内容区宽度相对固定,比如 1140px、960px,那么在制作这些内容的时候无需特殊处理,直接使用绝对单位 px (默认单位)即可。另外,内容区一般是居中的,考虑到这种需求的广范性,码良特意提供了一个”居中“属性,为组件开启此属性即可实现自动动态居中效果。 对于依赖设备宽度的组件展示效果,比如通栏导航栏,不能再使用组件样式默认的绝对单位,应该将大小和位置样式的单位切换为”%“,并手动输入数值。 除了平台层面提供的绝对单位和相对单位适配方案,组件自身也可以通过”媒体查询“等技术做成响应式的,在不同宽度设备上展示出不同的形态。 demo 展示 最终,”你得先这样,然后再这样,然后再这样,最后再这样“,一个美美的 demo 页面就制作好了。 期待 pc端的能力支持后。我们也在尝试使用码良做数据大屏,我们发现码良平台在做数据大屏上有独特的优势。可以在后期我们的相关组件更加丰富后再出文章说明。以下是码良做大屏的一些尝试,页面能很好的进行适配,也能很好的接入一些第三方图表组件。 演示地址-点击查看效果 支持我们 开源项目需要的是持续地坚持,而我们坚持的动力当然也来自于你们的支持 来都来了,加个关注再走吧 项目代码:https://github.com/ymm-tech/gods-pen 项目代码(国内镜像):https://gitee.com/ymm-tech/gods-pen

优秀的个人博客,低调大师

关于SAP CRM中间件系统搭建中遇到的一些问题

Sent: Friday, August 8, 2014 12:42 PM Subject: RE: CRM 713 X3D环境SETUP 之前我遇到一个问题,从ERP QV5到CRM X3D的response没有回来,原因是因为在ERP端的CRMRFAPCR表里面,没有到X3D的配置,新增一条配置信息: OBJNAME = MATERIAL && DOWNLOAD = R, 这样会优先选出更Specific的到X3D的这条。 重新执行,Request就可以返回CRM端了,但是还有错: Debug发现是因为在CRM上配的源系统跟Download过来的系统不匹配,在CRM端的CRMMLSGUID表里面: 可以看到X3D原来配的系统是QI3,之前用T-CODE SMOEAC找到的SITE里面有多个系统: 之前我想QI3已经被X3C用了,而且X3D到QI3的SM59连接测试不通过,所以就重新找了一个看起来好用的QV5,现在似乎又绕回来了。 能想到的有两个办法:X3D继续用QV5,在X3D的CRMMLSGUID表里增加QV5配置作为workaround,测完了删掉。X3D连QI3,报IT TICKET建立X3D/QI3的双向RFC连接,在QI3的CRMRFAPCR表里配置回到X3D的信息,考虑到X3C已经在QI3上测了,可能要用不同测Client避免冲突。 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册