博客
2026年4月30日
STM32 Flash 读写与存储架构详解
深入记录STM32F407存储外设的地址映射、ART加速器原理及Flash读写注意事项
2026年4月24日
ollama 使用记录
记录ollama服务配置及问题排查方法。
2026年4月10日
C++11 新特性总结
总结C++11带来的新特性:nullptr、auto、decltype、lambda、array、forward_list、tuple、move、bind
2026年2月9日
Linux自动挂载硬盘并共享
记录Linux下自动挂载硬盘,并通过smb共享到局域网的方法。
2025年12月24日
C语言可变参数应用
这是一篇关于"C语言可变参数应用"的文章。点击阅读更多了解详细内容。
2025年12月18日
Nginx日志统计技巧
这是一篇关于"Nginx日志统计技巧"的文章。点击阅读更多了解详细内容。
2025年12月17日
FreeRTOS 内存管理方案
这是一篇关于"FreeRTOS 内存管理方案"的文章。点击阅读更多了解详细内容。
2025年12月8日
Linux终端命令行技巧
这是一篇关于"Linux终端命令行技巧"的文章。点击阅读更多了解详细内容。
2025年11月29日
修复 WSL 网络配置错误 0x8007054f
这是一篇关于"修复 WSL 网络配置错误 0x8007054f"的文章。点击阅读更多了解详细内容。
2025年11月27日
MMU 和 MPU的区别
这是一篇关于"MMU 和 MPU的区别"的文章。点击阅读更多了解详细内容。
2025年11月21日
ssh连接时出现警告
这是一篇关于"ssh连接时出现警告"的文章。点击阅读更多了解详细内容。
2025年8月14日
C++ numeric 中的算法
对C++标准库numeric头文件中实现的算法进行总结,包括accumulate, reduce, inner_product, transform_reduce, partial_sum, inclusive_scan, exclusive_scan, adjacent_difference, iota, gcd, lcm
2025年8月13日
C++ STL 容器介绍
这是一篇关于"C++ STL 容器介绍"的文章。点击阅读更多了解详细内容。
2025年8月5日
深入理解FreeRTOS任务调度与上下文切换
本文深入剖析了FreeRTOS的任务调度核心机制。内容从任务状态、调度器原理讲起,重点详细拆解了任务切换(Context Switch)的全过程,图文并茂地解释了任务堆栈(Stack)的变化,以及SP、PC、LR等关键寄存器在上下文保存与恢复中的作用,帮助读者透彻理解FreeRTOS多任务并发的底层实现。
2025年8月4日
C++位操作
这是一篇关于"C++位操作"的文章。点击阅读更多了解详细内容。
2025年8月2日
深入理解 C++ 左值、右值与移动语义
本文深入讲解了C++中的左值与右值引用。内容涵盖了左值和右值的基本概念,详细对比了左值引用(&)和右值引用(&&)的绑定规则与用途,并解释了`const T&`的特殊性以及`std::move`的作用。通过函数参数传递和自定义`MyString`类的示例,清晰地展示了移动语义如何避免不必要的拷贝,提升程序性能。
2025年6月22日
gcc 编译选项总结
本文总结了GCC编译中实用的编译选项及常用库的链接方法。内容列举了`-save-temps`、`-###`、`-fsanitize=address`等高级编译选项,并整理了数学库(-lm)、线程库(-lpthread)等常用系统库以及OpenCV、FFmpeg等第三方库的GCC链接命令,为C/C++开发者提供了便利的参考。
2025年6月7日
nodejs opensslErrorStack 错误
本文解决了Node.js v17及以上版本中因OpenSSL 3.0兼容性问题导致的`error:0308010C:digital envelope routines::unsupported`错误。文章提供了三种解决方法:设置`NODE_OPTIONS=--openssl-legacy-provider`环境变量、修改`package.json`脚本或降级Node.js版本。
2025年6月1日
pyright 配置
本文介绍了如何配置Pyright类型检查工具以识别非标准目录中的模块。通过在项目根目录创建`pyrightconfig.json`文件,并使用`extraPaths`选项添加额外的包搜索路径,可以解决模块导入时无法找到的问题。
2025年5月15日
Hugging Face 模型简介
本文是一份Hugging Face模型格式加载与推理指南。内容按文件类型分类,详细说明了PyTorch(.bin)、Safetensors、TensorFlow(.h5)、ONNX、GGUF等多种模型格式的加载方式和推理方法,并为每种格式提供了具体的代码示例,帮助开发者快速上手使用不同框架的模型。
2025年5月10日
Keras 基础
本文是Keras框架的基础入门教程。内容从安装开始,通过三个实例程序,分别演示了如何使用Keras构建、编译和训练线性回归、非线性回归以及MNIST手写数字分类模型。文章详细讲解了`Sequential`模型、`Dense`全连接层、激活函数和优化器的基本用法。
2025年5月6日
CAN 基础
本文全面介绍了CAN总线的基础知识。内容涵盖了其拓扑结构、信号表示、多主通信和非破坏性位仲裁等特点。文章详细解析了数据帧、遥控帧、错误帧等帧结构,并讲解了节点的错误处理机制。最后还介绍了Linux下的SocketCAN及其命令行工具和python-can库的使用。
2025年4月16日
大模型参数和内存解析
本文解析了大模型参数规模与内存占用的关系。内容解释了参数单位(B/M)的含义,并详细说明了float32、float16、int8等不同数据类型下每个参数的内存大小。文章以7B模型为例进行计算,并列举了GPT-3、LLaMA-2和DeepSeek等主流模型的参数规模及常用数据类型。
2025年3月11日
qemu 运行 busybox
本文介绍了如何编译BusyBox并将其作为根文件系统,通过QEMU运行自定义编译的Linux内核。内容涵盖了下载BusyBox源码、配置静态编译、解决编译错误、打包生成initramfs.cpio.gz文件,以及最终使用QEMU加载内核和根文件系统的完整命令和步骤。
2025年3月4日
Git下载构建Linux
本文介绍了从Git下载、配置、编译并运行最新Linux内核的全过程。内容涵盖了使用`git clone`获取源码,通过`make menuconfig`进行配置,以及交叉编译arm64内核的步骤。文章还解决了内核启动时因缺少根文件系统而导致的"Kernel panic"问题,并演示了如何制作并挂载一个简单的initramfs。
2025年2月20日
Linux中的各种锁及其基本原理
本文深入探讨了Linux中的各种锁机制。内容从并行性、同步与互斥等基本概念入手,详细解析了自旋锁、互斥锁、读写锁和RCU锁的原理与适用场景。文章还区分了可重入与不可重入锁,并讲解了条件变量如何与互斥锁结合使用,以生产者-消费者模型为例进行了说明。
2025年2月19日
FreeRTOS中的锁
本文介绍了FreeRTOS中用于多任务同步的几种锁机制。内容涵盖了用于保护共享资源的互斥锁(Mutexes),其特点是支持优先级继承以避免优先级反转。此外,还讲解了用于简单同步的二值信号量、控制资源数量的计数信号量以及用于复杂状态管理的事件组。
2024年8月8日
Git配置多个用户
本文介绍了在Git中配置多个用户身份的简洁方法。通过在主配置文件`~/.gitconfig`中使用`includeIf`指令,可以根据仓库所在的目录路径,条件性地加载不同的子配置文件,从而为不同工作区自动切换用户名和邮箱。
2024年7月20日
腾讯云自动申请域名证书
本文介绍了使用acme.sh和DNSPod API为腾讯云域名自动申请和续签SSL证书的方法。内容涵盖安装acme.sh、获取并配置DNSPod密钥、通过DNS方式签发泛域名证书,以及最后将证书安装到Nginx并配置自动重载的完整流程。
2024年7月6日
FreshRSS 重置密码
本文介绍了如何重置FreshRSS的用户密码。由于密码Hash存储在配置文件中,可通过Python的`bcrypt`库生成一个新的Hash值,替换掉`<freshrss-root>/data/users/<user-name>/config.php`文件中的旧`passwordHash`,即可用新密码登录。
2024年4月19日
ARM Cortex-M3 基础
本文全面介绍了ARM Cortex-M3处理器的基础知识。内容涵盖其高性能、先进中断处理、低功耗等特性,并详细讲解了寄存器组、操作模式、嵌套向量中断控制器(NVIC)、存储器映射以及可选的MPU等核心概念,为嵌入式开发者提供了系统性的入门指南。
2024年4月19日
FreeRTOS 的任务
本文深入讲解了FreeRTOS中的任务管理。内容涵盖任务的状态(运行、就绪、阻塞、挂起)、任务优先级,以及其固定优先级、抢占式和时间片轮询的调度策略。此外,还探讨了优先级继承与反转问题,并简述了在多核系统中的调度方式。
2023年8月28日
Linux 串口挂载失败
本文解决了在Ubuntu上CH340串口设备无法挂载为`/dev/ttyUSB0`的问题。通过查看系统日志,发现是`brltty`(盲文设备支持)服务占用了USB接口导致冲突。最终,通过卸载`brltty`软件包,成功使串口设备恢复正常挂载。
2023年8月17日
SNR 与 EVM 的关系
本文探讨了信噪比(SNR)与误差向量幅度(EVM)之间的关系。文章从对数、dB、dBm等基础概念入手,详细解释了SNR和EVM的定义与计算公式,并最终推导出在信噪比较大时`SNR ≈ -20lg(EVM)`的近似关系,为理解无线信号质量提供了理论依据。
2023年7月8日
C 语言必备知识
本文总结了学习C语言时应掌握的关键知识。内容涵盖编译链接、头文件、重要编译选项、三类内存(栈、堆、静态区)的使用、命名习惯、`static`与`const`关键字,以及平台API和整数类型的注意事项,为C语言初学者提供了全面的实践指南。
2023年4月21日
AT&T 汇编与 Intel 汇编区别
本文详细对比了AT&T与Intel两种汇编语法的五大区别:操作数前缀、操作数方向、内存单元表示、寻址方式以及操作码后缀。通过具体的指令示例,清晰地展示了两者在寄存器、立即数和内存访问等方面的语法差异。
2023年1月19日
WSL2 启用桥接网络并开启 mDNS
本文介绍了如何为WSL2启用桥接网络模式,使其获得独立的局域网IP。内容包括在Hyper-V中创建虚拟交换机、修改`.wslconfig`文件。同时,还讲解了如何在WSL2中安装并启用`avahi-daemon`服务,以实现通过mDNS(如`wsl.local`)进行主机名访问。
2023年1月9日
nmcli 配置 wifi
本文是一份使用`nmcli`命令配置WiFi的快速指南。内容涵盖了扫描、连接、断开WiFi网络,以及创建WiFi热点、设置密码等操作。此外,还简要说明了如何为创建的热点配置DHCP服务,为Linux命令行网络管理提供了实用参考。
2022年11月13日
python 实现 AES 加密
本文介绍了高级加密标准(AES)算法,并用Python进行了实现。内容阐述了AES作为DES替代标准的发展背景,详细讲解了其核心原理,包括密钥扩展、S盒变换、行变换、列变换等加密步骤,并提供了完整的加密和解密Python代码。
2022年11月7日
python 实现 DES 加密
本文介绍了数据加密标准(DES)算法,并用Python进行了实现。内容详细讲解了DES作为一种对称密钥算法的加密原理,包括初始置换、16轮迭代中的子密钥生成、密码函数f的核心运算(扩展、S盒、P置换)以及最后的尾置换,并提供了完整的Python代码。
2022年10月13日
树莓派文件系统只读
本文解决了新烧录的树莓派镜像文件系统变为只读的问题。核心方法是进入单用户模式,使用`lsblk`找到根分区,卸载该分区后,通过`fsck.ext4 -y`命令对其进行检查和修复。修复完成后重启系统即可恢复文件系统的正常读写功能。
2022年10月11日
常见 Hash 算法
本文介绍了常见的哈希算法,如MD5和SHA256。内容阐述了哈希算法将任意长度输入映射为固定长度输出的原理及其在安全加密、数据校验等领域的应用。文章还深入分析了MD5和SHA256的内部运算流程,并提供了完整的Python实现代码。
2022年8月16日
CSS flex 布局
本文总结了CSS中Flex弹性布局的常用属性。内容涵盖了主轴方向(flex-direction)、换行(flex-wrap)、对齐方式(justify-content、align-items)以及项目的放大(flex-grow)和缩小(flex-shrink)比例等,为快速掌握Flex布局提供了清晰的语法参考。
2022年8月10日
动态库与静态库
本文总结了C/C++中静态库与动态库的使用方法。内容详细对比了两种链接方式的优缺点,并以Linux环境为例,通过具体代码和编译命令,演示了如何创建(.a和.so文件)、链接和运行使用静态库与动态库的程序,还提及了运行时加载动态库的方法。
2022年8月2日
WSL转移后无法入网
本文记录了在两台Windows主机间转移WSL子系统时遇到的网络问题及解决方案。内容涵盖了系统导出导入、因IP地址段不匹配导致的网络重置、防火墙规则配置、DNS解析失败(修改resolv.conf)以及新版Windows下端口直接映射等问题的排查与解决步骤。
2022年5月21日
一些不常用C语言关键字
本文简要介绍了一些不常用的C语言关键字。内容涵盖了`volatile`(防止编译器优化)、`typedef`(创建类型别名)、`register`(建议变量存储于寄存器)、`__attribute__`(设置编译器属性)以及`inline`(建议函数内联),有助于深入理解C语言的底层特性。
2022年4月12日
树莓派4B运行docker错误
本文解决了在树莓派4B上因`libseccomp2`库版本过旧而导致Docker容器运行报错的问题。在尝试更新库失败后,最终通过卸载系统源安装的旧版Docker,并使用官方`get.docker.com`脚本重新安装最新版本,成功修复了该问题。
2022年4月10日
树莓派4B wlan0消失
本文提供了解决树莓派4B上`wlan0`无线网络接口消失问题的两种快速方法。第一种是当接口未启动时,使用`sudo ifconfig wlan0 up`命令手动启用。第二种是当接口被软件锁定时,使用`sudo rfkill unblock all`命令进行解锁。
2022年4月3日
Yew框架实现秒表
本文介绍了如何使用Rust的Yew框架实现一个Web秒表应用。内容从一个简单的定时计数器开始,逐步增加了开始、停止、继续、计次和重置等功能。文章详细讲解了如何通过`gloo::timers::Interval`管理定时器,以及如何利用组件的状态和消息(Msg)来处理用户交互和更新UI。
2022年3月12日
从CNF到DPLL算法
本文介绍了布尔可满足性(SAT)问题中的合取范式(CNF)和求解该问题的DPLL算法。内容首先解释了CNF的定义,然后通过四个步骤详细说明了如何将任意逻辑表达式转换为CNF。最后,概述了基于回溯搜索的DPLL算法如何解决CNF-SAT问题。
2022年3月6日
Rust框架Yew支持CSS
本文探讨了Rust的Yew框架中对CSS的支持方案。由于Yew核心未内置CSS支持,文章盘点并介绍了几款社区开发的样式库,如yew_styles、yew-mdc、muicss-yew和stylist-rs等,它们通过不同方式为Yew应用提供了CSS样式和布局能力。
2022年3月5日
联想小新pro 13 windows11 bug记录(2022)
本文记录了联想小新Pro 13笔记本在Windows 11系统上遇到的两个Bug。第一个是Windows Hello人脸识别无法录入,通过在设备管理器中卸载并重装摄像头驱动解决。第二个是使用Win+X快捷键导致资源管理器崩溃重启的问题,该问题已通过系统更新修复。
2022年2月26日
Rust框架Yew的使用
本文介绍了如何开始使用Rust的Yew框架来构建WebAssembly应用。内容涵盖了环境搭建,包括添加Wasm编译目标和安装构建工具`trunk`。通过一个“Hello World”示例,文章演示了如何创建项目、添加Yew依赖、编写基本组件,并最终使用`trunk serve`启动Web应用。
2022年2月19日
将Rust程序编译成WebAssembly
本文介绍了将Rust程序编译成WebAssembly的完整流程。内容涵盖了所需工具链的安装,包括rustup、wasm-pack和cargo-generate。通过一个“Hello World”示例,文章详细演示了如何从模板创建项目、添加Wasm编译目标、构建Wasm包,并最终通过npm在Web服务器上运行。
2022年2月12日
struct timespec转化为struct tm
本文总结了C语言中三种时间类型`time_t`、`struct timespec`和`struct tm`之间的相互转换方法。内容讲解了如何通过`mktime`、`localtime`和`gmtime`等标准库函数在`time_t`和`struct tm`之间转换,并说明了`struct timespec`可通过`time_t`作为中间桥梁进行转换。
2022年2月5日
C语言红黑树实现
本文详细介绍了红黑树的C语言实现。内容涵盖了红黑树的节点结构定义,以及创建、销毁、左旋、右旋、插入和删除等核心操作。文章对插入和删除后用于维持红黑树性质的修正(fixup)过程,根据不同情况进行了分类讨论,并提供了相应的代码实现。
2022年1月10日
nginx ssl配置问题(curl 60错误)
本文记录了一次因Nginx SSL配置不当导致`curl (60)`证书错误的排查过程。问题根源在于`acme.sh`安装证书时,仅配置了cert.pem而未使用包含完整证书链的fullchain.pem。通过在Nginx配置中改用fullchain文件,成功解决了本地签发机构证书无法验证的问题。
2022年1月8日
WSL2联网问题
本文解决了WSL2中因`/etc/resolv.conf`文件被自动覆盖而导致的域名解析失败问题。方法是通过在`/etc/wsl.conf`中设置`generateResolvConf = false`来禁止自动生成该文件,并使用`chattr +i`命令锁定自定义的`resolv.conf`,从而实现永久性的DNS配置。
2022年1月2日
docker 交叉编译
本文简要介绍了如何使用Docker进行交叉编译。核心步骤是利用`docker buildx`命令,通过创建和使用一个新的builder,并指定`--platform`参数(如`linux/arm64/v7`),即可为不同的CPU架构构建镜像。
2022年1月1日
docker 镜像 alpine 无法联网
本文记录了解决Docker中Alpine镜像无法联网的问题。在构建过程中遇到证书验证失败和域名解析错误,通过排查发现是`libseccomp`库版本过旧导致。最终,通过添加`--security-opt seccomp=unconfined`选项成功解决,并探讨了跨平台构建镜像的方案。
2021年12月19日
cargo报错
本文记录了一个cargo命令报错的解决方法。当遇到“error: no override and no default toolchain set”错误时,可以通过`rustup`工具重新安装并设置默认的stable工具链(`rustup install stable`和`rustup default stable`)来解决此问题。
2021年12月18日
WIFI通信
本文概述了基于IEEE 802.11标准的WiFi通信技术。内容涵盖了WiFi各代标准的发展、网络成员与结构(如BSS, ESS, AP),以及定义的九种服务。文章还详细解析了802.11的帧结构,对帧控制、地址、序列控制等各个字段的功能和含义进行了深入说明。
2021年12月4日
tar命令详解
本文详解了Linux中的`tar`命令。内容系统地梳理了解包(-x)、打包(-c)、查看(-t)等核心参数,并对结合gzip(-z)、bzip2(-j)等不同压缩方案的用法进行了说明。文章通过清晰的参数列表和示例,为用户提供了全面的`tar`命令使用参考。
2021年11月28日
C语言日期时间
本文讲解了C语言中处理日期和时间的方法。内容介绍了`time.h`库,区分了Unix时间(time_t)和日历时间(struct tm)等概念,并详细说明了`time()`、`localtime()`、`mktime()`等核心函数的功能和用法,通过代码示例展示了如何获取和格式化当前时间。
2021年11月21日
Coc-Clangd 配置
本文解决了Vim中Coc-Clangd因头文件与源文件分离而无法找到头文件的问题。核心方法是在项目根目录创建`compile_commands.json`或`compile_flags.txt`文件,并介绍了如何分别使用CMake和Bear(配合make)来自动生成该配置文件,以确保语言服务器正常工作。
2021年11月14日
C语言库函数之函数间的goto
本文介绍了C语言中几个实现非局部跳转和信号处理的库函数。内容涵盖了用于在函数间直接跳转的`setjmp()`和`longjmp()`,用于捕获和处理中断、异常等信号的`signal()`函数,以及用于定时触发中断的`alarm()`函数,为实现高级程序控制流程提供了方法。
2021年11月13日
C语言标准输出格式化
本文总结了C语言中`printf`函数的格式化输出。内容详细列举了各种类型的修饰符,如`%d`, `%f`, `%x`等,并解释了如何通过指定宽度和对齐方式来控制输出格式。文章还特别针对整型和浮点型数据,展示了包括补零、进制转换、科学计数法和小数位数控制等多种格式化技巧。
2021年10月20日
SPI协议
本文介绍了SPI(串行外设接口)协议。内容涵盖了SPI作为一种同步串行通信规范的定义,详细解释了SCLK、MOSI、MISO和SS四条信号线的功能,并说明了由时钟极性(CPOL)和相位(CPHA)决定的四种工作模式。文章还简要提及了Dual SPI和Quad SPI等扩展。
2021年10月5日
top命令笔记
本文是一篇关于Linux `top`命令的学习笔记。内容详细解读了`top`命令输出界面的各个部分,包括系统摘要信息、任务进程信息和CPU状态信息,并对各参数的含义进行了解释。此外,还介绍了一些常用的交互式命令,如按CPU或内存使用率进行排序。
2021年6月15日
WSL2网络测试
本文记录了解决WSL2网络连接问题的过程。内容涵盖了通过`netsh`端口转发实现Windows与WSL2之间的服务访问,以及如何通过脚本为WSL2设置固定IP地址并利用Windows计划任务实现自启动。此外,还提到了重启`iphlpsvc`服务来解决端口映射失败的问题。
2021年1月30日
C语言中的指针
本文深入探讨了C语言中复杂的指针声明,如指针数组、数组指针和函数指针。文章首先提供了一份详细的C语言运算符优先级和结合律表,然后运用这些规则,逐步分析并解释了多种复杂指针声明的含义,帮助读者准确理解其结构。
2020年10月16日
git基本用法笔记
本文是一份Git基本用法的笔记。内容涵盖了分支的建立与合并(`merge`与`rebase`的区别),利用相对引用(`^`和`~`)在提交记录间移动HEAD指针,以及如何通过`reset`、`revert`、`cherry-pick`和交互式`rebase`等命令来撤销或修改提交记录,为版本控制提供了实用的操作指南。
2020年10月15日
matplotlib绘制x轴不连续的图
本文解决了使用matplotlib绘制X轴不连续数据时,图表会自动补全的问题。核心方法是,先将Y轴数据对一个连续的整数序列(如`range(len(y))`)进行绘图,然后利用`plt.xticks()`函数,将图表上连续的整数刻度标签替换为原始的不连续X轴数据标签,从而实现视觉上的不连续效果。
2020年10月12日
在wsl上安装Arch Linux
本文介绍了在Windows子系统(WSL)上安装Arch Linux的方法。文章放弃了传统的Bootstrap镜像安装,转而推荐使用专为WSL设计的ArchWSL分发版进行安装。内容还涵盖了安装后的关键配置步骤,如初始化pacman密钥环,以及为不支持systemd的WSL1安装替代方案。
2020年10月11日
python标准库模块heapq
本文介绍了Python标准库中的`heapq`模块,它提供了一系列高效的堆排序算法。文章首先解释了堆(近似完全二叉树)的基本性质,然后详细列举并说明了`heapq`模块中的核心函数,如`heapify`、`heappush`、`heappop`、`nsmallest`和`nlargest`等,为实现优先队列等数据结构提供了便利。
2020年8月30日
初探Tornado
本文初步探讨了Python的Tornado Web框架。文章重点阐述了其两大核心特点:异步和非阻塞。内容对比了Tornado与Flask、Django等WSGI框架在服务器实现上的不同,并深入解释了异步非阻塞IO模型的重要性,以及Tornado如何利用epoll实现高效的IO多路复用,以支持高并发连接。
2020年8月29日
mysql 新建用户
本文是一篇关于MySQL用户管理的快速笔记。内容清晰地列出了新建用户的`CREATE USER`命令,为用户授权的`GRANT`命令,以及撤销权限的`REVOKE`命令。文章还强调了在修改权限后需要使用`FLUSH PRIVILEGES`命令来使更改立即生效,为数据库管理员提供了简洁实用的操作指南。
2020年7月23日
vim及插件编译
本文记录了Vim及其插件YouCompleteMe的编译过程。内容详细列出了编译Vim时推荐的配置选项,如启用huge特性、多字节支持以及Python、Ruby等多种语言解释器。同时,还提到了编译过程中可能遇到的缺少ncurses终端库的问题,并给出了安装相应开发包的解决方案。
2020年7月22日
命名实体识别
本文概述了命名实体识别(NER)技术的发展。内容涵盖了从早期的基于词典和规则的方法,到传统的机器学习模型如HMM、MEMM和CRF,再到现代的深度学习方法如Bi-LSTM-CRF。文章对比了不同方法的优缺点,并提及了最新的研究方向,为理解NER技术提供了全面的视角。
2020年7月21日
confluent系列软件介绍
本文介绍了Confluent平台系列软件。内容涵盖了Zookeeper、Kafka、Schema Registry、Kafka-Rest、Connect、ksql-server和Control-center等核心组件的功能和作用,并解释了它们如何协同工作。最后还提供了在本地环境中一键启动和关闭整个Confluent平台的命令。
2020年7月19日
初步了解kafka
本文是对分布式消息系统Kafka的初步介绍。内容涵盖了Topic、Producer、Consumer和Broker等核心术语的解释。文章还提供了启动Kafka服务的基本步骤,包括启动依赖的ZooKeeper,创建主题,以及通过命令行工具运行生产者和消费者的简单示例,为初学者提供了快速入门的指引。
2020年5月14日
一些有用的python函数
本文整理了一些实用的Python内置函数和标准库模块。内容涵盖了基础的`map`和`filter`函数,用于堆操作的`heapq`模块,以及`functools`模块中的`reduce`函数和`lru_cache`装饰器。这些工具能够有效简化代码,提高数据处理和算法的执行效率。
2020年5月12日
集合合并问题
本文探讨了一个集合合并问题:为n只袜子进行最少次数的染色,以满足m天的配对需求。核心思路是将每天需要配对的袜子看作一个集合,通过合并所有关联的袜子对,形成若干个独立的集合。在每个集合内,将所有袜子染成其中出现次数最多的颜色,即可得到最优解。文章提供了一种基于循环合并的Python实现。
2020年5月11日
python的整除
本文讲解了Python中的整除运算符`//`。重点解释了其在处理负数时向下取整(floor division)的特性。文章还提供了一份详细的Python运算符优先级列表,指出一元负号(-)的优先级高于乘除、取模和整除等算术运算符,有助于避免在复杂表达式中出现计算错误。
2020年4月8日
数独的解法
本文介绍了使用回溯法解决数独问题的算法。其核心思想是通过深度优先搜索(DFS)遍历所有空白单元格,并尝试填入1到9的数字。为了高效判断填入数字的合法性,算法使用三个二维数组分别记录每行、每列以及每个3x3九宫格内数字的占用情况,从而实现了有效的剪枝和回溯。
2020年4月6日
tensorflow2建立模型的方法
本文介绍了在TensorFlow 2中创建Keras模型的三种主要方法。第一种是使用函数式API,通过`tf.keras.Input`定义输入层来构建灵活的模型。第二种是通过继承`tf.keras.Model`类并重写`call`方法来创建完全自定义的模型。第三种是使用`tf.keras.Sequential`容器,快速搭建简单的线性层叠模型。
2020年3月26日
栈实现四则远算
本文讲解了如何使用栈结构实现一个支持四则运算的计算器。核心思路分为两步:首先,通过一个符号栈将中缀表达式转换为后缀表达式(逆波兰表示法);然后,再利用一个数字栈对后缀表达式进行求值。文章详细描述了转换和计算的规则,并提供了完整的Python代码实现。
2020年3月24日
linux交换分区
本文介绍了如何在Linux系统中新建并启用硬盘交换分区。内容包括根据物理内存大小选择合适的交换分区容量的建议,使用`mkswap`命令创建交换分区,通过`swapon`命令启用分区,以及如何修改`/etc/fstab`文件以实现开机自动挂载。
2020年3月24日
vim中的leetcode插件
本文记录了Vim中`leetcode.vim`插件的安装与问题排查过程。内容涵盖了依赖安装、Vundle配置,并重点解决了因`keyring`后端和`browser-cookie3`库与新版Chrome不兼容而导致的登录失败问题,提供了安装`keyrings.alt`和从Git更新`browser-cookie3`等解决方案。
2020年3月15日
vim命令记录
本文记录了Vim中的一些实用命令,重点介绍了代码折叠功能。文章列举了Vim支持的六种折叠方式,并详细说明了如何配置和使用基于缩进(indent)的折叠。内容包括全局和单行折叠的开关命令(如`zm/zr`, `zc/zo`)以及在折叠代码间快速移动的快捷键。
2020年3月13日
实现让终端走代理
本文介绍了如何让终端流量走代理。核心方法是通过设置`http_proxy`和`https_proxy`等环境变量。文章还提供了一个在`.zshrc`中创建`setproxy`和`unsetproxy`别名以方便切换代理的技巧,并讨论了v2ray代理中`socks`与`socks5`设置可能引发的`curl`解析错误问题。
2019年12月21日
Transformers
本文介绍了Hugging Face的Transformers库,一个强大的Python库,提供了BERT、GPT-2等多种预训练模型用于NLU和NLG任务。文章概述了该库的特点,列举了其支持的多种主流模型,并详细说明了库的核心使用方法,包括模型(Model)、配置(Config)和分词器(Tokenizer)三个主要类。最后通过一个BERT的实例,展示了如何加载模型、处理文本输入以及进行预测。
2019年11月15日
机器学习笔记
本文是一篇关于机器学习评估指标的学习笔记。内容分为两部分:第一部分详细介绍了分类任务中常用的评估指标,包括准确率、精确率、召回率以及它们的调和均值F1分数。第二部分则聚焦于自然语言处理领域的序列评估指标,讲解了用于机器翻译的BLEU和用于自动摘要的ROUGE(特别是ROUGE-N和ROUGE-L)的计算方法和核心思想。
2019年10月2日
交叉熵损失的反向传播
本文详细推导了在多分类问题中,结合Softmax激活函数和交叉熵损失函数的反向传播过程。文章从定义Softmax和交叉熵损失开始,逐步计算了损失对网络输出的偏导,以及Softmax函数对其输入的偏导(雅可比矩阵)。最终通过链式法则,得出了一个简洁而优美的结论:损失对Softmax层输入的梯度等于模型的预测概率与真实标签之差(ŷ - y)。
2019年10月2日
矩阵中的求导
本文简要介绍了矩阵微积分中的两种基本求导运算。第一种是标量对向量求导,其结果是一个行向量,包含了该标量对向量中每个元素求偏导数的值。第二种是向量对向量求导,其结果是一个雅可比(Jacobian)矩阵,矩阵的每一列是输出向量中的一个分量对输入向量求导的结果。文章明确了求导结果的维度和布局约定。
2019年9月9日
nvidia显卡驱动错误
本文记录了一次解决Linux系统下Nvidia显卡驱动错误的经历。在使用`bumblebee`进行双显卡切换时,`optirun`命令报错“Failed to load module "nouveau"”。作者通过修改`/etc/bumblebee/xorg.conf.nouveau`文件,取消对`BusID`的注释并正确指定显卡PCI地址,最终成功禁用了nouveau开源驱动,并加载了nvidia专有驱动。
2019年9月8日
基于统计的分词方法
本文主要介绍了基于统计的中文分词方法。首先讲解了N-gram语言模型(一元、二元、三元)的基本原理。接着,重点阐述了隐马尔可夫模型(HMM)在分词中的应用,详细定义了HMM的五个核心参数,并概述了其三大基本问题:概率计算、学习问题和解码问题,以及对应的算法(前向后向、鲍姆-韦尔奇、维特比),最后还对比了HMM、MEMM和CRF模型的特点。
2019年9月7日
神经图灵机
本文解读了神经图灵机(Neural Turing Machine, NTM)的核心机制。NTM通过一个外部记忆矩阵增强了神经网络的能力。文章详细介绍了其读、写操作过程,关键在于一个可微的定位向量(addressing vector)。该向量的生成结合了基于内容的寻址(通过余弦相似度)和基于位置的寻址(通过插值、循环卷积偏移和重塑),使得模型能够端到端地学习访问和修改记忆。
2019年9月6日
小样本学习的边缘标签图神经网络
本文解读了论文《Edge-Labeling Graph Neural Network for Few-shot Learning》。该方法将小样本分类问题转化为图节点标签预测任务,通过构建一个边标签图来学习样本间的关系。文章介绍了模型的核心思想:利用卷积网络提取特征,构建图结构,并通过图神经网络的邻域聚合框架迭代更新节点和边的特征,最终预测查询样本的类别。
2019年9月3日
记一次GRUB引导修复
本文记录了一次在Arch Linux与Windows 10双系统环境下,因Windows更新和修复导致GRUB引导丢失的修复过程。作者在尝试多种方法失败后,最终通过在`grub-install`命令中添加`--removable`参数,或手动将GRUB文件移动到缺省/后备启动路径(EFI/BOOT/BOOTX64.EFI),成功解决了引导卡在`GRUB _`闪烁的问题,恢复了系统启动。
2019年8月25日
深度学习在中文分词和词性标注中的应用
本文概述了一种结合深度学习进行中文分词和词性标注的方法。其核心流程是:先将字转换为字向量,通过窗口方法获得包含上下文信息的向量,再经过神经网络层得到每个字的标签得分。模型引入了标签间的转移分数,并使用维特比(Viterbi)算法在全局上寻找最优的标签序列路径,通过最大化对数似然函数进行端到端的训练。
2019年8月22日
OWL基础
本文介绍了Web本体语言(OWL)的基础知识。内容涵盖了OWL的基本元素,如类、个体和属性,并解释了其与RDF的关系。文章还详细介绍了RDF的多种序列化方法,包括RDF/XML、N-Triples、Turtle、RDFa和JSON-LD,并以RDF/XML和Turtle为例展示了具体的语法格式和使用方法,为理解语义网技术提供了入门指导。
2019年8月20日
sklearn中的广义线性模型
本文概述了scikit-learn库中的多种广义线性模型。内容从普通最小二乘法(LinearRegression)开始,依次介绍了岭回归(Ridge)、Lasso回归、多任务Lasso(MultiTaskLasso)、弹性网络(ElasticNet)以及多任务弹性网络(MultiTaskElasticNet)。文章对每种模型的目标函数进行了数学公式的展示,并解释了关键参数(如α和ρ)的作用,为理解和选择线性模型提供了清晰的指导。
2019年8月19日
集成学习算法总结
本文总结了集成学习中的几种核心算法。内容主要介绍了Bagging(如随机森林)和Boosting(如AdaBoost)两大类方法的思想和区别。此外,还详细阐述了梯度提升(Gradient Boosting)算法的原理和步骤,并点明了随机森林、提升树和GBDT等模型分别是Bagging或Boosting与决策树结合的产物,为理解集成学习提供了清晰的框架。
2019年8月18日
信息论的一些基本概念
本文简明扼要地介绍了信息论中的几个核心基本概念。内容涵盖了信息熵、条件熵、信息增益、基尼系数(基尼不纯度)、信息增益比率、分裂信息、边界熵以及边界多样性(Accessor Variety, AV)的定义和数学公式。这些概念是机器学习,特别是决策树和自然语言处理中进行特征选择和模型评估的基础。
2019年8月10日
mathjax配置问题
本文解决了在使用Hexo时MathJax无法正确渲染单行公式的问题。文章指出,MathJax自2.3版本后配置方式发生变化,旧的`MathJax.Hub.Config`配置不再适用。文中提供了新的配置方法,即使用`window.MathJax`对象进行设置,并提及了解决Hexo默认转义问题的方法,确保公式能正确显示。
2019年7月26日
pytorch使用和损失函数
本文总结了PyTorch框架中的常用操作和损失函数。内容首先介绍了激活函数和BatchNorm2d等层,以及`normalize`, `cat`, `stack`等张量操作。接着,详细列举并解释了多种损失函数,如L1Loss, MSELoss, CrossEntropyLoss, NLLLoss, BCELoss, HingeEmbeddingLoss, CosineEmbeddingLoss等,并给出了它们的数学公式,为PyTorch使用者提供了全面的参考。
2019年7月21日
常见损失函数
本文介绍了机器学习中常见的几种损失函数。内容包括0-1损失函数、平方损失函数、绝对损失函数以及对数损失函数(或称对数似然损失函数),并给出了它们的数学表达式。此外,文章还引入了风险函数的概念,即损失函数的期望值,并区分了经验风险和结构风险,为理解模型评估和优化提供了基础。
2019年7月10日
神经网络中的前向传播与后向传播
本文详细阐述了神经网络中的前向传播和后向传播算法。文章首先通过数学公式清晰地描述了数据在多层神经网络中逐层前向传播的过程。接着,重点推导了后向传播的核心,即如何计算每一层的误差项(δ),并利用链式法则得出了损失函数对权重(W)和偏置(b)的偏导数计算公式,最后给出了参数更新的完整步骤。
2019年7月9日
深度学习中 Keras vs Pytorch
本文翻译并对比了深度学习框架Keras和PyTorch的四个主要不同点。内容包括:模型定义方式(Keras的函数式API vs PyTorch的类继承)、底层操作(Keras隐藏细节 vs PyTorch的张量和动态图)、模型训练流程(Keras的`.fit()` vs PyTorch的显式循环)以及CPU/GPU模式的控制。文章建议初学者从Keras入手,而需要更高灵活性的开发者则可以选择PyTorch。
2019年7月4日
优化算法总结
本文总结了深度学习中几种主流的优化算法。内容详细介绍了AdaGrad、RMSProp和Adam优化器的核心思想和数学更新公式,解释了它们如何自适应地调整学习率。此外,文章还通过Python代码示例,模拟并对比了随机梯度下降(SGD)、小批量梯度下降(MSGD)和批量梯度下降(BGD)这三种基本的梯度下降方法在参数更新上的不同之处。
2019年5月31日
Python中遇到的问题
本文记录了Python编程中遇到的两个常见问题。第一个是关于二维列表的错误初始化方式,即使用`[[0]*3]*3`会导致子列表为引用而非独立副本,并给出了正确的列表推导式初始化方法。第二个问题探讨了`is`与`==`的区别,`==`比较对象内容,而`is`比较对象实例的内存地址,并对Python中字符串的内存分配现象进行了观察。
2019年5月21日
Linux常用命令
本文汇总了Linux中常用的一些命令。内容涵盖了`tar`命令的打包与解压操作,`wget`设置代理的两种方法,`ps`命令查看进程信息,以及用户和用户组管理的命令,如`useradd`, `userdel`, `groupadd`, `chown`等,为Linux日常使用提供了实用的命令参考。
2019年4月21日
UML图介绍
本文全面介绍了统一建模语言(UML)中的各种图及其在软件开发过程中的应用。内容涵盖了用例视图(用例图)、设计视图(类图、对象图)、进程视图(序列图、协作图、状态图、活动图)、实现视图(构件图)和拓扑视图(部署图)。文章还总结了这些UML图在需求、分析、设计、实现、测试等不同软件开发阶段所扮演的角色。
2019年4月5日
边缘计算系统中延迟敏感任务的成本有效调度
本文研究了边缘计算系统中延迟敏感任务的成本效益调度问题。文章将该问题建模为一个NP难的优化问题,目标是在满足所有任务延迟要求的前提下,最小化整个系统的成本。为解决此问题,作者提出了一种名为“两阶段任务调度成本优化”(TTSCO)的近似算法,并通过与最优解的对比验证了其有效性,证明该算法能显著降低系统成本。
2019年3月20日
java注解的使用
本文介绍了Java中的注解(Annotation)及其使用。主要讲解了三种标准注解(@Override, @Deprecated, @SuppressWarnings)和四种元注解(@Target, @Retention, @Documented, @Inherited)的功能与用法,并提及了Java 7和8中新增的@SafeVarargs, @FunctionalInterface, @Repeatable注解。
2019年3月10日
数据可视化开源项目
本文盘点了一系列优秀的数据可视化开源项目,主要基于JavaScript。文中列举并介绍了多个知名的图表库,如D3.js、Chart.js、LeafletJS(专注于地图)、ECharts(百度出品)、Chartist.js等。此外,还提及了阿里巴巴的AntV系列可视化解决方案,包括G2、G6、F2和L7,为开发者提供了丰富的选择。
2018年10月19日
简单的iptables配置过程
本文记录了一个简单而实用的iptables防火墙配置流程,方便日后查阅。文章将配置过程总结为四个核心步骤:首先,清除所有旧的、自定义的规则;其次,为INPUT、OUTPUT、FORWARD等链设定默认的策略(如默认拒绝所有入站请求);接着,根据需要添加具体的自定义规则,例如允许特定端口(如SSH的22端口)的TCP连接;最后,讲解了如何保存当前配置,以确保重启后规则依然生效。
2018年10月18日
socket网络编程
本文是一篇关于Socket网络编程中常用函数的学习笔记。文章详细列举并解释了多个关键函数的功能和用法,包括用于IP地址格式转换的`inet_aton`, `inet_ntoa`, `inet_addr`, `inet_pton`和`inet_ntop`。此外,还介绍了用于I/O多路复用的`select`函数,用于设置套接字选项的`setsockopt`函数,以及用于接收数据的`recvfrom`函数,为网络编程提供了重要的参考。
2018年9月22日
形式语言与自动机基础知识
本文为学习《形式语言与自动机》课程所需的基础知识提供了精炼的总结,特别适合没有离散数学背景的读者。内容系统地梳理了集合论的基本概念,包括子集与真子集、集合的交、并、差、补运算、幂集以及笛卡尔乘积。此外,文章还详细定义了集合之间的关系及其性质,如自反性、对称性和传递性,并最终引出了等价关系的概念,为后续课程学习打下坚实基础。
2018年9月8日
梯度旋度和散度
本文清晰地记录和解释了向量微积分中三个核心概念:梯度(Gradient)、旋度(Curl)和散度(Divergence)。文章分别给出了它们的数学定义和计算公式。梯度是指标量场在某点的变化率最大的方向和大小;旋度描述了向量场在某点附近的旋转程度;而散度则衡量了向量场在某点的源或汇的强度。文中使用了∇算子来形象地表示这三个概念,便于理解和记忆。
2018年6月23日
vim的使用
本文是一篇简洁的Vim编辑器使用入门指南。文章主要介绍了两个方面的基本操作:一是光标的移动,包括使用`h,j,k,l`进行基本移动,通过`Ctrl`组合键实现翻页,以及利用`H,M,L,G`等命令进行快速定位。二是搜索与替换功能,讲解了如何使用`/`和`?`命令进行向下和向上搜索,以及如何使用`n`和`N`键重复上一次的搜索操作。
2018年5月17日
python中关于路径的知识
本文简明扼要地总结了Python中`os`模块里用于处理文件和目录路径的几个常用函数。内容涵盖了获取当前工作目录(`os.getcwd`)、列出目录内容(`os.listdir`)、删除文件(`os.remove`或`os.unlink`)、删除空目录(`os.rmdir`)、递归删除目录(`os.removedirs`)以及更改当前工作目录(`os.chdir`)等基本操作,为Python进行文件系统交互提供了实用的命令参考。
2018年5月17日
python类和实例的一些属性
本文深入探讨了Python中类与实例的一些特殊属性和方法。内容详细讲解了`self`与`__init__`方法的作用,区分了类属性和实例属性,并展示了如何通过`__class__`访问被实例属性覆盖的类属性。此外,文章还介绍了如何利用`__init__`统计类的实例数量,`__dict__`属性在类和实例中的不同内容,以及如何通过实现`__len__`和`__getitem__`等魔术方法让自定义对象支持内置函数和操作。
2018年4月28日
python3之模块
本文系统地介绍了Python 3中模块的基本概念和使用方法。内容包括模块的定义(即.py文件),两种主要的引入方式`import`和`from...import`及其区别。文章还讲解了Python解释器如何通过搜索路径(sys.path)查找模块,并阐述了命名空间的基本概念以及全局变量在函数中的使用。此外,还简要讨论了模块中可执行代码的执行时机和循环引入等问题。
2018年2月12日
DEBUG常用功能
本文介绍了在Windows 10系统中安装和使用汇编调试工具DEBUG的方法。内容包括通过DOSBox软件进行安装和配置,并详细讲解了DEBUG中的常用命令,如R(查看/修改寄存器)、D(查看内存)、E(修改内存)、U(反汇编)、T(单步执行)和A(写入汇编指令),并配有具体的使用实例截图,为汇编语言初学者提供了清晰的入门指导。
2018年1月22日
Git使用中的一些问题
本文总结了Git使用过程中常见的一些配置和操作问题。内容涵盖了全局和项目级别的用户信息配置方法,SSH密钥的生成、查看及测试连接。文章还通过图示清晰地解释了Git的工作区、暂存区和版本库三个核心概念,并详细说明了`git add`, `git commit`, `git reset`, `git rm --cached`, `git checkout`等关键命令在不同区域之间切换和重置文件的作用及其潜在风险。
2018年1月11日
简单了解汇编
本文为初学者提供了一份关于汇编语言的简明介绍。文章首先阐述了汇编语言的本质,即作为机器指令的人类可读形式,以及它如何通过编译器转换为计算机可执行的机器码。接着,简要介绍了计算机系统中起关键作用的三种总线:数据总线、地址总线和控制总线。最后,还说明了RAM(随机存取存储器)和ROM(只读存储器)在程序运行和系统启动中的基本功能和区别。
2017年12月26日
python遇到的错误
本文记录了作者在使用Python过程中遇到的两个具体错误及其解决方案。第一个错误是“ImportError: DLL load failed”,通常是由于安装的pywin32库与Python解释器的位数(32位或64位)不匹配导致,需要下载对应版本的库。第二个错误是使用libsvm时出现的“Exception: LIBSVM library not found.”,原因同样是库文件与Python版本位数不符,解决方法是从特定网站下载预编译的.whl文件并替换其中的库文件。
2017年12月26日
位运算的妙用之二进制1的个数
本文探讨了如何高效地计算一个正整数在二进制表示中“1”的个数。文章首先介绍了一种常规解法,即通过循环和位移操作(>>)逐位判断该数的二进制位是否为1。随后,文章重点展示了一种被称为“大神解法”的高效算法,该算法巧妙地运用了一系列位与(&)、位移(>>)和加法操作,通过分治和并行的思想,在几次运算内即可完成统计,极大地提升了计算效率,展示了位运算的精妙之处。
2017年12月21日
C语言文件读写
本文是一篇C语言文件操作的基础学习笔记。文章系统地列出了C语言中用于文件读写的核心函数,如`fopen`用于打开文件、`fclose`用于关闭文件,以及`fgetc`/`getc`和`fputc`/`putc`用于逐字符读写。同时,详细解释了`fopen`函数中各种文件访问模式(type)的含义和区别,包括"r"(读)、"w"(写)、"a"(追加)以及它们的组合形式(如"r+"、"w+"),并指出了处理二进制文件时需要使用的相应模式。
2017年12月21日
sublime_Text3插入当前时间
本文提供了一个在Sublime Text 3中实现快速插入当前日期和时间功能的详细教程。整个过程分为三步:首先,通过“New Snippet”创建一个代码片段(.sublime-snippet),定义好包含时间占位符的文本模板。其次,通过“New Plugin”创建一个Python插件(.py),编写一个命令来获取当前系统时间并插入。最后,在用户快捷键设置(Key Bindings)中,将这个新创建的命令绑定到一个自定义的快捷键(如alt+t),从而实现一键插入当前时间的功能。
2017年12月21日
字符串匹配
本文主要探讨了两种经典的字符串匹配算法。第一种是朴素的暴力匹配算法(BM),文章给出了其C语言实现,通过双重循环在主串中查找模式串。第二种是更高效的KMP算法,它通过预处理模式串生成一个next数组,在匹配失败时能够智能地移动模式串,避免了主串指针的回溯。文章同样提供了KMP算法的C语言实现代码,包括核心的`getnext`函数,并引用了外部文章作为进一步学习的参考。
2017年12月12日
图片头文件解析
本文主要对图片文件的头部信息进行了解析,并以PNG格式作为详细示例。文章首先深入讲解了PNG文件起始的8个字节的文件标识(Signature)的构成及其每个字节的具体含义,例如用于检测传输系统是否支持8位编码和识别文件类型等。接着,文章介绍了PNG文件由数据块(chunk)构成的基本结构,区分了必须包含的关键数据块(如IHDR, IDAT, IEND)和可选的辅助数据块,并通过表格清晰地列出了各种数据块的名称、功能和位置限制。
2017年9月12日
CentOS自带python26升级到27
本文详细介绍了在CentOS系统中将自带的Python 2.6版本升级到2.7.3的具体步骤。内容涵盖了从官网下载Python 2.7.3源码包,通过编译安装(configure, make, make install)完成新版本的部署,以及如何通过建立软链接(ln -s)将系统默认的python命令指向新安装的2.7版本。同时,文章还特别指出了升级后需要修复yum命令对旧版Python依赖的问题,通过修改`/usr/bin/yum`文件确保系统工具的正常运行。
2017年9月5日
C实现简单TCP通信
本文介绍了如何使用C语言实现一个简单的TCP通信程序。文章分别提供了服务器端和客户端的完整代码示例,并详细讲解了关键步骤,包括加载Windows套接字库(ws2_32.lib)、创建套接字(socket)、设置服务器地址和端口、绑定(bind)、监听(listen)、接受连接(accept)以及收发数据(send/recv)。该示例代码清晰地展示了一个基础的客户端-服务器通信模型,适合初学者学习和理解网络编程的基本原理。
2017年9月5日
VC6聊天室程序设计
本文介绍了一个使用VC6++环境,基于C语言、TCP套接字和多线程技术开发的简单聊天室程序。文章分别阐述了客户端和服务器端的设计思路。客户端采用双线程模式,一个用于接收用户输入并发送,另一个用于持续接收并显示服务器消息。服务器端则设计了三个线程,主线程负责监听和接受新的用户连接,第二个线程处理来自客户端的消息,第三个线程则将收到的消息广播给所有在线的用户,并通过一个链表来管理所有客户端信息。
2017年9月4日
C语言多线程学习
本文是一篇关于在Windows环境下使用C语言进行多线程编程的学习笔记。文章通过一个简单的实例,详细讲解了如何使用`CreateThread`函数来创建一个新的子线程,并说明了该函数的各个参数的意义和用法。此外,还探讨了如何向线程函数传递参数,以及`WaitForSingleObject`函数在主线程中等待子线程执行完毕的重要性,以避免主程序提前退出导致子线程未执行完成的问题。
2017年9月2日
windows系统盘瘦身
本文提供了一些为Windows系统C盘进行“瘦身”的实用技巧,旨在解决系统盘空间不足的问题。文章主要介绍了三个有效的方法:一是通过命令行`powercfg -h off`关闭系统休眠功能,从而安全地删除占用大量空间的休眠文件(Hiberfil.sys);二是将系统的虚拟内存(页面文件)从C盘移动到其他磁盘分区;三是清理系统中的临时文件,包括Windows的temp目录、ProgramData下的TEMP目录以及用户个人文件夹下的临时文件目录。
2017年9月1日
powershell卸载自带应用
本文提供了一系列实用的PowerShell命令,用于卸载Windows系统中自带的应用程序,帮助用户清理和简化系统。文章首先给出了一个可以一次性卸载当前用户所有自带应用的通用命令。随后,详细列举了针对特定应用的卸载命令,例如OneNote、3D应用、相机、邮件和日历、Groove音乐、人脉、照片以及Xbox等,方便用户根据自己的需求选择性地移除不需要的预装软件。
2017年9月1日
powershell脚本遍历目录
本文提供了一个实用的PowerShell脚本示例,用于遍历指定目录及其所有子目录,并计算每个子文件夹的总大小。脚本的核心是一个名为`filesize`的自定义函数,该函数接收一个文件路径作为参数,然后利用`dir -Path`和`ForEach-Object`循环遍历目录。对于每个子文件夹,它会通过`dir -Recurse`递归获取所有文件并累加其大小(Length属性),最终以KB为单位输出每个文件夹的名称和计算出的总大小。
2017年8月19日
自己写一个Android照相机应用-2
本文是开发自定义Android相机应用系列教程的第二部分,重点讲解了如何实现一个自定义的相机界面。内容涵盖了Camera对象的生命周期管理,包括获取、预览和释放相机资源,并将其与Activity的生命周期(onResume, onPause)进行绑定。文章还详细说明了如何使用SurfaceView来显示相机预览,如何设置相机参数(如图片格式、尺寸、自动对焦),以及如何通过调用`takePicture`方法并利用其回调函数来捕获图像数据,最终将照片保存到文件中。
2017年8月10日
JAVA套接字之TCP实现聊天室
本文通过Java套接字(Socket)和多线程技术,实现了一个功能完整的TCP聊天室。文章详细展示了客户端和服务器端的代码。客户端设计了两个线程,分别负责向服务器发送消息和监听并显示来自服务器的消息。服务器端则更为复杂,由主类监听客户端连接请求,并为每个连接创建一个独立的`ServerThread`线程进行处理,同时还有一个`PrintOutThread`线程专门负责将消息队列中的信息广播给所有在线用户,支持多人随时加入和退出。
2017年8月9日
JAVA套接字之TCP简单实用
本文介绍了Java中TCP套接字编程的基础知识和实用方法。文章通过两个具体的示例进行讲解:第一个是单客户端与服务器的排队连接通信,展示了基本的Socket、ServerSocket、BufferedReader和PrintWriter的使用。第二个示例则演示了如何通过多线程技术,使服务器能够同时处理多个客户端的连接请求,为每个客户端分配一个独立的线程进行通信,从而实现了并发服务的能力。
2017年8月9日
Matlab函数freqs和freqz
本文详细介绍了Matlab中两个用于分析滤波器频率响应的重要函数:`freqs`和`freqz`。文章首先讲解了`freqs`函数,它用于计算和绘制模拟滤波器(连续系统)的复频域响应,并给出了一个具体的传递函数示例。接着,文章介绍了`freqz`函数,该函数专门用于求解和绘制离散时间系统的频率响应特性,并说明了其不同的调用格式以及如何绘制幅频和相频特性曲线。
2017年8月9日
涉及PyQt5的一些命令
本文记录了几个与Python PyQt5开发相关的常用命令和技巧。内容涵盖了如何使用`pip`安装PyQt5库,如何利用`pyuic`工具将Qt Designer创建的`.ui`文件转换为Python代码(.py)。在控件使用方面,介绍了如何将`QLineEdit`设置为密码输入模式。最后,文章还讲解了如何使用`pyinstaller`工具将PyQt5应用程序打包成独立的可执行文件(.exe),并对`-F`、`-w`等常用打包参数的含义进行了解释。
2017年8月9日
自己写一个Android照相机应用-1
本文是开发自定义Android相机应用系列教程的第一部分,主要介绍了调用系统相机所需的基础知识。内容包括如何使用`Intent`配合`MediaStore.ACTION_IMAGE_CAPTURE`来启动系统相机程序。文章讲解了两种获取拍摄结果的方式:一种是通过`startActivityForResult`直接从返回的`Intent`数据中获取缩略图(Bitmap),另一种是指定一个文件URI作为输出路径(`MediaStore.EXTRA_OUTPUT`),然后从该文件中读取高清原图。此外,还提到了获取存储权限和处理`onActivityResult`回调的必要步骤。
2017年8月4日
搬瓦工VPS搭建Web服务器
本文是一篇在搬瓦工(Bandwagon Host)的CentOS VPS上搭建Web服务器的教程。文章详细记录了安装Apache、PHP和MySQL(LAMP环境)的全过程。内容包括使用`yum`命令分别安装httpd、php及其常用组件、mysql-server等软件包,以及如何使用`service`命令启动、停止和重启各项服务。此外,还介绍了如何通过`chkconfig`命令将服务设置为开机自启动,并讲解了如何为MySQL的root账户设置初始密码,为搭建一个完整的网站运行环境提供了清晰的步骤指导。
2017年8月3日
Python2与Python3共存
本文详细介绍了在Windows操作系统下如何安装并配置Python 2和Python 3,以实现两个版本的和谐共存。主要步骤包括:将不同版本的Python安装到不同的目录下,正确配置系统环境变量(Path),将各自安装目录下的`python.exe`重命名为`python2.exe`和`python3.exe`以便区分调用,最后通过强制重新安装pip来解决两个版本的包管理工具冲突问题,确保`pip2`和`pip3`能够正常使用。
2017年8月3日
搬瓦工安装ss并加速
本文介绍了在搬瓦工(Bandwagon Host)VPS上安装并优化Shadowsocks(SS)的几种方法。文章首先不推荐使用搬瓦工后台自带的一键安装,因为它速度较慢。接着,重点推荐使用shell脚本进行安装,并分别给出了安装ShadowsocksR(速度快,推荐)和Shadowsocks-Go版本的命令。此外,还涵盖了服务的启动、停止、重启等管理命令,修改配置文件以支持多用户的方法,以及解决CentOS默认未安装wget等常见问题的步骤。
2017年7月2日
JAVA实现MD5加密
本文介绍了在Java中实现MD5加密的两种不同方法。第一种方法是调用Java自带的`java.security.MessageDigest`类,通过几行简单的代码即可快速生成32位或16位的MD5摘要。第二种方法则是从零开始,详细地编写了一个完整的MD5算法实现,包括对幻数、常量、分组处理、四轮循环运算等核心逻辑的逐步讲解,让读者能够深入理解MD5加密算法的内部工作原理。
2017年6月25日
谷歌浏览器运行安卓APK
本文记录了作者探索使用谷歌浏览器插件ARChon在电脑上运行安卓APK文件的过程和遇到的问题。文章详细描述了解决一系列错误的方法,包括处理“CRX_SIGNATURE_VERIFICATION_FAILED”包无效错误,修改插件文件夹名,解决manifest.json中的import和message元素缺失问题等。作者还提到了使用twerk应用来转换APK,以及通过开启浏览器硬件加速和相关标志来解决WebGL不受支持的问题,最终成功在Chrome中运行了简书等应用。
2017年4月22日
批处理for循环使用
本文详细解析了Windows批处理(Batch)脚本中`FOR`循环命令的用法。文章首先区分了在命令行直接使用(%variable)和在批处理文件(.bat)中使用(%%variable)的语法差异。接着,深入讲解了`FOR`命令的各种扩展参数,包括/D(遍历目录)、/R(递归遍历)、/L(数字序列循环)和/F(文件内容、字符串及命令输出解析),并对/F的delims、tokens等选项做了详细说明。最后,还介绍了强大的变量扩展修饰符(如%~dpI, %~nxI),用于提取路径、文件名等信息。