Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

调试方法

发表于 2025-06-24

公司一个遗留门户网站需要定期维护,经常需要调试才能确定出问题的地方,因此研究一下php调试的方法,记录一下。

注:该网站使用 php 开发,并采用前后端分离的架构。

通过浏览器打印信息进行调试

在代码中添加 echo、var_dump、print_r 和 exit,在浏览器中查看输出。该方法不适用采用前后端分离架构的门户网站,因为前端通过restful api 访问后端,后端产生的结果不直接显示在浏览器网页中。

使用 XDebug 进行调试

Xdebug 是一款PHP 的调试工具,可以帮助开发者追踪、调试和分析PHP 程序的运行状况。它允许开发者在代码中设置断点,单步执行代码,查看变量值等,从而更有效地排查和解决问题。

参考链接

  1. PHP 调试 - 方式,by kikajack.
  2. Xdebug+phpStorm安装与调试保姆级教程!『通俗易懂』,by GeekerJun.

Conda使用帮助

发表于 2025-06-24

最近学习《动手学深度学习》第二版这本书,里面用到 miniconda,因此记录一下 Conda 使用方法。

简介

Conda是一个开源跨平台语言无关的包管理与环境管理系统。由“连续统分析”(Continuum Analytics)基于BSD许可证发布。
Conda允许用户方便地安装不同版本的二进制软件包与该计算平台需要的所有库。还允许用户在不同版本的包之间切换、从一个软件仓库下载包并安装。
Conda是用Python语言开发,但能管理其他编程语言的项目(如R语言),包括多语言项目。 Conda可安装Python语言的包,类似于其他基于Python的跨平台包管理器(如wheel 或pip)。

Miniconda 是 Anaconda Distribution 的免费微型安装,仅包含 conda、Python、它们所依赖的软件包以及少量其他有用的软件包。

如果您需要更多软件包,请使用conda install命令从 Anaconda 公共存储库中默认提供的数千个软件包中进行安装,或者从其他渠道(如 conda-forge 或 bioconda)进行安装。

安装

conda 分为 anaconda 和 miniconda,anaconda 是一个包含了许多常用库的集合版本,miniconda 是精简版本(只包含conda、pip、zlib、python 以及它们所需的包),剩余的通过 conda install command 命令自行安装即可;

使用方法

创建环境

1
2
3
4
# 语法
conda create --name <env_name> python=<version> [package_name1] [package_name2] [...]
# 样例 创建一个名为PaddleOCR的环境,python版本为3.7
conda create --name PaddleOCR python=3.7

切换Conda环境

1
2
3
4
5
6
# 语法
conda activate env_name
# 样例 切换到PaddleOCR环境
conda activate PaddleOCR
# 退出当前环境
conda deactivate

查看电脑上已安装的Conda环境

1
2
# 查看当前电脑上所有的conda环境
conda env list

删除某个Conda环境

1
2
3
4
# 语法
conda remove --name <env_name> --all
# 样例
conda remove --name PaddleOCR --all

使用Conda安装依赖包

1
2
3
4
5
6
7
# 查看当前conda环境安装的所有依赖包
conda list

# 语法
conda install lib
# 样例
conda install requests

参考链接

  1. Conda 使用教程,by zhangruifeng.
  2. Conda ,by wikipedia.
  3. 「详解」conda 安装与使用,by ViatorSun.

采购管理知识学习笔记

发表于 2025-04-23

项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。

项目采购管理过程

项目采购管理过程包括:

  • 规划采购管理
  • 实施采购
  • 控制采购

规划采购管理

规划采购管理是记录采购决策、明确采购方法,及识别潜在卖方的过程。

实施采购

实施采购是获取卖方应答、选择卖方并授予合同的过程。

评标委员会

第二章 评标委员会

第七条 评标委员会依法组建,负责评标活动,向招标人推荐中标候选人或者根据招标人的授权直接确定中标人。

第八条 评标委员会由招标人负责组建。评标委员会成员名单一般应于开标前确定。评标委员会成员名单在中标结果确定前应当保密。

