鸿蒙PC Matebook Pro上全局安装GIT

准备工作 在鸿蒙应用商店安装 CodeArts IDE 从CodeArts IDE提取签名工具 打开IDE, 随便创建一个项目打开,在终端执行以下命令 1 2 3 4 5 6 7 8 9 10 11 12 # 复制签名工具 cp /data/app/toolchains.org/toolchains_1.0/lib//binary-sign-tool . # 对签名工具签名 binary-sign-tool sign -inFile "./binary-sign-tool" -outFile "./binary-sign-tool-signed" -selfSign 1 # 添加可执行权限 chmod +x binary-sign-tool-signed # 测试,如果没弹授权弹窗和帮忙输出,需要重新签名和添加可执行权限 ./binary-sign-tool-signed # 复制到用户安装目录 mkdir -p ~/.local/bin cp ./binary-sign-tool-signed ~/.local/bin/binary-sign-tool 最后在~/.zshrc添加export PATH=$HOME/.local/bin:$PATH 保存签名脚本 把以下保存为~/.local/bin/hm-sign-all.sh, 并执行chmod +x ~/.local/bin/hm-sign-all.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/sh # 递归查询当前目录及其子目录下的所有文件 find . -type f | while read -r file; do # 使用 file 命令检查文件类型 if file "$file" | grep "shared object"; then echo "Found executable or shared object: $file" # 确保文件具有可执行权限 chmod +x "$file" # 签名文件 echo "Signing file: $file" binary-sign-tool sign -inFile "$file" -outFile "$file" -selfSign 1 fi done 从CodeArts IDE提取git 打开IDE, 随便创建一个项目打开,在终端执行以下命令 1 2 3 4 5 6 7 8 9 10 11 12 13 # 创建安装目录 mkdir -p ~/.local/opt # 切换到安装目录, 并复制git cd ~/.local/opt cp -r /data/app/git.org/git_1.2/ . # 对git可执行文件签名 hm-sign-all.sh # 创建bin的软件链接 ln -s $HOME/.local/opt/git_1.2/bin/git $HOME/.local/bin/ ln -s $HOME/Users/currentUser/.local/opt/git_1.2/bin/git-lfs $HOME/.local/bin/ 配置git环境 在~/.zshrc添加以下内容 1 2 3 # git export GIT_EXEC_PATH=$HOME/.local/opt/git_1.2/libexec/git-core export GIT_TEMPLATE_DIR=$HOME/.local/opt/git_1.2/share/git-core/templates 测试 可以看到,可以正常clone仓库 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 ➜ cd Documents/DevEcoStudioProjects ✓ YSTYLE ❯ [10:35] ❯ ~/Documents/DevEcoStudioProjects ➜ git clone https://github.com/ystyle/paimon.git✓ Cloning into 'paimon'... remote: Enumerating objects: 99, done. remote: Counting objects: 100% (99/99), done. remote: Compressing objects: 100% (68/68), done. remote: Total 99 (delta 19), reused 94 (delta 16), pack-reused 0 (from 0) Receiving objects: 100% (99/99), 2.59 MiB | 3.19 MiB/s, done. Resolving deltas: 100% (19/19), done. YSTYLE ❯ [10:36] ❯ ~/Documents/DevEcoStudioProjects ➜ cd paimon ✓ YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon ➜ git status✓ fatal: detected dubious ownership in repository at '/storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon' To add an exception for this directory, call: git config --global --add safe.directory /storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon ➜ git config --global --add safe.directory /storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon✗ 128 YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon ➜ git status✓ On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon ➜ git log ✓ error: cannot run less: No such file or directory commit a0dffbac91fab1d1da50709d9e4b34f5a1ef0771 (HEAD -> master, tag: 2025-10-20, origin/master, origin/HEAD) Author: ystyle <lxy5266@live.com> Date: Mon Oct 20 14:06:30 2025 +0800 feat: 优化代码

2025/12/28
articleCard.readMore

Neovim移植鸿蒙PC:三方库适配实战与挑战解析

