OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1
OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1
参考laval社区的文章:OpenHarmony带你玩转DeepSeekR1大模型
文章目录
- OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1
- 前言
- 一、前期准备
- 二、获取源码
- 1.错误示范
- 2.下载
- 三、编译llama.cpp
- 1.生成makefile
- 2.编译
- 四、模型文件下载
- 五、设备上运行
- 总结
前言
开始上手OpenHarmony上的AI,前期调研了一下AI在OH上的发展,过程中找到了laval上的这篇文章,想着在riscv架构的设备上实现以下,于是有了本篇文章。
调研情况可以参见该文章:《还没写,之后补上》
一、前期准备
- 烧录了OH的riscv架构设备(荔枝派,rvbook,进迭时空的musepaper等,qemu不确定)
- HDC(华为官方获取即可)
- 适配了riscv的OHOS-sdk(musepaper-5.0.0分支)
二、获取源码
1.错误示范
开始从gitee上找的llama.cpp,结果编译出来后在设备上运行时加载模型报错,猜测是分支问题,于是自行扶墙从github上下载。
2.下载
https://github.com/ggml-org/llama.cpp
配置了密钥的可以直接
git clone https://github.com/ggml-org/llama.cpp.git
没配置的直接在页面上下载master分支的zip即可。然后解压
无法扶墙的朋友看过来:https://download.csdn.net/download/qqq1112345/90576842
三、编译llama.cpp
1.生成makefile
进入llama目录,使用以下命令生成llama的makefile,工具链目录自行修改
root@liusai-ubuntu-01:/opt/liusai/llama.cpp-master# /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/build-tools/cmake/bin/cmake
-DCMAKE_TOOLCHAIN_FILE=/opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/build/cmake/ohos.toolchain.cmake
-DOHOS_ARCH=riscv64
-DOHOS_ABI=riscv64-unknown-ohos
-DCMAKE_C_COMPILER=/opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang
-DCMAKE_CXX_COMPILER=/opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang
-B build
– The C compiler identification is Clang 15.0.4
– The CXX compiler identification is Clang 15.0.4
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Found Git: /usr/bin/git (found version “2.34.1”)
fatal: not a git repository (or any parent up to mount point /opt)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
fatal: not a git repository (or any parent up to mount point /opt)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
– Setting GGML_NATIVE_DEFAULT to OFF
– Performing Test CMAKE_HAVE_LIBC_PTHREAD
– Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
– Check if compiler accepts -pthread
– Check if compiler accepts -pthread - yes
– Found Threads: TRUE
– ccache found, compilation results will be cached. Disable with GGML_CCACHE=OFF.
– CMAKE_SYSTEM_PROCESSOR: aarch64
– Including CPU backend
– ARM detected
– Performing Test GGML_COMPILER_SUPPORTS_FP16_FORMAT_I3E
– Performing Test GGML_COMPILER_SUPPORTS_FP16_FORMAT_I3E - Failed
– Adding CPU backend variant ggml-cpu:
fatal: not a git repository (or any parent up to mount point /opt)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
fatal: not a git repository (or any parent up to mount point /opt)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
– Looking for pthread_create in pthreads
– Looking for pthread_create in pthreads - not found
– Looking for pthread_create in pthread
– Looking for pthread_create in pthread - found
CMake Warning at common/CMakeLists.txt:32 (message):
Git repository not found; to enable automatic generation of build info,
make sure Git is installed and the project is a Git repository.
– Configuring done (1.1s)
– Generating done (0.1s)
CMake Warning:
Manually-specified variables were not used by the project:
OHOS_ABI
– Build files have been written to: /opt/liusai/llama.cpp-master/build
编译gitee上这个版本https://gitee.com/src-openeuler/llama.cpp
使用的是
root@liusai-ubuntu-01:/opt/liusai/llama.cpp/llama# /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/build-tools/cmake/bin/cmake
-DCMAKE_TOOLCHAIN_FILE=/opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/build/cmake/ohos.toolchain.cmake
-DANDROID_ABI=riscv64
-DANDROID_PLATFORM=OHOS
-DCMAKE_C_FLAGS=“-march=rv64g”
-DCMAKE_CXX_FLAGS=“-march=rv64g”
-DGGML_OPENMP=OFF
-DGGML_LLAMAFILE=OFF
-B build
– The C compiler identification is Clang 15.0.4
– The CXX compiler identification is Clang 15.0.4
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/llvm/bin/clang++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Found Git: /usr/bin/git (found version “2.34.1”)
– Performing Test CMAKE_HAVE_LIBC_PTHREAD
– Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
– Check if compiler accepts -pthread
– Check if compiler accepts -pthread - yes
– Found Threads: TRUE
– ccache found, compilation results will be cached. Disable with GGML_CCACHE=OFF.
– CMAKE_SYSTEM_PROCESSOR: aarch64
– Including CPU backend
– ARM detected
– Performing Test COMPILER_SUPPORTS_FP16_FORMAT_I3E
– Performing Test COMPILER_SUPPORTS_FP16_FORMAT_I3E - Failed
– Adding CPU backend variant ggml-cpu:
– Looking for pthread_create in pthreads
– Looking for pthread_create in pthreads - not found
– Looking for pthread_create in pthread
– Looking for pthread_create in pthread - found
CMake Warning at common/CMakeLists.txt:32 (message):
Git repository not found; to enable automatic generation of build info,
make sure Git is installed and the project is a Git repository.
– Configuring done (2.0s)
– Generating done (0.1s)
– Build files have been written to: /opt/liusai/llama.cpp/llama/build
注意,riscv架构使用的是-DCMAKE_C_FLAGS=“-march=rv64g”
2.编译
用以下命令即可,没有报错
/opt/liusai/musepaper-5.0.0/prebuilts/ohos-sdk/linux/12/native/build-tools/cmake/bin/cmake --build build --config Release
想编译过程中没有warning的话,在编译配置中指定llvm的路径应该就可以。
同样,进入build目录查看编译产物架构
四、模型文件下载
在魔塔社区https://modelscope.cn/中下载DeepSeek-R1-Distill-Qwen-1.5B-GGUF模型
我贴的详细点,不然还得稍微找一下。按照laval文章中,模型库->模型文件,搜索“DeepSeek-R1-Distill-Qwen-1.5B-GGUF”,然后下载大小为1.12G的那个,其他的模型本人没有测试,感兴趣的可以下载一下看看模型加载后运行过程中有没有区别。
https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/files
五、设备上运行
hdc连上OH设备后
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libggml.so /lib/
[Fail]Error opening file: read-only file system, path:/lib//libggml.so
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libggml.so /lib
[Fail]Error opening file: illegal operation on a directory, path:/lib
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc target mount //增加权限否则会像上面那样报错
Mount finish
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libggml.so /lib/
FileTransfer finish, Size:107136, File count = 1, time:17ms rate:6302.12kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc shell ls /lib/
chipset-pub-sdk
chipset-sdk
extensionability
firmware
ld-musl-aarch64.so.1
ld-musl-arm.so.1
ld-musl-riscv64.so.1
libggml.so
media
module
ndk
platformsdk
seccomp
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libggml-base.so /lib/
FileTransfer finish, Size:518192, File count = 1, time:47ms rate:11025.36kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libggml-cpu.so /lib/
FileTransfer finish, Size:357856, File count = 1, time:35ms rate:10224.46kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libllama.so /lib/
FileTransfer finish, Size:1959784, File count = 1, time:153ms rate:12809.05kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send libllava_shared.so /lib/
FileTransfer finish, Size:528624, File count = 1, time:48ms rate:11013.00kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send llama-cli /data/
FileTransfer finish, Size:1560432, File count = 1, time:123ms rate:12686.44kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send llama-server /data/
FileTransfer finish, Size:3484456, File count = 1, time:255ms rate:13664.53kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf /mnt/
FileTransfer finish, Size:1117320576, File count = 1, time:74188ms rate:15060.66kB/s
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc shell
# cd data
# ls
app llama-cli lost+found power update
bluetooth llama-server misc samgr updater
chipset local module_update service vendor
data log nfc system
# chmod -R 777 llama-cli llama-server
一共五个动态库文件,两个进程文件和一个模型文件。
动态库文件放于/lib目录下,该目录貌似是软链接至/sysyem/lib的。
进程文件放于/data目录下。
由于设备data目录空间不足,gguf放于/mnt目录下。
运行后报错:
./llama-cli -m /mnt/DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf <
Error loading shared library libc++_shared.so: No such file or directory (needed by ./llama-cli)
Error loading shared library libc++_shared.so: No such file or directory (needed by /system/lib/libllama.so)
Error loading shared library libc++_shared.so: No such file or directory (needed by /system/lib/libggml.so)
Error loading shared library libc++_shared.so: No such file or directory (needed by /system/lib/libggml-cpu.so)
Error loading shared library libc++_shared.so: No such file or directory (needed by /system/lib/libggml-base.so)
Error relocating /system/lib/libllama.so: _Znwm: symbol not found
Error relocating /system/lib/libllama.so: _ZdlPv: symbol not found
Error relocating /system/lib/libllama.so: _Znam: symbol not found
Error relocating /system/lib/libllama.so: _ZdaPv: symbol not found
Error relocating /system/lib/libllama.so: _ZNKSt4__n112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcm: symbol not found
Error relocating /system/lib/libllama.so: ZNSt4__n112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_mmRKS4: symbol not found
Error relocating /system/lib/libllama.so: ZNSt4__n112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5: symbol not found
在sdk中找到./prebuilts/ohos-sdk/linux/12/native/llvm/lib/riscv64-linux-ohos/c++/libc++_shared.so同样放入/lib目录
PS C:\Users\刘赛\Desktop\AI\llama\riscv64> hdc file send
libc++_shared.so /lib/
再次运行,贴一下正常运行发日志
build: 0 (unknown) with OHOS (dev) clang version 15.0.4 (llvm-project 27758cb0b7fa926968c05dbdce074da617e2408b) for x86_64-unknown-linux-gnu
main: llama backend init
main: load the model and apply lora adapter, if any
llama_model_loader: loaded meta data with 27 key-value pairs and 339 tensors from /mnt/DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen2
llama_model_loader: - kv 1: general.type str = model
llama_model_loader: - kv 2: general.name str = DeepSeek R1 Distill Qwen 1.5B
llama_model_loader: - kv 3: general.organization str = Deepseek Ai
llama_model_loader: - kv 4: general.basename str = DeepSeek-R1-Distill-Qwen
llama_model_loader: - kv 5: general.size_label str = 1.5B
llama_model_loader: - kv 6: qwen2.block_count u32 = 28
llama_model_loader: - kv 7: qwen2.context_length u32 = 131072
llama_model_loader: - kv 8: qwen2.embedding_length u32 = 1536
llama_model_loader: - kv 9: qwen2.feed_forward_length u32 = 8960
llama_model_loader: - kv 10: qwen2.attention.head_count u32 = 12
llama_model_loader: - kv 11: qwen2.attention.head_count_kv u32 = 2
llama_model_loader: - kv 12: qwen2.rope.freq_base f32 = 10000.000000
llama_model_loader: - kv 13: qwen2.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 14: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 15: tokenizer.ggml.pre str = deepseek-r1-qwen
llama_model_loader: - kv 16: tokenizer.ggml.tokens arr[str,151936] = [“!”, “”", “#”, “$”, “%”, “&”, “'”, …
llama_model_loader: - kv 17: tokenizer.ggml.token_type arr[i32,151936] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
llama_model_loader: - kv 18: tokenizer.ggml.merges arr[str,151387] = [“臓 臓”, “臓臓 臓臓”, “i n”, “臓 t”,…
llama_model_loader: - kv 19: tokenizer.ggml.bos_token_id u32 = 151646
llama_model_loader: - kv 20: tokenizer.ggml.eos_token_id u32 = 151643
llama_model_loader: - kv 21: tokenizer.ggml.padding_token_id u32 = 151654
llama_model_loader: - kv 22: tokenizer.ggml.add_bos_token bool = true
llama_model_loader: - kv 23: tokenizer.ggml.add_eos_token bool = false
llama_model_loader: - kv 24: tokenizer.chat_template str = {% if not add_generation_prompt is de…
llama_model_loader: - kv 25: general.quantization_version u32 = 2
llama_model_loader: - kv 26: general.file_type u32 = 15
llama_model_loader: - type f32: 141 tensors
llama_model_loader: - type q4_K: 169 tensors
llama_model_loader: - type q6_K: 29 tensors
print_info: file format = GGUF V3 (latest)
print_info: file type = Q4_K - Medium
print_info: file size = 1.04 GiB (5.00 BPW)
load: special_eos_id is not in special_eog_ids - the tokenizer config may be incorrect
load: special tokens cache size = 22
load: token to piece cache size = 0.9310 MB
print_info: arch = qwen2
print_info: vocab_only = 0
print_info: n_ctx_train = 131072
print_info: n_embd = 1536
print_info: n_layer = 28
print_info: n_head = 12
print_info: n_head_kv = 2
print_info: n_rot = 128
print_info: n_swa = 0
print_info: n_swa_pattern = 1
print_info: n_embd_head_k = 128
print_info: n_embd_head_v = 128
print_info: n_gqa = 6
print_info: n_embd_k_gqa = 256
print_info: n_embd_v_gqa = 256
print_info: f_norm_eps = 0.0e+00
print_info: f_norm_rms_eps = 1.0e-06
print_info: f_clamp_kqv = 0.0e+00
print_info: f_max_alibi_bias = 0.0e+00
print_info: f_logit_scale = 0.0e+00
print_info: f_attn_scale = 0.0e+00
print_info: n_ff = 8960
print_info: n_expert = 0
print_info: n_expert_used = 0
print_info: causal attn = 1
print_info: pooling type = 0
print_info: rope type = 2
print_info: rope scaling = linear
print_info: freq_base_train = 10000.0
print_info: freq_scale_train = 1
print_info: n_ctx_orig_yarn = 131072
print_info: rope_finetuned = unknown
print_info: ssm_d_conv = 0
print_info: ssm_d_inner = 0
print_info: ssm_d_state = 0
print_info: ssm_dt_rank = 0
print_info: ssm_dt_b_c_rms = 0
print_info: model type = 1.5B
print_info: model params = 1.78 B
print_info: general.name = DeepSeek R1 Distill Qwen 1.5B
print_info: vocab type = BPE
print_info: n_vocab = 151936
print_info: n_merges = 151387
print_info: BOS token = 151646 ‘<锝渂egin鈻乷f鈻乻entence锝?’
print_info: EOS token = 151643 ‘<锝渆nd鈻乷f鈻乻entence锝?’
print_info: EOT token = 151643 ‘<锝渆nd鈻乷f鈻乻entence锝?’
print_info: PAD token = 151654 ‘<|vision_pad|>’
print_info: LF token = 198 ‘膴’
print_info: FIM PRE token = 151659 ‘<|fim_prefix|>’
print_info: FIM SUF token = 151661 ‘<|fim_suffix|>’
print_info: FIM MID token = 151660 ‘<|fim_middle|>’
print_info: FIM PAD token = 151662 ‘<|fim_pad|>’
print_info: FIM REP token = 151663 ‘<|repo_name|>’
print_info: FIM SEP token = 151664 ‘<|file_sep|>’
print_info: EOG token = 151643 ‘<锝渆nd鈻乷f鈻乻entence锝?’
print_info: EOG token = 151662 ‘<|fim_pad|>’
print_info: EOG token = 151663 ‘<|repo_name|>’
print_info: EOG token = 151664 ‘<|file_sep|>’
print_info: max token length = 256
load_tensors: loading model tensors, this can take a while… (mmap = true)
load_tensors: CPU_Mapped model buffer size = 1059.89 MiB
…
llama_context: constructing llama_context
llama_context: n_seq_max = 1
llama_context: n_ctx = 4096
llama_context: n_ctx_per_seq = 4096
llama_context: n_batch = 2048
llama_context: n_ubatch = 512
llama_context: causal_attn = 1
llama_context: flash_attn = 0
llama_context: freq_base = 10000.0
llama_context: freq_scale = 1
llama_context: n_ctx_per_seq (4096) < n_ctx_train (131072) – the full capacity of the model will not be utilized
llama_context: CPU output buffer size = 0.58 MiB
init: kv_size = 4096, offload = 1, type_k = ‘f16’, type_v = ‘f16’, n_layer = 28, can_shift = 1
init: CPU KV buffer size = 112.00 MiB
llama_context: KV self size = 112.00 MiB, K (f16): 56.00 MiB, V (f16): 56.00 MiB
llama_context: CPU compute buffer size = 299.75 MiB
llama_context: graph nodes = 1042
llama_context: graph splits = 1
common_init_from_params: setting dry_penalty_last_n to ctx_size = 4096
common_init_from_params: warming up the model with an empty run - please wait … (–no-warmup to disable)
main: llama threadpool init, n_threads = 8
main: chat template is available, enabling conversation mode (disable it with -no-cnv)
main: chat template example:
You are a helpful assistant
<锝淯ser锝?Hello<锝淎ssistant锝?Hi there<锝渆nd鈻乷f鈻乻entence锝?<锝淯ser锝?How are you?<锝淎ssistant锝?
system_info: n_threads = 8 (n_threads_batch = 8) / 8 | CPU : AARCH64_REPACK = 1 |
main: interactive mode on.
sampler seed: 381697047
sampler params:
repeat_last_n = 64, repeat_penalty = 1.000, frequency_penalty = 0.000, presence_penalty = 0.000
dry_multiplier = 0.000, dry_base = 1.750, dry_allowed_length = 2, dry_penalty_last_n = 4096
top_k = 40, top_p = 0.950, min_p = 0.050, xtc_probability = 0.000, xtc_threshold = 0.100, typical_p = 1.000, top_n_sigma = -1.000, temp = 0.800
mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampler chain: logits -> logit-bias -> penalties -> dry -> top-k -> typical -> top-p -> min-p -> xtc -> temp-ext -> dist
generate: n_ctx = 4096, n_batch = 2048, n_predict = -1, n_keep = 1
== Running in interactive mode. ==
- Press Ctrl+C to interject at any time.
- Press Return to return control to the AI.
- To return control without starting a new line, end your input with ‘/’.
- If you want to submit another line, end your input with ‘’.
- Not using system message. To change it, set a different value via -sys PROMPT
成功
总结
- 刚开始用的OpenHarmony-5.0.0-rvbook版本中的sdk进行编译配置,结果该版本中的sdk并没有完全是配riscv,会导致该过程报错。
- 流畅程度源于设备性能。
相关文章:
OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1
OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1 参考laval社区的文章:OpenHarmony带你玩转DeepSeekR1大模型 文章目录 OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1前言一、前期准备二、获取源码1.错误示范2.下载 三、编译llama.cpp1.生成makefile2.编译 四、模型文…...
Elixir语言的函数定义
Elixir语言的函数定义 Elixir是一种基于Erlang虚拟机(BEAM)的函数式编程语言,因其并发特性及可扩展性而受到广泛欢迎。在Elixir中,函数是程序的基本构建块,了解如何定义和使用函数对于掌握这门语言至关重要。本文将深…...
Spring MVC 数据绑定教程
一、数据绑定概述 将HTTP请求中的表单数据自动映射到Controller方法的参数中,支持多种数据类型绑定。 二、自动绑定数据类型 2.1 基本数据类型绑定 支持类型 基本类型:int, double 等包装类:Integer, Double 等String 类型 实现步骤 创…...
可发1区的超级创新思路(python 实现):基于时空解耦和对比学习的可解释性模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 目录 首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 二、模型解析 1.1 创新点深度解读 (1) 双路空间解耦架构(双路编码器…...
一个简单的php加密的理解
前言 原帖子 https://www.52pojie.cn/thread-1991616-1-1.html 一段简单的 php 代码加密,大佬使用了一段 python 代码给解密出来了,但是我没太理解整个逻辑 于是在本地跑了一遍,尝试理解整个解密流程,这里记录下整个学习过程 …...
基于微信小程序的高校寝室快修小程序研究
标题:基于微信小程序的高校寝室快修小程序研究 内容:1.摘要 随着高校规模的不断扩大,学生寝室数量增多,寝室设施维修需求日益增长。传统的维修报修方式效率低下,易出现信息传递不及时等问题。本文旨在研究基于微信小程序的高校寝室快修小程序…...
windows11在连接第二屏幕之后没有声音问题
博主在使用HDMI线连接第二个屏幕之后发现没有声音了。经过翻阅资料总结以下几个步骤。 1、拔开HDMI线,观察是否有声音,如果有声音就是HDMI线插上之后的声音输出设备选择问题。 观察下图: 声音输出设备:1、电脑麦克风࿰…...
手撕Tomcat
后端开发进阶:Web APP -> Web 服务器 Jerrymouse Server设计目标如下: 1、支持Servlet 6的大部分功能: 支持Servlet组件; 支持Filter组件; 支持Listener组件; 支持Sesssion(仅限Cookie模式&a…...
oracle 快速创建表结构
在 Oracle 中快速创建表结构(仅复制表结构,不复制数据)可以通过以下方法实现,适用于需要快速复制表定义或生成空表的场景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 复制源表的全部列和数据类型,但不复制数据 C…...
InnoDB存储引擎的三大特性
InnoDB存储引擎的三大特性 Buffer Pool 原理:Buffer Poo 是InnoDB存储引擎用于缓存数据页和索引页的内存区域。他提高了数据库的读写性能,因为数据也和索引页在内存中读写比磁盘上快得多。需要访问数据时,InnoDB会在Buffer Pool 中查找&…...
算法初识-时间复杂度空间复杂度
注:观看Adbul Bari算法视频 算法概念 算法:先验分析,不依托于硬件,无语言限制,逻辑。 程序:后验测试,依托硬件,语言限制,实现。 特点: 输入-0或多个输出-至…...
MySQL8.0.40编译安装(Mysql8.0.40 Compilation and Installation)
MySQL8.0.40编译安装 近期MySQL发布了8.0.40版本,与之前的版本相比,部分依赖包发生了变化,因此重新编译一版,也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号࿰…...
一个简单的跨平台Python GUI自动化 AutoPy
象一下,你坐在电脑前,手指轻轻一点,鼠标自己动了起来,键盘仿佛被无形的手操控,屏幕上的任务自动完成——这一切不需要你费力,只靠几行代码就能实现。这就是AutoPy的魅力,一个简单却强大的跨平台…...
C++中常见函数
目录 stringstream ss(line); 为什么使用 stringstream while(ss>>num){} arr.push_back(num); numeric_limits ::min() pair result throw invalid_argument(""); vector arr;和int arr[];有什么区别? 数据结构的本质 内存管理 功能与易用…...
C++: 类型转换
C: 类型转换 (一)C语言中的类型转换volatile关键字 修饰const变量 (二)C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI (一)C语言中的类型转换 在C语言中…...
Linux驱动开发进阶(五)- 系统调用
文章目录 1、前言2、阻塞与非阻塞IO2.1、阻塞方式2.2、非阻塞方式2.3、小结 3、异步IO3.1、poll3.2、select3.3、epoll3.4、poll和epoll示例比较3.5、异步通知 4、unlocked_ioctl5、sysfs_notify 1、前言 学习参考书籍以及本文涉及的示例程序:李山文的《Linux驱动开…...
深度解析:文件或目录损坏且无法读取的应对之道
引言 在数字化办公与数据存储日益普及的今天,我们时常会遭遇各种数据问题,其中“文件或目录损坏且无法读取”这一状况尤为令人头疼。无论是个人用户存储在电脑硬盘、移动硬盘、U盘等设备中的重要文档、照片、视频,还是企业服务器上的关键业务…...
农业股龙头公司有哪些?
农业股票的龙头公司通常是指在农业领域具有较高市场份额、较强品牌影响力和较好财务表现的企业。以下是一些国内外知名的农业龙头公司: 国内农业龙头公司 中国中化 - 作为国内最大的化肥生产企业之一,主要从事化肥、种子、农药等产品的生产和销售。丰乐…...
【正点原子】如何设置 ATK-DLMP135 开发板 eth0 的开机默认 IP 地址
开机就想让 eth0 乖乖用静态 IP?别再被 DHCP 抢走地址了! 三步教你彻底掌控 ATK-DLMP135 的网络启动配置,简单粗暴,实测有效! 正点原子STM32MP135开发板Linux核心板嵌入式ARM双千兆以太网CAN 1. 删除 dhcpcd 自动获取…...
pyenv-virtualenv(python 版本管理工具)
推荐参考(本人实测有用) 参考文章pyenv 和 pyenv-virtualenv 的安装、配置和使用(仅供参考) 参考文章 pyenvpyenv-virtualenv(仅供参考) pyenv (windows)安装 手动安装 git clone https://github.com/pye…...
Solr admin 更新文档
<add><doc><field name"id">1904451090351546368</field><field name"companyName" update"set">测试科技有限公司</field></doc> </add>...
华为交换机上配置流量策略根据IP限速
一、配置ACL匹配目标IP 目的:通过ACL识别需要限速的IP地址或网段。 # 进入系统视图 system-view # 创建基本ACL(例如ACL 3000) acl 3000 rule 5 permit ip source 192.168.1.10 0 # 匹配单个IP(源地址) # 或匹配…...
3D数据共享标准——GLB文件格式揭秘
GLB 文件格式:跨平台 3D 数据共享的标准 简介 在这个数据爆炸的时代,3D 数据因其直观、逼真的特点而得到广泛应用。然而,不同 3D 软件和平台之间的兼容性一直是一个难题。 为了解决这一问题,GLB 文件格式应运而生。作为一种标准…...
Java 大视界 -- 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
基于springboot体育俱乐部预约管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在科…...
【HTML-CSS】
一、概念 1、HTML 2、CSS 二、入门 HTML 教程 | 菜鸟教程 1、构架 注: 1、标签不区分大小写 2、属性可以使用单引号,也可以使用双引号 3、语法结构不严谨,但建议好好写 2、常见标签和样式 (1)标题 <span>没…...
UI自动化基础(1)
1、pip install selenium4.3.0,最好指定版本安装,因为不同的版本可能会有一些兼容 性的问题。 2、pip uninstall urllib3 ,pip install urllib31.26.15 【执行版本安装】,goole是114.版本 3、装好浏览器,正确安装。最好…...
看雪 get_pwn3(2016 CCTF 中的 pwn3)
get_pwn3(2016 CCTF 中的 pwn3) 格式化字符串漏洞 get_pwn3(2016 CCTF 中的 pwn3) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file pwn3 pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, …...
JAVA类和对象
实验目的: 1.掌握 Java 语言中类的定义、对象的创建、对象引用方法。 2.初步了解面向对象设计方法。 第一题: 设计一个自动铅笔类 AutoPencil,有 1 个属性 boolean penPoint(笔尖是否伸出),有 4 个函数&a…...
c#程序结构
C# 程序结构 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declaration)一个 classClass 方法Class 属性一个 Main 方法语句(Statements)& 表达式(Expressions)注释 C# 文件的…...
988主材订购单
每一个大项,都可以添加多行小项, 小项里的品牌,型号规格,单位都是下来框,数据是后台传过来的。是一个多维数组。 <view style"width: 150rpx;color:#000;position:relative">备注:</vie…...
elementui table禁用全选,一次限制勾选一项。
1、设置属性:selection-change“handleSelectionChange” <el-table:data"taskList"ref"tableDataRefs"selection-change"handleSelectionChange":header-cell-class-name"hideAllCheckbox">function handleSelecti…...
Invalid Executable The executable contains bitcode
xcode 升级到16之后项目运行调试都没有问题,但是最后在上传到appstore的时候出现问题了 比如这种类似的错误,网上查了一下解决方法 解决方案: 执行一下指令删除该framework的bitcode xcrun bitcode_strip ${framework_path} -r -o ${framewo…...
【天梯赛】L2_005 集合相似度(C++)
L2-005 集合相似度 - 团体程序设计天梯赛-练习集 代码实现(C) #include <iostream> #include <vector> #include <unordered_set> #include <iomanip>// 计算两个集合的相似度 double cal(const std::unordered_set<int>…...
Java【多线程】(7)常见的锁策略
目录 1.前言 2.正文 2.1悲观锁和乐观锁 2.2重量级锁和轻量级锁 2.3挂起等待锁和自旋锁 2.4互斥锁与读写锁 2.5可重入锁与不可重入锁 2.6公平锁与不公平锁 2.7synchronized优化 2.7.1锁升级 2.7.2锁消除 2.7.3锁粗化 3.小结 1.前言 哈喽大家好,今天来给…...
Android Compose 中获取和使用 Context 的完整指南
在 Android Jetpack Compose 中,虽然大多数 UI 组件不再需要直接使用 Context,但有时你仍然需要访问它来执行一些 Android 平台特定的操作。以下是几种在 Compose 中获取和使用 Context 的方法: 1. 使用 LocalContext 这是 Compose 中最常用…...
车载通信基础 --- 解密公开密钥基础设施(PKI)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
深度强化学习基础 1:以狗狗学习握手为例
强化学习共同框架 在这个狗狗学习握手的场景中,强化学习的各个要素可以这样理解: 状态s(state): 狗狗所处的环境状况,比如主人伸出手掌的姿势、狗狗自身的姿势、周围的环境等。状态s描述了狗狗在特定时刻所感知到的环境信息。 动作a(action): 狗狗可以…...
【Kafka基础】topics命令行操作大全:高级命令解析(2)
1 强制删除主题 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-topics.sh --delete \--zookeeper 192.168.10.33:2181 \--topic mytopic \--if-exists 参数说明: --zookeeper:直接连接Zookeeper删除(旧版本方式)--if-exists&…...
【redis】简介及在springboot中的使用
redis简介 基本概念 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不…...
Windwos的DNS解析命令nslookup
nslookup 解析dns的命令 有两种使用方式,交互式&命令行方式。 交互式 C:\Users\Administrator>nslookup 默认服务器: UnKnown Address: fe80::52f7:edff:fe28:35de> www.baidu.com 服务器: UnKnown Address: fe80::52f7:edff:fe28:35de非权威应答:…...
Vue.js 实现下载模板和导入模板、数据比对功能核心实现。
在前端开发中,数据比对是一个常见需求,尤其在资产管理等场景中。本文将基于 Vue.js 和 Element UI,通过一个简化的代码示例,展示如何实现“新建比对”和“开始比对”功能的核心部分。 一、功能简介 我们将聚焦两个核心功能&…...
通过世界排名第一的免费开源ERP,构建富有弹性的智能供应链
概述 现行供应链模式的结构性弱点凸显了对整个行业进行重塑的必要性。正确策略和支持可以帮助您重塑供应链,降低成本,实现业务转型。开源智造(OSCG)所推出的Odoo免费开源ERP解决方案,将供应链转化为具有快速响应能力的…...
自动驾驶数据闭环中的MLOps实践:Kubernetes、Kubeflow与PyTorch的协同应用
目录 1. 引言 2. 系统架构与技术栈 2.1 Kubernetes:弹性可伸缩的计算资源池 2.2 Kubeflow:端到端的MLOps工作流 2.3 PyTorch分布式训练:高效的模型训练引擎 3. 增强型数据处理技术 3.1 联邦学习聚合 3.2 在线学习更新 3.3 角落案例挖…...
如何在Linux中更改主机名?修改主机最新方法
hostname是一个Linux操作系统的常用功能,允许识别服务器, 这可用于容易地确定两个服务器之间的差异。 除了服务器的个人识别,主机名与大多数网络进程一起使用,其他应用程序也可能依赖于此,本期将指导大家如何在Linux中…...
分盘,内网
分盘 查看创建分区 # 查看磁盘信息(确认目标磁盘,如/dev/sda) lsblkfdisk -l# 启动fdisk工具(需root权限) sudo fdisk /dev/sda# 步骤1:删除旧分区表(谨慎操作!) Comma…...
SQL122 删除索引
alter table examination_info drop index uniq_idx_exam_id; alter table examination_info drop index full_idx_tag; 描述 请删除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag。 后台会通过 SHOW INDEX FROM examination_info 来对比输出结果。…...
【SQL】子查询详解(附例题)
子查询 子查询的表示形式为:(SELECT 语句),它是IN、EXISTS等运算符的运算数,它也出现于FROM子句和VALUES子句。包含子查询的查询叫做嵌套查询。嵌套查询分为相关嵌套查询和不想关嵌套查询 WHERE子句中的子查询 比较运算符 子查询的结果是…...
AI和传统命理的结合
deepseek的火热 也带来了AI命理学的爆火 1. 精准解析:AI加持,数据驱动 通过先进的人工智能算法,我们对海量的传统命理知识进行了深度学习和整合。无论是八字排盘、紫微斗数,还是风水布局、生肖运势,AI都能根据您的个…...
Java设计模式之抽象工厂模式:从入门到架构级实践
设计模式是构建高质量软件的基石,而抽象工厂模式作为创建型模式的代表,不仅解决了对象创建的问题,更在架构设计中扮演着关键角色。本文将从基础到高阶、从单机到分布式,全面剖析抽象工厂模式的应用场景与实战技巧。 一、从问题出发…...