第九条 评标委员会由招标人或其委托的招标代理机构熟悉相关业务的代表,以及有关技术、经济等方面的专家组成,成员人数为五人以上单数,其中技术、经济等方面的专家不得少于成员总数的三分之二。

评标委员会设负责人的,评标委员会负责人由评标委员会成员推举产生或者由招标人确定。评标委员会负责人与评标委员会的其他成员有同等的表决权。

注:评标委员会负责人很重要,负责评标过程节奏的把控,成员工作的分配,因此应当由经验丰富、德高望重的老前辈负责。

评标的准备与初步评审

第三章 评标的准备与初步评审

第二十二条 投标人资格条件不符合国家有关规定和招标文件要求的,或者拒不按照要求对投标文件进行澄清、说明或者补正的,评标委员会可以否决其投标。

第二十三条 评标委员会应当审查每一投标文件是否对招标文件提出的所有实质性要求和条件作出响应。未能在实质上响应的投标,应当予以否决。

注:本阶段评标委员会将对投标人资质和合规性进行审查。

详细评审

第四章 详细评审

第二十八条 经初步评审合格的投标文件,评标委员会应当根据招标文件确定的评标标准和方法,对其技术部分和商务部分作进一步评审、比较。

注:本阶段评标委员将依据评估标准和方法对招标文件进行详细评审。评估标准可分为客观部分和主观部分。客观部分由可量化的评估标准构成,因此,对同一份招标文件,所有评标委员会成员的打分应该是一致的,评标委员会负责人可以在此处进行成员分工。

控制采购

控制采购是管理采购关系、监督合同绩效、实施必要的变更和纠偏,以及关闭合同的过程。

参考链接

  1. 信息系统项目管理师教程(第4版),by douban.
  2. 评标委员会和评标方法暂行规定,by gov.

__acrt_first_block==header错误的原因及解决方法

发表于 2025-04-17 | 更新于 2025-04-18

同样遇到以下链接所示错误:

  • __acrt_first_block == header错误的一种办法

通过单步跟踪,定位到运行函数 std::vector.push_back(Object)时,就报__acrt_first_block==header错误。最终通过给std::vector对象预留内存解决,即在调用push_back()前先调用reserve()。

参考链接

  1. __acrt_first_block == header错误的一种办法,by hansen_fu.
  2. vector 的push_back() 报错,by 爱钓鱼的歪猴.

Themida & WinLicense 2.0 - 2.4.6 脱壳的方法

发表于 2025-04-17

最近遇到一个软件,使用exeinfo pe查看,发现其使用 Themida & WinLicense 2.0 - 2.4.6 加了壳,于是想办法给该软件脱壳,记录一下过程。

PE文件格式

壳是一种专用的加密软件技术,它能够保护软件的二进制程序,避免其直接暴露在不怀好意的同行面前。要理解壳,要脱壳,首先得了解一些基本知识。

壳所保护的软件二进制程序通常采用PE文件格式,包括壳自身也是如此。因此有必要了解PE文件格式。

壳的分类

常用的壳可分为压缩壳、加密壳、虚拟机保护壳。

脱壳技术

脱壳技术的核心是寻找目标程序的 OEP(Original Entry Point,原程序入口点),然后将目标程序恢复出来。

脱壳过程

请参考[分享]Themida & WinLicense 2.0 - 2.4.6 脱壳。脱壳过程需要注意的是:

  • ODBGScript v1.82.6,ODBGScript插件版本必须不小于v1.82.6,否则 Themida & WinLicense 2.0 - 2.4.6 的脱壳脚本将运行报错。
  • 需要在 32 位系统中运行 OllyDBG,否则将报 StrongOD 插件不可用错误。

参考链接

  1. [分享]Themida & WinLicense 2.0 - 2.4.6 脱壳,by Hasic.
  2. 软件破解之脱壳八法,by 爱笑的程序狗.

Ubuntu下交叉编译ARM程序方法

发表于 2025-03-03

