亿琪软件-开源博客 - 服务端软件
type: channel
link: https://www.yiqisoft.cn/blogs/category/server-side/
items: Linux运维笔记：修复 ThinLinc 会话数据库损坏问题
items: 开源｜ThingsBoard 快速开发物联网可视化大屏和驾驶舱的方式方法
items: YiAI 人工智能算法路况测试视频
items: Odoo 集成 OAuth2 认证（Keycloak），实现统一登录
items: Spring Boot 集成 JasperReports，并支持中文PDF

Linux运维笔记：修复 ThinLinc 会话数据库损坏问题
type: item
date: 2025-04-14T15:53:00+00:00
description: Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 在多用户 Linux 工作站中的重要性 问题发现：会话数据库损坏 解决： 1. 备份数据 2.删除损坏的数据库文件 3.重启服务 4.重新检查 5.验证修复 总结 Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 是一个优秀的远程桌面解决方案，它让用户能够方便地访问工作站，运行复杂计算任务或进行数据分析。然而，最近我们遇到一个问题：ThinLinc 客户端无法成功连接至工作站。排查发现是 ThinLinc 的核心服务 vsmserver.service 启动失败，导致用户无法登录。经过进一步排查，发现问题源于会话数据库损坏，并成功解决了它。 ThinLinc 在多用户 Linux 工作站中的重要性 实验室的工作站通常需要配置高性能硬件，运行专业软件，但用户分布在不同地点。ThinLinc 通过虚拟会话管理（VSM）提供流畅的远程访问体验，让用户无需物理接触工作站即可完成工作。VSM 服务器（vsmserver.service）是 ThinLinc 的核心组件，负责协调用户会话。如果它出现故障，整个远程访问系统就会瘫痪。 最近，我们注意到用户反馈无法连接到工作站。运行 systemctl list-units --type=service 检查后，发现 vsmserver.service 状态为 loaded failed failed，详细情况如下所示： root@ccccs-Z790-UD-AX:/home/ccccs# systemctl list-units --type=service ... vsmagent.service loaded active running ThinLinc VSM agent vsmserver.service loaded failed failed ThinLinc VSM server whoopsie.service loaded active running crash report submission daemon ... 此时通过 systemctl 命令尝试重启该服务，发现仍不能成功启动... 问题发现：会话数据库损坏 首先查看了系统日志： sudo journalctl -u vsmserver.service 日志显示服务在启动后立即退出，状态码为 status=1/FAILURE，但没有具体错误详情。接着转向 ThinLinc 的专用日志文件： sudo cat /var/log/vsmserver.log 2025-04-14 12:26:52 INFO vsmserver: VSM Server version 4.15.0 build 3358 started 2025-04-14 12:26:52 ERROR vsmserver: Error loading session database: Error unpacking /var/lib/vsm/sessions (invalid load key, '\x00'.) 2025-04-14 12:26:52 ERROR vsmserver: Session database needs manual recovery. 2025-04-14 12:26:52 ERROR vsmserver: Exiting 发现是 /var/lib/vsm/sessions 文件损坏，导致 VSM 服务器无法加载会话数据库并退出。 这个错误提示 invalid load key, '\x00' 通常表示文件内容不完整或被意外修改，可能是磁盘问题、异常关机或软件 bug 导致。(工作站会偶尔发生断电或人为重启) 解决： 1. 备份数据 sudo cp -r /var/lib/vsm/sessions /var/lib/vsm/sessions.bak 2.删除损坏的数据库文件 ThinLinc 文档指出，损坏的 /var/lib/vsm/sessions 文件可以安全删除，服务器会在下次启动时自动重新创建。我们执行： sudo rm /var/lib/vsm/sessions 注意：删除会话数据库会清除当前会话记录，可能导致用户丢失未保存的会话状态。在我们的场景中，实验室用户主要运行短期任务，影响较小，但也要确保此时每人连接。 3.重启服务 sudo systemctl start vsmserver.service 4.重新检查 systemctl list-units --type=service # 启动成功 vsmserver.service loaded active running ThinLi…