Neovim移植鸿蒙PC:三方库适配实战与挑战解析 本文记录将Neovim编辑器移植到HarmonyOS PC过程中,对11个核心依赖库的适配实战经验,涵盖平台差异分析、API限制处理、构建系统改造等关键问题。 项目背景 目标:将现代文本编辑器Neovim完整移植到HarmonyOS PC系统,支持完整的Lua插件生态和现代语法高亮。 环境: 操作系统:HarmonyOS 6.0 架构:aarch64 (ARM64) 编译器:BiSheng Clang 15.0.4 (OHOS工具链) 构建系统:CMake 3.28.2 + Ninja 挑战:Neovim依赖11个核心三方库,每个库都需要针对HarmonyOS进行适配,涉及平台检测、API限制、内存权限、文件系统等多个维度。 一、依赖库适配全景 1.1 适配状态总览 依赖库版本适配状态主要挑战解决方案 libuv1.51.0✅ 完全适配TTY权限、CPU亲和性、io_uring条件编译+鸿蒙平台文件 LuaJIT2.1✅ 完全适配JIT内存权限、系统分配器禁用JIT+系统分配器 Lua5.1.5✅ 完全适配工具链适配Makefile平台扩展 tree-sitter核心库✅ 无需修改无直接构建 luv1.51.0-1✅ 完全适配头文件路径冲突路径修复+编译标志 lpeg1.1.0✅ 完全适配Makefile工具链完整Makefile重写 libiconv1.17✅ 完全适配平台检测缺失config.guess扩展 unibiliumv2.1.2✅ 无需修改无直接构建 utf8procv2.11.2✅ 无需修改无直接构建 lua-compat-5.3v0.13✅ 完全适配缺少构建系统CMakeLists.txt创建 tree-sitter解析器7个✅ 完全适配无直接构建 构建成功率:100% (11/11个依赖成功构建) 二、关键技术挑战与解决方案 2.1 libuv:异步I/O库的鸿蒙适配 挑战分析 libuv是Neovim异步事件处理的核心,但在HarmonyOS上遇到多个问题: TTY权限问题:uv_tty_init在非终端环境返回UV_EACCES CPU亲和性API缺失:HarmonyOS缺少pthread_setaffinity_np等API mmsghdr结构体差异:系统头文件定义不完整 io_uring支持:可能不兼容 解决方案 平台检测与条件编译: 1 2 3 4 5 6 7 8 9 // 在CMakeLists.txt中添加鸿蒙平台定义 add_definitions(-D__OHOS__=1) // 关键API的条件编译包装 #if !defined(__OHOS__) // Linux特有功能(CPU亲和性、mmsghdr等) uv_cpumask_size(); uv_available_parallelism(); #endif 创建鸿蒙平台文件: 基于linux.c创建harmonyos.c,包含: 完整的uv__platform_loop_init实现 epoll事件循环支持 缺失函数的桩实现 TTY功能验证: 在真实终端环境中测试,发现isatty()在HarmonyOS上正常工作,所有TTY函数(uv_tty_init、uv_tty_set_mode等)均正常。 验证结果 经过全面测试,Neovim所需的所有libuv功能在HarmonyOS上正常工作: ✅ 事件循环和定时器 ✅ 文件系统操作 ✅ TTY/终端功能(neovim TUI核心) ✅ 进程管理 ✅ 系统信息获取 2.2 LuaJIT:JIT编译器的安全限制 挑战分析 LuaJIT在HarmonyOS上遇到W^X(Write XOR Execute)安全策略限制: mmap(PROT_EXEC)失败:无法分配可执行内存 mprotect(RW → RX)失败:无法设置内存执行权限 JIT编译器完全不可用 解决方案 禁用JIT功能: 1 2 3 4 # 编译选项 -DLUAJIT_DISABLE_JIT # 完全禁用JIT编译器 -DLUAJIT_USE_SYSMALLOC # 使用系统内存分配器 -DLJ_NO_SYSTEM # 限制系统调用(安全考虑) 平台检测扩展: 1 2 3 4 5 6 7 // 在lj_arch.h中添加鸿蒙平台检测 #elif defined(__OHOS__) #define LUAJIT_OS LUAJIT_OS_POSIX #define LJ_TARGET_OHOS 1 #define LJ_TARGET_CONSOLE 1 // 控制台模式 #define LUAJIT_DISABLE_JIT 1 // JIT不可用 #define LUAJIT_USE_SYSMALLOC 1 // 系统分配器 性能影响 虽然JIT不可用,但LuaJIT的解释器模式仍提供: 完整的Lua 5.1语言兼容性 优于标准Lua 5.1的性能 稳定的内存管理 2.3 构建系统适配 挑战分析 不同依赖库使用不同的构建系统: Autotools:libiconv Makefile:Lua、lpeg、LuaJIT CMake:tree-sitter、unibilium、utf8proc 自定义构建:luv 统一构建方案 简化构建流程: 1 2 3 4 5 # 旧流程(复杂) 下载 → 解压 → 应用补丁 → 构建 # 新流程(简化) 下载 → 解压(已包含修改) → 构建 工具链统一配置: 1 2 3 4 5 # 鸿蒙BiSheng工具链 export CC="/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/clang" export AR="/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-ar" export RANLIB="/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-ranlib" export STRIP="/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-strip" 2.4 头文件与路径冲突 luv的头文件路径问题 问题:luv依赖Lua 5.3兼容层,但头文件包含路径错误: 1 2 3 4 5 // 错误 #include "compat-5.3.h" // 正确 #include "lua_compat53/compat-5.3.h" 解决方案: 修复源代码中的包含路径 添加编译标志避免.c文件包含: 1 -DCMAKE_C_FLAGS="-DCOMPAT53_PREFIX=compat53" 2.5 平台检测扩展 libiconv的config.guess问题 问题:Autotools的config.guess脚本无法识别HarmonyOS系统。 解决方案:在build-aux/config.guess中添加HarmonyOS检测: 1 2 3 4 # 添加系统检测分支 HarmonyOS*:*:*:*) echo aarch64-unknown-harmonyos exit ;; 三、适配策略总结 3.1 渐进式适配策略 功能验证优先:先测试核心功能,再完善边缘功能 最小修改原则:只修改必要的部分,保持代码简洁 条件编译为主:使用#if !defined(__OHOS__)包装平台特定代码 桩函数补充:为缺失API提供简单实现 3.2 测试驱动开发 针对每个依赖库创建专门的测试程序: libuv:nvim-libuv-test.c验证Neovim实际使用的功能 LuaJIT:API可用性测试和性能基准测试 综合测试:验证库间集成和兼容性 3.3 文档与补丁管理 补丁系统演进: 初期:使用patch文件管理修改 中期:直接修改源码+Git版本控制 当前:源码已包含修改,无需补丁应用步骤 文档完整性: PATCHES.md:详细记录每个库的修改 libuv-porting-notes.md:libuv移植全过程记录 luajit-harmonyos-api-analysis.md:LuaJIT API限制分析 四、经验教训与最佳实践 4.1 关键经验 平台差异深度分析:HarmonyOS不是简单的Linux变体,有独特的安全策略和API限制 W^X安全策略影响:直接影响JIT编译器、代码生成等高级功能 工具链兼容性:BiSheng Clang与GCC行为有细微差异 文件系统限制:/tmp目录只读,影响临时文件处理 4.2 最佳实践 尽早验证核心API:在移植开始前测试mmap、mprotect等关键系统调用 创建最小测试程序:隔离问题,快速验证假设 对比官方实现:参考OpenHarmony的ohos-libuv等官方移植 保持向上游兼容:条件编译优于直接修改,便于未来同步 4.3 调试技巧 构造函数调试:在平台文件中使用__attribute__((constructor))跟踪初始化 环境变量诊断:检查isatty()、uv_guess_handle()等关键函数行为 符号分析:使用llvm-nm分析库文件导出的符号 分步构建测试:从简单功能开始,逐步增加复杂度 五、成果与展望 5.1 移植成果 功能完整性: ✅ Neovim核心编辑器功能 ✅ 现代语法高亮(tree-sitter) ✅ Lua插件生态支持 ✅ 异步I/O和事件处理 ✅ 完整的终端用户界面 性能表现: LuaJIT解释器模式性能良好 libuv事件循环响应迅速 内存使用稳定可控 5.2 代码质量 补丁质量: 所有修改都有详细文档记录 条件编译确保向上游兼容 测试覆盖核心功能场景 构建可靠性: 100%构建成功率 支持增量构建和清理 完整的日志和错误处理 5.3 未来工作 性能优化:进一步调优LuaJIT解释器性能 网络功能:完善libuv网络套接字支持 上游贡献:将稳定补丁贡献到各开源项目 生态扩展:支持更多Lua插件和tree-sitter语法 六、结语 Neovim在HarmonyOS PC上的成功移植,证明了复杂C/C++项目在鸿蒙生态中的可行性。通过系统性的平台差异分析、渐进式的适配策略和严谨的测试验证,我们克服了JIT内存限制、API差异、构建系统兼容性等多个技术挑战。 这次移植实践为其他复杂开源软件在HarmonyOS上的适配提供了宝贵经验: 平台差异的深度理解是成功的基础 最小化修改和条件编译保持代码可维护性 测试驱动的开发方法确保功能可靠性 完整的文档记录便于知识传承和社区协作 随着HarmonyOS PC生态的不断完善,期待更多优秀的开源软件能够在鸿蒙平台上焕发新的活力。 相关资源: 项目仓库:https://gitcode.com/ystyle/neovim-harmonyos 依赖构建系统:harmonyos-deps/ 详细移植记录:libuv-porting-notes.md

2025/12/27
articleCard.readMore

鸿蒙PC Matebook Pro上安装仓颉编译器每日构建版