需要在 X64 的 Ubuntu 20.04 平台交叉编译 ARM64 架构的程序,研究一下交叉编译工具链的使用方法。

交叉编译工具链

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。

Ubuntu ARM 交叉编译工具链安装

目前主流的 ARM 交叉编译工具链主要有三种:

  • Linaro 提供的 ARM 交叉编译工具链,可以到 Linaro 官网 Linaro Releases 去下载已经制作好的交叉编译工具链
  • GNU(提供源码,自行编译制作)
  • Codesourcery

参考连接

  1. Linux Clash 最速安装使用,by 工科生的困意.
  2. Ubuntu 交叉编译工具链安装,by 孤情剑客.
  3. 【一】ubuntu交叉编译工具链选择与安装,by UNI-少林寺武功.

DeepSeek大模型本地部署方法

发表于 2025-02-26 | 更新于 2025-03-01

DeepSeek如此火热,不禁也研究一下本地部署DeepSeek的方法。

Ollama 安装和使用

Ollama是一款启动并运行大型语言模型的工具。

安装完成后,我们直接打开命令行执行 ollama –version 判断是否安装成功。

ollama 会在我们本地服务监听 11434 端口。

在线部署大模型

我们可以直接使用 ollama run 模型名称 来下载和运行我们想要的模型。例如:

1
2
3
4
5
6
# 查看ollama版本
ollama --version
# 下载大模型
ollama pull deepseek--r1:1.5b
# 运行大模型
ollama run deepseek-r1:1.5b

离线部署大模型

1
2
3
4
5
6
7
8
# 在联网生成大模型描述文件
ollama show deepseek-r1:1.5b --modelfile > modelfile.txt

# 复制大模型和大模型描述文件到离线电脑某个文件夹,然后使用如下命令离线部署
ollama create deepseek-r1:1.5b -f modelfile.txt

# 验证是否离线部署成功
ollama list

与AI交互的客户端

ChatBox 桌面客户端

Chatbox 是一款开源的 AI 客户端,专为与各种大型语言模型进行交互而设计。它支持包括 Ollama 在内的多种主流模型的 API 接入,无论是本地部署的模型,还是其他服务提供商的模型,都能轻松连接。

连接本地 Ollama 服务

连接远程 Ollama 服务

请参考:

  • 如何将 Chatbox 连接到远程 Ollama 服务:逐步指南

Open-webui Web客户端

Open-WebUI是一个可扩展、功能丰富且用户友好的自托管人工智能平台,设计上完全离线运行。它支持各种大语言模型(LLM)执行器,如 Ollama和兼容OpenAI的APIs ,并内置了用于检索增强生成(RAG)的推理引擎,使其成为一个强大的AI部署解决方案 。

部署过程请参考:

  • llama3本地环境配置(Ollama+open-webui)
  • Open WebUI

Page Assist + Ollama - 实现本地模型联网

Chatbox 提供了联网功能,但是 DeepSeek R1 模型是没办法联网。

想要让本地模型联网我们还得靠一个浏览器插件 Page Assist。

Page Assist 是一款开源的浏览器扩展程序,旨在为本地 AI 模型(如 Ollama)提供便捷的交互界面。

RAG 打造知识库

RAG 架构介绍

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与生成模型的人工智能技术,旨在通过检索外部知识库中的信息来增强语言模型的生成能力。

LLM(Large Language Model,大语言模型)

Embedding(嵌入):通过一个专门的模型来把你上传的文本、表格数据等本地文件处理成机器能理解的 “数字代码”。相似的文本在这个向量空间中距离会更近。比如,“苹果”和“水果”这两个词的嵌入向量就会比较接近,而“苹果”和“汽车”就会离得很远。

Vector Database(向量数据库):用来存储上一步处理好的 “数字代码” 的数据库,它能够高效地存储和检索这些向量。当你有一个问题时,它会把问题转换成向量,然后在这个仓库里快速找到和问题最相关的向量。比如,你问“苹果是什么?”它会在这个仓库里找到和“苹果”相关的向量,比如“水果”“红色”“圆形”等。