开源｜ThingsBoard 快速开发物联网可视化大屏和驾驶舱的方式方法
type: item
date: 2023-05-10T07:52:00+00:00
description: 前言 在物联网开发中对于数据可视是必须的一项工作，大家都清楚国内对于很数据驾驶仓和大屏展示有着效高的需求，如果用传统的方式来可视化需要逐句代码编写进行实现，这使得开发工作内容繁重且重复很多还不能应对各种需求的变化， 如果我们使用ThingsBoard的可视化进行开发这样就会极大的减少工作量提高效率和产出，我们可以通过部件方式将传统的HTML，JS，CSS进行代码开发做成自定义基础部件为后面我们的可视化添砖加瓦，效果图如下 创建部件 导航部件库然后打开现有的部件包或创建一个新在部件包视图中单击屏幕右下角的大“ +”按钮然后单击“创建新的窗口部件类型”按钮。 选择部件 选择窗口部件类型会弹出窗口选择你要开发的相应部件类型之后将根据先前选择的窗口部件类型打开“窗口部件编辑器”页面，该页面预填充了启动器窗口部件模板。 编辑器 编辑器由工具栏和四个主要部分组成： HTML面板：可以添加CSS，JS相关代码 JavaScript：编写一些JS函数 设置：主要是JSON代码用于在部件中设置一些个性配置 预览：类型于仪表板的形式展示当前窗口部件 部件API 所有与部件相关的代码都位于JavaScript部分并提供了对部件实例的引用的内置变量self部件函数都必须定义主self变量的属性，self变量有ctx属性引用部件实例使用的所有API和数据的WidgetContext上下文对象。 参见以下表格： 属性 类型 描述 $container jQuery Object 部件的容器元素。可用于使用jQuery API动态访问或修改部件DOM。 $scope 动态部件组件 当前部件元素的角度范围对象。使用Angular方法构建窗口小部件时，可用于访问/修改范围属性。 width Number 部件容器的当前宽度（以像素为单位）。 height Number 部件容器的当前高度（以像素为单位）。 isEdit Boolean 指示仪表板是处于视图状态还是处于编辑状态。 isMobile Boolean 指示仪表板视图是否小于960px宽度（默认移动断点）。 widgetConfig Object 常见的窗口小部件配置，其中包含诸如颜色（文本颜色），backgroundColor（小部件背景颜色）等属性。 settings Object 根据定义的json模式包含小部件特定属性的小部件设置 units String 定义窗口小部件显示的值的单位文本的可选属性。对于简单的小部件（如卡片或仪表）很有用。 decimals Number 可选属性，用于定义应使用多少个位置来显示数值的小数部分。 hideTitlePanel Boolean 管理窗口小部件标题面板的可见性。对于具有自定义标题面板或不同状态的小部件很有用。 widgetTitle String 如果设置，将覆盖配置的窗口小部件标题文本。更改此属性后，必须调用updateWidgetParams（）函数。 detectChanges() Function 介绍触发当前小部件的更改检测。由于窗口小部件数据更改而应更新窗口小部件HTML模板绑定时，必须调用此方法。 updateWidgetParams() Function 介绍使用运行时集属性（例如widgetTitle，hideTitlePanel等）更新小部件。必须调用这些属性才能使这些属性更改生效。 defaultSubscription Object 请参阅对象订阅 timewindowFunctions Object 请参阅Timewindow功能 controlApi Object 请参阅Control API actionsApi Object 请参阅Actions API stateController Object 请参阅状态Controller datasources 数组<数据源> 解析的窗口小部件数据源的数组。请参见订阅对象. 函数说明 函数 描述 onInit() 当widget准备好初始化时调用的第一个函数。应该用于准备小部件DOM，处理小部件设置和初始订阅信息。 onDataUpdated() 在部件订阅中有新数据可用时调用。可以从窗口部件上下文（ctx）的defaultSubscription object访问最新数据。 onResize() 调整窗口小部件容器的大小时调用。可以从窗口小部件上下文（ctx）获得最新的宽度和高度。 onEditModeChanged() 更改仪表板编辑模式时调用。最新模式由ctx的isEdit属性处理。 onMobileModeChanged() 当仪表板视图宽度超过移动断点时调用。最新状态由ctx的isMobile属性处理。 onDestroy() 当部件元素被销毁时调用。如有必要，应…

YiAI 人工智能算法路况测试视频
type: item
date: 2022-07-22T09:37:46+00:00

Odoo 集成 OAuth2 认证（Keycloak），实现统一登录
type: item
date: 2022-05-18T12:19:00+00:00
description: 引用文字 准备工作 OAuth2 认证基本知识； Odoo 14版本，单机部署，最好不使用 docker 环境； Odoo OAuth for Keycloak 扩展； Keycloak，配置好 Client 和 User； 工作原理 1. Odoo 插件安装 下载插件，https://github.com/OCA/server-auth/tree/14.0/auth_oidc，配置到 Odoo 外部扩展插件中，安装，具体步骤看插件 Readme 文件即可； 2. 配置 Odoo 支持 Keycloak 认证，按照下图例子参考配置 Odoo 即可； 3. Keycloak 配置，以便支持 Odoo； Clients 配置基本功能即可，可参考：https://yiqisoft.cn/blogs/iot_platform/243.html，尤其需要配置一个 Mapper，匹配 email 地址用： 创建 Keycloak 内置用户即可； 4. Odoo 用户配置 已知内置用户可以配置成 OAuth2 用户，这样内置用户可以登录 Odoo，OAuth2 用户也可以登录； 内置用户可以不创建，第一次登录 OAuth2 服务器后会自动创建，此时新创建用户无法使用 Odoo 登录，需要发送认证email后创建密码； 成果演示

Spring Boot 集成 JasperReports，并支持中文PDF
type: item
date: 2020-10-28T16:57:06+00:00
description: 设计 jrxml 文件 使用 Jaspersoft Studio 图形化设计报表，或使用文本文件 集成 JasperReports 和 JasperReports Font Extension pom.xml 中新增 net.sf.jasperreports jasperreports 6.15.0 net.sf.jasperreports jasperreports-fonts 6.15.0 PDF 中文支持 文件列表 jasperreports_extension.properties src/main/resources 下新建文件 net.sf.jasperreports.awt.ignore.missing.font=true net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.dejavu=fonts/fonts.xml fonts.xml src/main/resources/fonts 目录下新建 <?xml version="1.0" encoding="UTF-8"?> fonts/simsun.ttf Identity-H <exportFonts/> simsun.ttf 从Windows电脑拷贝文件到 src/main/resources/fonts 下