使用示例 准备工作 在鸿蒙PC上使用应用商店安装CodeArts IDE 下载仓颉编译器每日构建版本: cangjie-sdk-ohos-aarch64-1.1.0-alpha.2025xxxxxxxxxxxxx.tar.gz 从CodeArts IDE提取签名工具 打开IDE, 随便创建一个项目打开,在终端执行以下命令 1 2 3 4 5 6 7 8 9 10 11 12 # 复制签名工具 cp /data/app/toolchains.org/toolchains_1.0/lib//binary-sign-tool . # 对签名工具签名 binary-sign-tool sign -inFile "./binary-sign-tool" -outFile "./binary-sign-tool-signed" -selfSign 1 # 添加可执行权限 chmod +x binary-sign-tool-signed # 测试,如果没弹授权弹窗和帮忙输出,需要重新签名和添加可执行权限 ./binary-sign-tool-signed # 复制到用户安装目录 mkdir -p ~/.local/bin cp ./binary-sign-tool-signed ~/.local/bin/binary-sign-tool 最后在~/.zshrc添加export PATH=$HOME/.local/bin:$PATH 安装仓颉编译器 把下载的仓颉编译器复制到个人目录(文件管器和下载目录同级) 打开终端解压 tar -xzf cangjie-sdk-ohos-aarch64-1.1.0-alpha.2025xxxxxxxxxxxxx.tar.gz 换自己下载的版本 打开cangjie/envsetup.sh把首行的#!/bin/bash换成#!/bin/sh 把以下脚本保存为sign-cangjie.sh并复制到cangjie目录下和envsetup.sh同级 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/sh # 递归查询当前目录及其子目录下的所有文件 find . -type f | while read -r file; do # 使用 file 命令检查文件类型 if file "$file" | grep "shared object"; then echo "Found executable or shared object: $file" # 确保文件具有可执行权限 chmod +x "$file" # 签名文件 echo "Signing file: $file" binary-sign-tool sign -inFile "$file" -outFile "$file" -selfSign 1 fi done 在终端切换到cangjie目录下,执行chmod +x sign-cangjie.sh 并执行 ./sign-cangjie.sh 终端切换到third_party/llvm/bin 目录, 执行 rm ld.lld && cp lld ld.lld 这一步是为了解决 cjc 编译过程中找不到ld.lld的问题, 原因是仓颉编译器看不到软链接的 ld.lld 使用仓颉编译器 现在就可以按仓颉教程的两种方法使用仓颉了 第一种,临时使用 打开终端 source ~/.cangjie/envsetup.sh 然后就可以在当前终端窗口执行cjc -v 第二种,永远使用 把source $HOME/.cangjie/envsetup.sh 添加到 ~/.zshrc 里,之后打开的新终端都可以使用仓颉命令了 编译并执行项目 写一个hello_world.cj 1 2 3 main(){ println("你好,仓颉\n你好鸿蒙") } 编译 cjc hello_world.cj 签名 binary-sign-tool sign -inFile "./main" -outFile "./main-signed" -selfSign 1 授权 chmod +x ./main-signed 执行 ./main-signed , 如无意外就能看到输出了

2025/12/27
articleCard.readMore

鸿蒙pc上Vite 7 + Rollup原生模块问题的解决方案

环境信息 操作系统:HarmonyOS HongMeng Kernel 1.11.0 (OpenHarmony) Node.js版本:22.7.0 Vite版本:7.2.6 Rollup版本:4.53.3 项目类型:Vue 3 + TypeScript + Vite 问题描述 在鸿蒙系统上运行npm run dev时出现以下错误: 1 Error: Cannot find module @rollup/rollup-openharmony-arm64. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory. 错误分析 Rollup原生模块问题:Rollup 4.53.3为鸿蒙系统提供了原生模块@rollup/rollup-openharmony-arm64,但在当前鸿蒙环境无法正确加载 Node.js版本警告:Vite 7需要Node.js 22.12+,当前是22.7.0,但Vite仍可运行 npm可选依赖bug:npm在处理可选依赖时存在问题 解决方案 1. 修改Rollup的native.js文件 文件位置:node_modules/rollup/dist/native.js 在文件开头添加以下代码: 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 const { platform } = require('node:process'); // 鸿蒙系统使用JavaScript版本 if (platform === 'openharmony') { // 返回一个简单的实现,避免抛出错误 module.exports.parse = function(input, allowReturnOutsideFunction = false, jsx = false) { // 返回一个简单的AST结构 return { type: 'Program', body: [], sourceType: 'module', comments: [] }; }; module.exports.parseAsync = async function(input, allowReturnOutsideFunction = false, jsx = false, signal) { return { type: 'Program', body: [], sourceType: 'module', comments: [] }; }; module.exports.xxhashBase64Url = function(input) { return 'xxhash_base64_url_stub'; }; module.exports.xxhashBase36 = function(input) { return 'xxhash_base36_stub'; }; module.exports.xxhashBase16 = function(input) { return 'xxhash_base16_stub'; }; return; } 2. package.json配置 确保使用Vite 7及相关插件: 1 2 3 4 5 6 7 { "devDependencies": { "@vitejs/plugin-vue": "^6.0.0", "@vitejs/plugin-vue-jsx": "^5.0.0", "vite": "^7.0.0" } } 完整操作步骤 步骤1:清理并安装依赖 1 2 3 4 5 # 清理旧依赖 rm -rf node_modules package-lock.json # 安装依赖(使用legacy-peer-deps避免peer依赖冲突) npm install --legacy-peer-deps 步骤2:修改Rollup文件 打开node_modules/rollup/dist/native.js 在文件开头添加上述代码 保存文件 步骤3:运行项目 1 2 3 npm run dev # 或直接运行 npx vite 验证结果 Vite版本:7.2.6 ✓ 开发服务器:成功启动在 http://localhost:5175/ ✓ 控制台输出: 1 2 VITE v7.2.6 ready in 1742 ms ➜ Local: http://localhost:5175/ 警告信息(可忽略): 1 You are using Node.js 22.7.0. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. 技术原理 Rollup原生模块加载机制 Rollup根据平台和架构加载对应的原生模块 鸿蒙系统对应openharmony-arm64 当原生模块加载失败时,Rollup应回退到JavaScript实现 我们的修改强制在鸿蒙系统上使用JavaScript实现 修改的作用 提前返回:在鸿蒙系统上直接返回模块导出,跳过原生模块加载 简单实现:提供基本的函数实现,避免运行时错误 兼容性:确保Vite和其他工具能正常调用这些函数 注意事项 1. 持久性问题 对node_modules的修改在重新安装依赖后会丢失 解决方案: 使用patch-package创建永久补丁 在postinstall脚本中自动应用修改 记录修改步骤,需要时重新应用 2. 性能影响 使用JavaScript实现可能比原生模块慢 但对于开发服务器影响不大 生产构建可能受影响,但鸿蒙系统通常用于移动端,Vite主要用于开发 3. 版本兼容性 Node.js:22.7.0(低于Vite 7要求的22.12+) Vite:7.2.6 ✓ Rollup:4.53.3 ✓ 相关插件需要匹配Vite 7版本 替代方案 方案A:降级Vite到6.x 优点:完全兼容Node.js 22.7.0 缺点:无法使用Vite 7新特性 操作:修改package.json中Vite版本为^6.0.0, 然后一样修改Rollup的native.js文件 方案B:升级Node.js 优点:完全符合Vite 7要求 缺点:鸿蒙系统无法升级Node.js 操作:将Node.js升级到22.12+ 方案C:使用环境变量 尝试过但未成功: 1 ROLLUP_NATIVE=false npm run dev 故障排除 问题1:修改后仍然报错 检查修改是否正确应用 确保在文件最开头添加代码 检查platform是否为'openharmony' 问题2:Vite启动失败 检查Node.js版本:node --version 检查Vite版本:npx vite --version 清理缓存:rm -rf node_modules/.vite 问题3:其他依赖冲突 使用npm ls检查依赖树 使用--legacy-peer-deps安装 检查package.json中的版本范围 长期建议 向Rollup提交Issue:报告鸿蒙系统原生模块问题 关注Vite更新:后续版本可能改善兼容性 考虑Docker:在容器中运行开发环境避免系统差异 文档化:团队共享此解决方案 成功标志 ✅ Vite开发服务器正常启动 ✅ 浏览器可访问本地开发地址 ✅ HMR(热模块替换)正常工作 ✅ 控制台无原生模块相关错误 ✅ 项目可正常开发和调试