Anything LLM

Anything LLM 是一款基于 RAG架构的本地知识库工具,能够将文档、网页等数据源与本地运行的大语言模型(LLM)相结合,构建个性化的知识库问答系统。

知识库的构建请参考:

  • 跟着DW学习大语言模型-什么是知识库,如何构建知识库
  • 从零开始构建一个基于大模型和 RAG 的知识库问答系统

大模型微调

Fine-tuning(微调):通过特定领域数据对预训练模型进行针对性优化,以提升其在特定任务上的性能。

请参考:

  • 【大模型开发 】 一文搞懂Fine-tuning(大模型微调)
  • 深入理解大语言模型微调技术

参考链接

  1. 如何拥有一个无限制、可联网、带本地知识库的私人 DeepSeek?,by ConardLi​.
  2. 如何把你的 DeePseek-R1 微调为某个领域的专家?,by ConardLi​.
  3. DeepSeek + Cherry Studio:简捷搭建个人知识库,by 苏点点.
  4. 打造DeepSeek最强外挂!一篇文章教会你搭建「个人知识库」(喂饭版),by m0_63171455.
  5. LLM context 长度分析与提升方法总结,by phynlp.
  6. What do you mean exactly with “embedding length” ?,by reddit.
  7. What is Quantization in LLM,by Nithin Devanand.
  8. 什么是大语言模型量化? 每个量化精度都代表什么?,by karminski.
  9. 大模型|“上下文长度”和“上下文窗口”不再傻傻分不清楚!,by 智识可乐.
  10. 本地部署deepseek模型保姆级教程,by lovefc.
  11. 跟着DW学习大语言模型-什么是知识库,如何构建知识库,by 羞儿.
  12. DeepSeek +Kimi 免费快速生成PPT!,by UIED用户体验交流学习.

QT_GUI插件系统构建方法研究

发表于 2025-02-04

构建一个较大桌面GUI应用程序,采用插件架构是必由之路。首先插件架构有利于多人分工协作,有利于系统功能的扩展和维护,有利于用户需求的快速响应。

插件架构

插件架构系统主要由以下三部分构成:

  • 主系统,通过插件管理器加载插件,并创建插件对象。
  • 插件管理器,用于管理插件的生命周期,并将其暴露给主系统。
  • 插件,插件本身应符合插件管理器协议,并提供符合主系统期望的对象。

QT插件示例

请参考:

  • Echo Plugin Example

参考链接

  1. 构建自己的Qt插件系统,by aliyun.
  2. 深入理解插件系统,by qq_33055735.
  3. Echo Plugin Example ,by qt.

麒麟V10设置VNC连接的方法

发表于 2025-01-17 | 更新于 2025-03-10

最近研究了一下麒麟V10 Linux设置VNC连接的方法,记录一下。

VNC Server配置

VNC Server应该能够以服务的形式开机自启动,对外以 80 端口提供VNC远程连接服务。

创建 VNC Systemd 服务

创建VNC Systemd 服务,实现麒麟 V10 开机后 VNC 服务器自启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cd /lib/systemd/system/
sudo vim vncserver@:1.service

# 以下为vnc服务配置文件内容,编辑后保存
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
WorkingDirectory=/home/jack
User=jack
Group=jack
PIDFile=/home/jack/.vnc/%H%i.pid

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -autokill %i
ExecStop=/usr/bin/vncserver -kill %i
Restart=on-success
RestartSec=15

[Install]
WantedBy=multi-user.target

设置 VNC Systemd 服务开机自启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新加载配置文件
systemctl daemon-reload
# 设置 VNC 客户端连接密码
vncpasswd
# 启动 vnc 服务
systemctl start vncserver@:1.service
# 查看 vnc 服务状态
systemctl status vncserver@:1.service
journalctl -u vncserver@:1.service
cat /var/log/syslog | grep vnc
# 设置开机自启动
systemctl enable vncserver@:1.service
# 禁止开机自启动
systemctl disable vncserver@:1.service

修改 vncserver 配置