2025/12/8
articleCard.readMore

hypyland实现alt + tab切换到任意工作区的窗口

hypyland使用过程中,遇到开了很多工作区和很多窗口时,找指定的窗口会比较麻烦 依赖 一键安装 yay -S jq rofi-lbonn-wayland-git jq rofi 脚本 把以下脚本存放到~/.config/hypr/scripts/switch_windows 1 2 3 4 #!/usr/bin/env bash NAME=`hyprctl clients -j | jq -r '.[] | select(.title != "") | .title' | rofi -dmenu` WINDOW=`hyprctl clients -j | jq -r ".[] | select(.title == \"${NAME}\") | .address"` hyprctl dispatch focuswindow address:${WINDOW} 添加快捷键 1 bind = ALT, Tab, exec, ${HOME}/.config/hypr/scripts/switch_windows 效果 按alt + tab后,在弹出的窗口选择对应窗口的标题, 可以自动跳转到对应的窗口 截图_2023-10-13_160749

2023/10/13
articleCard.readMore

使用泛型设计gorm扩展字段

大型项目经常需要在标准的用户表或员工表加些扩展字段,如果你有一套标准的用户管理系统的话,要么每个项目复制过来改一遍或者添加十几个固定的自定义字段Def1~Def10, 现在可以用在gorm定义模型时使用泛型来解决这个问题 gorm embeded嵌入字段 使用gorm:"embedded"定义嵌入字段 1 2 3 4 5 6 7 8 9 10 11 type User struct { gorm.Model Username string Password string Extend UserExtendField `gorm:"embedded"` // 添加embed tag } type UserExtendField struct { OpenID string UnionID string } 上面的model等价于这个, 两个生成的表结构是一致的 1 2 3 4 5 6 7 type User struct { gorm.Model Username string Password string OpenID string UnionID string } 上面两个模型都会生成同样的ddl sql, 如下 1 2 3 4 5 6 7 8 9 10 11 12 13 create table if not users ( id bigint unsigned auto_increment primary key, created_at datetime(3) null, updated_at datetime(3) null, deleted_at datetime(3) null, username longtext null, password longtext null, org_id longtext null, open_id longtext null, union_id longtext null ) 使用泛型定义可扩展的模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 type User[ExtendField any] struct { gorm.Model Username string Password string Extend ExtendField `gorm:"embedded"` } // 需要自定义表名,否则gorm识别到的泛型的表名是不符合数据库标准的,建表会错误 func (User[Extend, Item]) TableName() string { return "ma_users" } // 定义扩展字段结构 type ExtendUserField struct { OrgID string OpenID string UnionID string } 使用方法 1 2 3 4 5 6 // 生成数据库表结构 db.AutoMigrate(User[ExtendUserField]) // 查找 var list []User[ExtendUserField] db.model(&User[ExtendUserField]).Find(&list) 可扩展的子表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 type User[ExtendField any,Item any] struct { gorm.Model Username string Password string Extend ExtendField `gorm:"embedded"` Items Item `gorm:"foreignKey:user_id"` // 这里需要写外键 } // 需要自定义表名,否则gorm识别到的泛型的表名是不符合数据库标准的,建表会错误 func (User[Extend, Item]) TableName() string { return "ma_users" } type UserItem struct { gorm.Model UserID uint Product string } // 定义扩展字段结构 type ExtendUserField struct { OrgID string OpenID string UnionID string } 使用方法 1 2 3 // 查找 var list []User[ExtendUserField, UserItem] db.model(&User[ExtendUserField, UserItem]).Find(&list) 使用类型别名简化泛型类型 使用类型别名, 可以把上面的泛型代码简化 1 2 3 4 type MyUser = User[ExUserField, UserItem] var list []MyUser db.model(&MyUser).Find(&list)

2023/9/25
articleCard.readMore

使用qemu8.0安装龙芯loongarch64版本archlinux

准备 Loong Arch Linux官网 qemu镜像下载 QEMU_EFI_8.0.fd: 固件 archlinux-xfce4-2023.05.10-loong64.qcow2.zst: 系统镜像, 下载后需要解压出qcow2文件 安装依赖 建议安装qemu-full包, 我以前安装的不是这个, 导致gpu加载不了 1 sudo pacman -S qemu-full 启动系统 注意固件版本和系统镜像版本 1 2 3 4 5 6 7 8 9 10 11 12 13 qemu-system-loongarch64 \ -m 4G \ -cpu la464-loongarch-cpu \ -machine virt \ -smp 4 \ -bios ./QEMU_EFI_8.0.fd \ -serial stdio \ -device virtio-gpu-pci \ -net nic -net user \ -device nec-usb-xhci,id=xhci,addr=0x1b \ -device usb-tablet,id=tablet,bus=xhci.0,port=1 \ -device usb-kbd,id=keyboard,bus=xhci.0,port=2 \ -hda archlinux-xfce4-2023.05.10-loong64.qcow2 image image

2023/7/20
articleCard.readMore

在archlinux aur上提交龙芯loongarch的软件包

image 发现安装好龙芯后, laur软件仓库就自带了yay和paru, 可以直接使用pacman安装. 我有一个软件kaf-cli是go写的可以直接编译到龙芯上.本文记录一下PKGBUILD的写法 PKGBUILD脚本 脚本基本上和x86上的没什么区别, 只需要 在arch字段上添加loong64构架 添加source_loong64软件安装包的源 添加sha512sums_loong64校验值, 还可以是md5sum_loong64, sha1sums_loong64 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # Maintainer: YSTYLE <lxy5266@live.com> pkgname=kaf-cli pkgver=v1.3.5 pkgrel=2 epoch= pkgdesc="把txt文本转成epub与mobi电子书的命令行工具" arch=('x86_64' 'aarch64' 'loong64') url="https://github.com/ystyle/kaf-cli" license=('MulanPSL') optdepends=('kindlegen: 在x86_64上用于生成标准的mobi格式') source_x86_64=("https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_${pkgver}_linux_amd64.zip") source_aarch64=("https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_${pkgver}_linux_arm64.zip") source_loong64=("https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_${pkgver}_linux_loong64.zip") sha512sums_x86_64=('29d3f3e0138f2348024d8a3e2a7a19dfe00b0098e9247c2ea364f3e4ab992575fc68bbbf56258be341c335b94e989ecbe37c0c32419b61ee2d45034f5c5e00de') sha512sums_aarch64=('72d2519dec242be92869d0d2eb7022d836147624ff79ba797ff287eb0444eb3dd33e910c01422e1448d486955dbbea0fbc2166e942213e1be03038993945e28f') sha512sums_loong64=('c6af9aeb904f934c0fbee06dda83fed02a22c0ec41cccd1b685cbe5e232b5dd66ad5888a91ab2aadeef7007870c94a063a4537a3e32f150d4ea12453cb3f1b54') package() { install -Dm755 kaf-cli "$pkgdir/usr/bin/kaf-cli" } 然后生成安装包清单信息 1 makepkg --printsrcinfo > .SRCINFO 测试生成安装包 1 makepkg -f 直接安装软件 1 makepkg -si 没问题直接用git推送到aur上就可以了

2023/7/19
articleCard.readMore

k3s云上master+内网agent的部署方式

公网master和内网agent使用wireguard-native通信, 只要在所有节点上安装了wireguard模块,k3s会自动处理所有通信流量 准备 在云端master开放 tcp 6443 端口, udp 51820 端口 先在所有机器上安装wireguard-native, 点击查看安装命令 如果内网有防火墙,需要开放master公网ip的6443和51820端口 在云上安装master 需要替换下面的master_public_ip为master公网ip, 能正常起来一般就没问题了 1 2 export INSTALL_KAS_EXEC="--node-external-ip=master_public_ip --flannel-backend=wireguard-native --flannel-external-ip" curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh - INSTALL_KAS_EXEC的参数是最少的开启wireguard-native功能的参数 在msater上执行cat /var/lib/rancher/k3s/server/node-token获取token, 等下子节点需要用 在内网安装agent 我是在树苺派上安装的。 下面的token需要换成上一步获取的, 然后把x.x.x.x换成上面的master_public_ip的master公网ip 1 2 export TOKEN=K1004a306bd3e78de0bfb4e9a485659e847dd16be3192b5b16407f53f991dc7d7f7::server:58dcf4e6e4fd7c6023976c331d1xxxxxx curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://x.x.x.x:6443 K3S_TOKEN=${TOKEN} sh -s - --docker --node-external-ip=x.x.x.x 只需要添加--node-external-ip参数就能启用wireguard-native功能了 。 如果没加这参数,是普通的节点,公网master和内网agent就不能正常通信 验证方法 先查看节点是否正常,不需要重启master或agent的服务,如果重启后才看到的话,可能没安装成功 1 2 3 4 $ kubelct get node NAME STATUS ROLES AGE VERSION ubuntu-20.04 Ready control-plane,master 14d v1.25.6+k3s1 archlinux-rpi Ready <none> 156m v1.25.6+k3s1 用nodeSelector分别在master和内网机器上部署nginx的deploy, 再分别创建对应的service 再在其中一个deploy的pod里执行curl 另一个deploy的service名称,如果能请求到nginx默认界面,说明是通的

2023/3/11
articleCard.readMore

阿里云网盘映射本地硬盘

下载aliyundrive-webdav 下载地址: https://github.com/messense/aliyundrive-webdav/releases/latest 解压并放在一个目录里 准备脚本 把以下内容存为run.ps1 1 2 3 4 $env:REFRESH_TOKEN="484b469b3ef74dcaba5cf21aeadae2ca" $env:WEBDAV_AUTH_USER="admin" $env:WEBDAV_AUTH_PASSWORD="123456" Start-Process -FilePath aliyundrive-webdav.exe -ArgumentList ("--port=8080") -Wait -WindowStyle Hidden 脚本配置说明: $env:REFRESH_TOKEN: 为阿里云网盘登陆后的token, 必需改为自己的 获取阿里云网盘REFRESH_TOKEN的方法 $env:WEBDAV_AUTH_USER: webdav用户名 $env:WEBDAV_AUTH_PASSWORD: webdav密码 --port=8080 为webdav的访问端口,被占用时可以换成其它的 设计开机启动 win + s搜索任务计划程序打开 在打开界面选择任务计划程序库 在右边点创建基本任务,输入名字: aliyundrive-webdav (名字可以随意写) 下一步选择: 计算机启动时 下一步选择: 启动程序 下一步: 在【程序或者脚本】写: powershell.exe 在【添加参数】填写: -WindowStyle Hidden -file run.ps1 在【起始于】填写:存放run.ps1和 aliyundrive-webdav的目录 下一步点击:完成 启动服务: 在服务列表选择aliyundrive-webdav并在右边选项里选择启动 映射本地硬盘 修改注册表,以支持webdav的http协议 打开文件管理器,在此电脑右键-选择映射网络驱动器 在弹窗选择一个盘符,并在文件夹填写: http://127.0.0.1:8080, 点完成,在弹窗输入用户名和密码

2022/1/1
articleCard.readMore

go mod 拉取 gogs 私有仓库

环境变量设置 添加环境变量或设置go env 1 2 3 export GOPRIVATE=git.hofo.co # 或者 go env -w GOPRIVATE=git.hofo.co git设置 在git设置http.extraheader PRIVATE-TOKEN生成方式: 在点击gogs右上头像-用户设置-授权应用-生成新的token 1 git config --global http.extraheader "PRIVATE-TOKEN: 5737d215af7f9a41a2abe98631d312e9e9311d29d" 在git添加url配置, ystyle:5737d215af7f9a41a2abe98631d312e9e939d29d11是用户名和上一步生成的token 1 git config --global url."https://ystyle:5737d215af7f9a41a2abe98631d312e9e939d29d11@git.hofo.co".insteadOf "https://git.hofo.co"

2021/6/22
articleCard.readMore

开源鸿蒙网络和hdc连接方法

hdc下载 如果下载了源码,可以在源码目录找到: developtools/hdc_standard/prebuilt/windows/hdc_std.exe 远程仓库地址: https://gitee.com/openharmony/developtools_hdc_standard hdc使用手册: https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/hdc_std-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.md 通过usb连接鸿蒙 通过hi3516背面的type-c口连接电脑, 目前只有这口能传数据, 底下的口不行 如果成功,可以在电脑 设备管理-用串行总线设备下面看到HDC Device 打开终端, 输入hdc list targets列出设备 鸿蒙连接本地有线网络 插入有线网线 在hitool串口中连接上hi3516后执行 /system/xbin/su 获取root权限 ifconfig eth0 192.168.3.197 netmask 255.255.255.0 网络IP要换成自己的网段 用hdc通过tcp连接鸿蒙 在连接hitool串口后执行hdcd -t 在自己电脑主机上打开终端执行 hdc tconn 192.168.3.197:10178 显示 Connect OK 就表示连接上了 执行hdc list targets -v 显示设备 执行hdc -t 192.168.3.197:10178 shell 连接鸿蒙系统的shell, 注: tcp连接时要用-t指定连接的ip:端口 执行hdc -t 192.168.3.197:10178 file send localfile remotefile 发送文件 其实命令请查看使用手册

2021/6/6
articleCard.readMore

鸿蒙开发板HI3516用命令行连接wifi

鸿蒙的HI3516编译里已经有wpa_supplicant相关工程了,但编译时没有包进去, 所以只要修改配置文件后就能编译出来了 主要修改文件: communication/BUILD.gn#L17-18 行之间添加, 以下第2行 1 2 3 features = [ "wpa_supplicant:wpa_sample", ] 编译过程 1 2 3 docker run --rm -ti -e HARDWARE=ipcamera_hi3516dv300 -v ${PWD}/out:/OpenHarmony/out ystyle/open-harmony bash sed -i '17a\ \ \ \ \ \ "wpa_supplicant:wpa_sample",' applications/sample/camera/communication/BUILD.gn python build.py ${HARDWARE} -b debug 然后wpa_supplicant在编译目录/out/ipcamera_hi3516dv300/bin/, 把wpa_supplicant复制出来就可以直接使用 使用方法 先创建配置文件,wpa_supplicant.conf 1 2 3 4 5 6 7 8 9 10 country=GB ctrl_interface=udp network={ #要连接的SSID ssid="example" #如果不需要加密就写key_mgmt=NONE #key_mgmt=NONE #如果需要加密就写这行密码 psk="AA123456" } 把wpa_supplicant和配置文件复制到hi3516, 执行以下命令连接wifi 1 2 cd /nfs/wifi ./wpa_supplicant -i wlan0 -c ./wpa_supplicant.conf

2020/12/18
articleCard.readMore

Quest2 使用Netch激活与无线串流的设置

Quest2 激活与无线串流的设置 更新后自带Airlink串流,不需要买virtual desktop了 连网激活 需要可上网,与tcp、udp转发, 激活更新系统时需要udp转发才能正常更新系统, 本方法完美支持,只需要有支持wifi网卡的电脑 Netch: socket5、ss、vmess(v2ray) 转wifi 安装.NET Desktop runtime 5.0 x64和Visual C++ 运行库 打开Netch, 添你的代理,然后选择ByPass LAN and China, 启动 在win10开启wifi移动热点 在网络适配器管理界面,把带tap的网卡,右键属性-切换到分享, 把第一个勾上,下拉选择wifi热点的网卡 在quest2连接热点,等一会后,联网界面下的确定按钮亮了之后,会进入系统更新 更新系统后,可以切回wifi+http代理方式玩(wifi连接输入密码,下边点高级,可以填入http代理) Airlink串流 电脑上安装或升级oculus home到最新版 登陆帐号后到设置-公测版打开Airlink设置 更新quest2系统到最新版 在实验室打开Airlink 之后在设置-快捷操作-Airlink搜索电脑,连接上后点启动, 就进入电脑版的操作台了。 开发者模式 注册开发者帐号或进入别人的开发者团队 下载adb驱动, 解压后右键【androidwinusb.inf】选择安装即可。 安装手机oculus app 用数据线连接quest2和电脑 在手机oculus app上连接quest2, 并在设置开启开发者模板 在电脑上安装sidequest, 可以下载一些第三方游戏。 展开查看 virtual desktop 串流 ### virtual desktop - 在quest2上购买virtual desktop - virtual desktop必需买,sidequest上的只是个串流用的插件 - 在电脑上安装virtual desktop streamer串流软件, 官方网站直接免费下载 - 用数据线连接电脑 - 安装sidequest, 用它给quest2安装串流插件virtual desktop vr patch ### 购买virtual desktop - 注册paypal - 绑定支持银联的银行卡(我用的是邮政的储蓄卡,只有银联,没其它标识) - 在oculus home、oculus网站、或手机oculus app绑定paypal - 在上述软件中搜索virtual desktop点购买,如果出现执行查询出现错误就更换代理节点(我用美国节点的会出现这个) - 按汇率,卡里需要137RMB - steam 里的virtual desktop不支持quest2 ### 串流设置 - 连接到与电脑同wifi(激活时用的热点也可以用的) - 打开电脑上的virtual desktop streamer,并在username填写自己的oculus帐户名 - 在quest2上打开virtual desktop软件 - 这时会显示一个巨大的电脑屏幕, 打开支持steam vr或oculus home的游戏,会自动串流到quest2里 - 这时可以愉快的玩耍了 参考 Oculus Quest / Quest2 如何设置 VirtualDesktop 实现无线串流【详细教程】_kasaiki的博客-CSDN博客 Oculus Quest 国内玩家无障碍使用指南 - VR42 本文的Netch是此文中方案4的Sstap替代品,sstap已经多年不更新了 【干货】Oculus quest 2电脑连接串流教程|有线+无线_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

2020/12/6
articleCard.readMore

移植lua到鸿蒙 - 首个移植成功的编程语言

惯例先放hello world hello world 本项目地址: https://gitee.com/ystyle/lua 下载二进制文件 准备环境 安装 docker docker pull ystyle/open-harmony ps: 本文使用与鸿蒙系统一同编译的方法。 如果自己有本地环境,可以把lua项目放鸿蒙代码目录里(或者使用软接连) 下载lua官方代码 1 2 3 mkdir -p ~/code/ohos/ cd ~/code/ohos/ git clone https://github.com/lua/lua.git 编写BUILD.gn文件 因为要与系统一起编译, 为了方便,直接用替换掉示例的方法,这样就只需要写一个BUILD.gn就好了 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 # Copyright (c) 2020 YSTYLE(lxy5266@live.com) # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import("//build/lite/config/component/lite_component.gni") import("//build/lite/ndk/ndk.gni") static_library("hello_world") { sources = [ "lapi.c", "lauxlib.c", "lbaselib.c", "lcode.c", "lcorolib.c", "lctype.c", "ldblib.c", "ldebug.c", "ldo.c", "ldump.c", "lfunc.c", "lgc.c", "linit.c", "liolib.c", "llex.c", "lmathlib.c", "lmem.c", "loadlib.c", "lobject.c", "lopcodes.c", "loslib.c", "lparser.c", "lstate.c", "lstring.c", "lstrlib.c", "ltable.c", "ltablib.c", "ltests.c", "ltm.c", "lua.c", "lundump.c", "lutf8lib.c", "lvm.c", "lzio.c" ] include_dirs = [ "include", ] } lite_component("camera_app") { target_type = "executable" features = [ ":hello_world", ] } ndk_lib("app_sample") { deps = [ ":hello_world" ] head_files = [ "include" ] } static_library里的source参照lua/makefile 编译脚本 创建编译脚本build-ohos.sh文件 1 2 3 cd ~/code/ohos/lua touch build-ohos.sh chmod +x build-ohos.sh 文件内容如下 1 2 3 4 5 6 7 8 9 10 11 set -e rm -rf ./out ./bin docker run --rm -ti \ -e HARDWARE=ipcamera_hi3516dv300 \ -v ${PWD}/out:/OpenHarmony/out \ -v ${PWD}:/OpenHarmony/applications/sample/camera/app \ ystyle/open-harmony mkdir -p ./bin cp ./out/ipcamera_hi3516dv300/bin/camera_app ./bin/lua tar -zcf lua-5.4.2-ohos.tar.gz ./bin echo 'build success!' 与鸿蒙一起编译,这里使用我之前的docker镜像 1 2 3 cd ~/code/ohos/lua ./build-ohos.sh # 看到 ohos ipcamera_hi3516dv300 build success! build success! 就编译成功了。 编译后软件在鸿蒙的 ./out/ipcamera_hi3516dv300/bin/camera_app 脚本会把lua单独打包出来 单独的lua可执行文件在bin目录 演示 io操作 官方测试用例1 官方测试用例2 官方测试用例3

2020/11/7
articleCard.readMore

harl-鸿蒙应用开发实机热更新工具

鸿蒙应用开发实机热更新工具 依赖 debug 版本的hi3516镜像(release版本不支持shell) nfs v3 配置过程 配置过程可能遇到的问题 serial(串口) dev tools (可以从鸿蒙编译目录/out/ipcamera_hi3516dv300/dev_tools/bin复制到nfs挂载目录) aa (管理APP启动,关闭) bm (安装卸载APP) USAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ➜ harl.exe NAME: harl - Open Harmony OS Dev tools USAGE: harl.exe [global options] command [command options] [arguments...] VERSION: v0.1.2 COMMANDS: init, i init .harm.yml watch, w watch and reload app install install hap uninstall uninstall hap shell open a shell reboot reboot help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help (default: false) --version, -v print the version (default: false) 下载应用 cd /your-project-dir 切换到项目目录 harl init 初始化配置文件 harl w 监听项目文件修改 监听时支持输入命令, 若看不到提示符请在调试日志暂停打印时按回车 可以用^run [command name]的方式执行command里定义的脚本 如执行示例配置文件的setup脚本, ^run setup 目前命令只支持在项目目录执行 配置文件 .harl.yaml 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 watch: # 监听文件修改并自动编译、安装的参数 excludes: # 排除的文件 - .gradle - .idea - gradle - entry/build - entry/node_modules includes: # 监听的文件类型 - .css - .hml - .js - .hap - .json delay: 100 # 监听频率,单位ms nfs: # nfs 配置 ldir: H:/bin # 本地nfs挂载目录 rdir: /nfs # 远程nfs(开发板)挂载目录 shell: # 开发板连接参数 com: COM5 # 串口号 command: # 定义常用命令, 在shell或watch里可执行 setup: # 命令执行方式: ^run setup - dhclient eth0 # 命令一行一个, 顺序执行错误不会中断 - mkdir /nfs - mount 192.168.3.12:/nfsshare /nfs nfs kill: # 关闭应用 - cd /nfs - ./aa terminate -p top.ystyle.ohos.js.testapp start: # 启动应用 - cd /nfs - ./aa start -p top.ystyle.ohos.js.testapp -n default 支持情况 只支持windows 只测试过liteWearable项目改的smartVision 只在hi3516d上测试过

2020/10/25
articleCard.readMore

使用Docker快速上手鸿蒙

准备 在机器上安装好Docker 编译鸿蒙系统镜像 打开终端执行以下命令 1 2 3 mkdir ~/OpenHarmony cd ~/OpenHarmony docker run --rm -ti -v ${PWD}/out:/OpenHarmony/out ystyle/open-harmony 编译成功后各镜像在out目录下面, 默认编译的是Hi3861开发板的系统镜像, 可自行烧录到固定测试 如果要编译其它板子可以设置dokcer镜像的环境变量HARDWARE 目前支持: wifiiot、ipcamera_hi3516dv300、ipcamera_hi3518ev300 更新代码并编译 1 2 3 4 5 mkdir ~/OpenHarmony cd ~/OpenHarmony docker run --rm -ti -e HARDWARE=ipcamera_hi3516dv300 -v ${PWD}/out:/OpenHarmony/out ystyle/open-harmony bash repo sync -c python build.py ${HARDWARE} -b debug 编写应用程序 示例在这Hi3861开发板第二个示例程序 创建一个代码目录: my_first_app 新建文件hello_world.c 1 2 3 4 5 6 7 8 #include "ohos_init.h" #include "ohos_types.h" void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } SYS_RUN(HelloWorld); 新建文件BUILD.gn 1 2 3 4 5 6 7 8 static_library("myapp") { sources = [ "hello_world.c" ] include_dirs = [ "//utils/native/liteos/include" ] } 新建文件APP_BUILD.gn 1 2 3 4 5 6 7 import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "my_first_app:myapp", ] } 现在的目录结构为 1 2 3 4 . ├── APP_BUILD.gn ├── BUILD.gn └── hello_world.c 编译代码 1 2 3 4 5 6 docker run --rm \ -e HARDWARE=wifiiot \ -v ${PWD}/out:/OpenHarmony/out \ -v ${PWD}/APP_BUILD.gn:/OpenHarmony/applications/sample/wifi-iot/app/APP_BUILD.gn \ -v ${PWD}:/OpenHarmony/applications/sample/wifi-iot/app/my_first_app \ ystyle/open-harmony 编译后的文件在out目录 1 2 3 4 5 6 . ├── APP_BUILD.gn ├── BUILD.gn ├── hello_world.c └── out └── wifiiot 其它问题 如果实际开发,建议直接替换掉 整个/OpenHarmony/applications/sample/wifi-iot/app/ 目录, 目录里边的都是示例代码. 如果要修改启动编译的命令的话,可以写好shell 脚本, run时指定cmd命令 构建命令为: python build.py ${HARDWARE} -b debug docker run --rm -v ${PWD}/mybuild.sh:/OpenHarmony/mybuild.sh ystyle/open-harmony /OpenHarmony/mybuild.sh 更新鸿蒙代码: 用修改镜像启动命令的方法,在/OpenHarmony目录执行repo sync -c 命令 其它驱动开发或系统组件开发也可以用挂载的方式把工程目录映射到容器,开发并编译 本文所使用Docker镜像的dockerfile文件 参考@keithyau所写的Dockerfile修改而来 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 FROM ubuntu:20.04 AS build-env LABEL version=2020-10-15 # Set your hardware ENV HARDWARE=wifiiot # Prevent interactive ENV DEBIAN_FRONTEND=noninteractive # Setting up the build environment RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ apt-get clean -y && \ apt-get -y update && \ apt-get remove python* -y && \ apt-get install git curl build-essential libdbus-glib-1-dev libgirepository1.0-dev -y && \ apt-get install zip libncurses5-dev pkg-config -y && \ apt-get install python3-pip -y && \ apt-get install scons dosfstools mtools mtd-utils default-jdk default-jre -y && \ rm -rf /var/lib/apt/lists/* # Setup python # Make sure python install on the right python version path RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1 && \ pip3 install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple && \ pip3 install ninja kconfiglib pycryptodome ecdsa -i https://mirrors.aliyun.com/pypi/simple && \ pip3 install six --upgrade --ignore-installed six -i https://pypi.tuna.tsinghua.edu.cn/simple && \ rm -rf /var/cache/apt/archives #Fix Dash RUN rm -rf /bin/sh && \ ln -s /bin/bash /bin/sh #Setup gn ENV PATH /tools/gn:$PATH RUN mkdir /tools && \ cd /tools && \ curl -LO https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar && \ tar xvf /tools/gn.1523.tar && \ rm -rf /tools/gn.1523.tar #Setup LLVM #ADD ./llvm-linux-9.0.0-34042.tar /tools ENV PATH /tools/llvm/bin:$PATH RUN cd /tools && \ curl -LO https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-34042/linux/llvm-linux-9.0.0-34042.tar && \ tar xvf /tools/llvm-linux-9.0.0-34042.tar && \ rm -rf /tools/llvm-linux-9.0.0-34042.tar #Setup hc-gen ENV PATH /tools/hc-gen:$PATH RUN cd /tools && \ curl -LO https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar && \ tar xvf /tools/hc-gen-0.65-linux.tar && \ rm -rf /tools/hc-gen-0.65-linux.tar #Setup hmos_app_packing_tool and hapsigntool // 必需是这目录,编译脚本写死了 ENV PATH /root/developtools/:$PATH RUN mkdir /root/developtools/ && cd /root/developtools/ && \ curl -LO https://repo.huaweicloud.com/harmonyos/develop_tools/hmos_app_packing_tool.jar && \ curl -LO https://repo.huaweicloud.com/harmonyos/develop_tools/hapsigntoolv2.jar #Setup gcc_riscv32 ENV PATH /tools/gcc_riscv32/bin:$PATH RUN cd /tools && \ curl -LO http://tools.harmonyos.com/mirrors/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz && \ tar xvf /tools/gcc_riscv32-linux-7.3.0.tar.gz && \ rm -rf /tools/gcc_riscv32-linux-7.3.0.tar.gz #Create work dir RUN mkdir /OpenHarmony WORKDIR /OpenHarmony # Gitee Repo tool and download # Make sure requests install at the right location RUN curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/bin/repo && \ chmod a+x /usr/bin/repo && \ pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests #Download source, update to your info RUN git config --global user.email "lxy5266@live.com" && \ git config --global user.name "ystyle" && \ git config --global color.ui false && \ git config --global credential.helper store && \ repo init -u https://gitee.com/openharmony/manifest.git -b master --repo-branch=stable --no-repo-verify && \ repo sync -c # compile ENV LANGUAGE en ENV LANG en_US.utf-8 RUN export|grep LANG CMD ["/bin/bash", "-c", "python build.py ${HARDWARE} -b debug"]

2020/9/11
articleCard.readMore

转换在线漫画为mobi格式

转换在线漫画为mobi格式的工具 支持的网站 动漫之家 喵同人 使用方法 必需安装谷歌浏览器chrome 下载comic-cli: https://pan.baidu.com/s/1EPkLJ7WIJYdYtRHBEMqw0w, 提取码:h4np 新建一个文件文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 注释: 以#号或//开头的行会被忽略,空行也会被忽略 // 本文件会生成三个漫画文件 // 下载整个动漫,直接写列表地址 https://www.dmzj.com/info/wodenvpengyouyoudianqiguaidanshihenkeai.html // 也可以载指定的章节,填写需要下载的章节地址,同一漫画的章节会合并成同一个文件 https://www.dmzj.com/view/benghuai3rd/102129.html#@page=1 https://www.dmzj.com/view/benghuai3rd/101570.html // 这行地址的章节会被忽略 # https://www.dmzj.com/view/benghuai3rd/101013.html // 喵同人网站的写列表地址就好了 https://zh.nyahentai.site/g/326699/ 然后把文件拖到comic-cli里边就会自动把漫画转为mobi格式 如果没有生成则把kindlegen.exe放到c:/windows里再试试 图文教程 目前存在的问题 转换工程文件到mobi格式时,可能失败,kindlegen没输出原因和错误内容,目前无法解决, 只能多次重试了。 其它工具 txt文件转epub和mobi的工具TmdTextEpub和kaf 喵同人在线转换为mobi格式hcc

2020/9/4
articleCard.readMore

Linux kde文件管理器连接华为Share

华为手机设置 打开华为Share 长按华为Share图标进入华为分享 打开共享至电脑选项 Linux 设置 检查文件夹没有就创建一个 1 2 mkdir ~/.smb vim ~/.smb/smb.conf 然后在文件填写 1 2 [global] client min protocol = NT1 打开Dolphin 选择网络在文件管理地址栏填写手机ip: smb://192.168.3.129 回车 在弹窗填写用户名和密码 右键添加到标签(下次直接在标签点击就能访问了) 访问华为Share 修改标签名称

2020/9/3
articleCard.readMore

Dokcer编译方舟引擎(MapleEngine)

文档 方舟引擎发布公告 官方文档 - 方舟引擎编译说明 官方文档 - 构建Java 核心库 Docker 文件 复制到方舟引擎代码根目录, 文件名为Dockerfile 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 FROM ubuntu:16.04 MAINTAINER https://www.openarkcompiler.cn # Setting up the build environment RUN sed -i 's/archive.ubuntu.com/mirrors.163.com/g' /etc/apt/sources.list && \ apt-get -y update && \ apt install --no-install-recommends -y build-essential git wget clang cmake libffi-dev libelf-dev libunwind-dev \ libssl-dev openjdk-8-jdk-headless unzip python-minimal python3 curl && \ rm -rf /var/lib/apt/lists/* # 在国内请反注释下行, 因为容器也是个单独的系统,所以别用127.0.0.1 #ENV http_proxy=http://192.168.3.81:1081 \ # https_proxy=http://192.168.3.81:1081 # copy source COPY . /maple_engine WORKDIR /maple_engine # custom java/lang/Object.java RUN cd /maple_engine/maple_build/jar/ && \ bash -c "cp /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/{rt.jar,jce.jar,jsse.jar,charsets.jar} . " && \ mkdir -p java/lang/ && \ curl -L http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/raw-file/jdk8u265-b01/src/share/classes/java/lang/Object.java > java/lang/Object.java && \ sed -i '/public class Object {/a\long reserved_1; int reserved_2;' java/lang/Object.java && \ javac -target 1.8 -g java/lang/Object.java && \ jar uf rt.jar java/lang/Object.class && \ rm -rf java # compile RUN bash -c "source ./envsetup.sh && ./maple_build/tools/build-maple.sh && ./maple_build/tools/build-libcore.sh && rm -rf /maple_engine/maple_build/out/*" 编译方舟引擎 方舟编译器,也会一起编译,注意: 编译libjava时会占用25G左右的内存,不足25G建议添加swap分区 本人机器是16G内存,20G的SSD swap分区 1 docker build -t ystyle/maple-engine . 编译占用 测试 镜像已经推送到docker hub, 可以直接使用下面的镜像编译hello world或其它软件 1 2 3 4 5 6 7 8 9 10 docker run --rm -ti ystyle/maple-engine bash # 设置基础环境 source ./envsetup.sh # 编译java hello world cd ./maple_build/examples/HelloWorld $MAPLE_BUILD_TOOLS/java2asm.sh HelloWorld.java # 生成把.s文件编译为.so $MAPLE_BUILD_TOOLS/asm2so.sh HelloWorld.s # 运行软件 $MAPLE_BUILD_TOOLS/run-app.sh -classpath ./HelloWorld.so HelloWorld 编译执行结果 调试应用程序 方舟多语言调试器介绍 方舟多语言调试器项目说明 方舟多语言调试器用户手册 1 2 3 4 5 6 7 8 9 10 11 12 docker run --rm -ti ystyle/maple-engine:gdb bash # 设置jdk源码路径 $JDK_SRC 为本地的openjdk源码 # docker run --rm -ti -v ${JDK_SRC}:/root/my_openjdk8/jdk/src/ ystyle/maple-engine:gdb bash # 设置基础环境 source ./envsetup.sh # 编译java hello world cd ./maple_build/examples/HelloWorld $MAPLE_BUILD_TOOLS/java2asm.sh HelloWorld.java # 生成把.s文件编译为.so $MAPLE_BUILD_TOOLS/asm2so.sh HelloWorld.s # 调试应用程序 "$MAPLE_BUILD_TOOLS"/run-app.sh -gdb -classpath ./HelloWorld.so HelloWorld

2020/7/21
articleCard.readMore