修改 vncserver 配置,使 :1 对应 80 端口。

1
2
3
4
5
# 查看 vncserver 的位置
which vncserver

# 查看 vncserver 软连接到哪个文件
file /usr/bin/vncserver

最终找到麒麟 V10 使用的 vncserver 为 TigerVNC,使用 Vim 修改 TigerVNC配置文件,将 5900 替换为 79。

1
2
3
4
vim /usr/bin/tigervncserver

# 逐个替换并确认
:%s/5900/79/gc

修改 sysctl.conf 配置

Linux 对于非 root 用户禁止使用 1024 以下端口,但为了避免 VNC 服务被防火墙阻挡,应将 VNC 服务端口调整到 80 。修改 sysctl.conf 文件配置达到此目的。

1
2
3
4
5
6
#临时生效
sysctl net.ipv4.ip_unprivileged_port_start=0

#永久生效
echo "net.ipv4.ip_unprivileged_port_start=0" >> /etc/sysctl.conf
sysctl -p

启动 VNC 服务

1
2
3
4
5
6
7
# 设置 VNC 客户端连接密码
vncpasswd

# 启动 VNC 服务
vncserver -kill :1
vncserver :1
vncserver -list

连接 VNC 服务

使用各种 VNC 客户端,填入相关配置连接即可。连接 VNC 服务器遇到一些问题,记录如下。

vnc viewer 连接黑屏问题

基于 Systemd 设置 VNC 服务开机自启动成功,但是使用 RealVNC Viewer 客户端连接成功后显示黑屏,目前没有解决。但是使用 vncserver 直接创建 vnc 服务,然后使用 RealVNC Viewer 客户端连接成功后没有出现该问题。

中文输入法问题

打开终端,输入如下命令:

1
2
fcitx-autostart
fcitx restart

输入正确用户名和密码仍旧跳回登录界面

原因是主目录下的 .Xauthority 文件拥有者变成了 root ,导致用户登录时无法获取该文件,解决方法如下:

1
sudo chown user:user .Xauthority

麒麟 V10 自带的 Remmina 无法连接 VNC 服务器的问题

麒麟 V10 自带的 Remmina 能够连接 VNC 服务器的默认的 5901 端口,但是无法连接 VNC 服务器的 80 端口。该问题暂未解决。

建议使用 RealVNC Viewer 客户端,麒麟 v10 自带的 Remmina 客户端连接 80 端口有问题,暂时无法解决。

参考链接

  1. Linux 查看端口占用情况,by runoob.
  2. 普通用户无法监听 80,443等低于1024端口解决办法,lenglingx.
  3. Ubuntu Kylin 输入正确的账号密码,登陆后又跳回到登录界面 解决方案,by YoungHonker.
  4. Systemd 入门教程:命令篇,by 阮一峰.
  5. Systemd 定时器教程,by 阮一峰.
  6. Systemd 入门教程:实战篇,by 阮一峰.
  7. Node 应用的 Systemd 启动,by 阮一峰.
  8. Kylin V10 环境下配置VNC远程桌面访问,by 丷月亮是指路牌.

SQL判断字段值是否连续与是否从1开始

发表于 2025-01-14 | 更新于 2025-01-17

最近遇到一个运维问题,编写SQL语句判断某个字段是否从1开始,是否是连续的,记录一下问题解决过程。

目标数据表结构

目标数据表 Department 结构如下:

departId personId
7523 7523001
7523 7523002
7523 7523003
7524 7524001
7524 7524002
7524 7524003

判断字段是否从1开始

1
2
select * from Department a 
where a.personId in ( select * from ( select min(personId) as personId from Department b group by b.departId )) and mod(personId, 1000) !=1

判断字段是否连续

1
2
3
4
5
6
7
select * from 
( select b.personId,
( select max(personId)
from Department a
where a.personId < b.personId and a.departId = b.departId ) as prePersonId
from Department b )
where personId - 1 > prePersonId

参考连接

  1. 在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续),by LongRui888.
12…53下一页

Jack Huang

521 日志
67 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse