去年(2025年)12 月份入职,到现在刚好半年的时间。到现在基本熟悉了一个底层一线程序员(业务开发)的日常生活以及工作模式,同时也见证了 AI 是如何一步一步优化甚至取代我的工作的。本文没有固定格式,想到什么说什么。 工作内容 先说一下我(RD)平时的开发流程。一般是产品(PM)跟运营(OP)对接,调研用户需求,然后按照自己的想法提出现有线上功能的优化点或者增加一些功能。他们(PM)会把这些功能编写为一个格式规范、细节明确的 PRD 文档并进行提需。我(RD)在当前有人力时就需要 Pick 这个需求,Pick 完之后需要进行排期并按照排期时间要求进行开发,开发并自测完成之后我(RD)就需要进行提测。然后测试人员(QA)就会对此次改…
阅读全文简要介绍 过去出于学习目的写项目时,由于是“单兵作战”,所以完全不用考虑后期维护以及扩展成本,除了为了实践设计模式而刻意引入的架构外,大部分代码都是以快速实现为导向,怎么方便怎么写。 然鹅进入实际生产环境后我才发现,这业务迭代是真勾巴快,扩展性真的非常非常重要。 比如设想下面这个典型场景:我们刚刚完成了场景 A 和场景 B 的逻辑,结果没过多久 PM(产品经理)又提过来一个需求增加一个新场景 C。场景 A、B、C 是同级别的,如果使用普通的硬编码分支,为了兼容新场景,我们必须侵入式地修改主函数,增加一个 else if 语句或者 case 语句。这样随着场景不断增多,代码会变得很脆弱,每次新增一个场景都要修改这个巨大的 if-els…
阅读全文
03引言 想在 MacOS 后台跑一个 frp 服务,想到 MacOS 是类 Unix 系统所以应该跟 Linux 差不多,自然而然的想到使用 systemd 将 frp 服务作为守护进程管理。然鹅输入vim /etc/systemd/sys之后按了半天 tab 都不自动补全为vim /etc/systemd/system,一看/etc目录下压根就没有systemd这个目录。上网一搜才知道 MacOS 压根就没有 systemd,取而代之的是 launchd。既然都提到了,就简要介绍一下吧。 起源 传统的 Linux 系统使用 System V init 或 BSD init 作为系统的第一个进程,负责启动其他服务和进程。随着系统复杂性…
阅读全文
04引言 今天在看《Go语言高级编程》这本书,注意到作者在谈论 ORM 框架时提到了两句话 “喜欢强类型语言的人一般都不喜欢语言隐式地去做什么事情,例如各种语言在赋值操作时进行的隐式类型转换然后又在转换中丢失了精度的勾当,一定让你非常的头疼。所以一个程序库背地里做的事情还是越少越好,如果一定要做,那也一定要在显眼的地方做” “但这样的分析想证明的是,ORM 想从设计上隐去太多的细节。而方便的代价是其背后的运行完全失控。这样的项目在经过几任维护人员之后,将变得面目全非,难以维护” 我看到这两段话时第一时间想到的是面向对象程序设计语言中的封装以及高级编程语言对低级编程语言的抽象。封装实现的不就是隐藏功能的内部实现细节,只将使用方式暴露出来?…
阅读全文有关 Git 的常用基本操作,我在👉 Git 基本使用这篇文章里已经介绍过了,这里不多赘述。我们今天主要讲讲 Git Merge 与 Git Rebase 的基础概念与使用场景。 概念解释 虽说两者都可以用来将一个分支(为了表达清晰我们暂且称之为待合并分支)合并到另一个分支(我们称之为目标分支或当前分支),但设计理念却是完全不同的。我们首先介绍两者的基本概念以及使用方法,在随后的使用场景中我们再来比较两者的区别。 Git Merge 首先需要知道,Git Merge 有两种常见的合并方式。 快进合并(Fast-forward merge) 此合并方式发生的条件为目标分支自创建出待合并分支后没有任何提交。合并过程可以简单理解为目标分…
阅读全文
06背景 我的服务器系统是OpenCloudOS 9.2,内核为6.6.34-9.oc9.x86_64。 我想在服务器上使用Wireguard,按理说5.6之后的Linux内核应该是内建该模块的,但是该系统中并没有。 于是通过重新编译内核的方式来启用Wireguard的支持。 编译安装内核 内核源码位置 可以使用原本的内核源码:/usr/src/kernels 下载新内核源码:https://www.kernel.org/ 如6.12.7的源码包:https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.12.7.tar.gz 安装相应工具包 1 2 3 4 dnf groupinstal…
阅读全文
07折腾了几天OpenLDAP,终于是把它给部署上了。对于软件部署这件事,我的评价是不要完全相信网上任何一篇几年前的教程(包括这篇),可能一些操作是对的,但另一些操作已经过时了,这会导致一些莫名奇妙的错误。配置文件中配置项上一般会有注释,看懂了再改。 OpenLDAP服务端部署 Linux:RockyLinux9 安装相关软件 这步没啥说的,照着安装就行了 1 2 3 dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm dnf upgrade -y dnf install -y openldap openldap-se…
阅读全文
08一、问题描述 使用 podman 运行一个以 systemd 模式启动的容器,并且没有赋予 privileged 权限。sshd 正常启动,sshd_config 正常设置,但是使用 ssh 远程登录时出现: (非 root 用户也是如此) 二、查看原因 查看 /var/log/secure 文件,发现文件内容为空 使用 journalctl -u sshd 命令查看错误日志如下: 分析错误原因: 权限不足,无法将 uid 写入 /proc/self/loginuid 文件中 sshd 进程无法与 system 总线通信 三、解决 最佳方案:给予容器更多的权限 1 2 3 - AUDIT_WRITE - SYS_RAWIO - AU…
阅读全文
09默认现在本机已经安装好了代理软件客户端,暴露出的 http 端口为7890,socks5 端口为7891。 为什么要这样默认?因为此域名是接受过国内备案的,不易多说 🤫 Linux Shell使用网络代理 当前终端使用代理 设置代理:export http_proxy=http://127.0.0.1:7890 && export https_proxy=http://127.0.0.1:7890 取消代理:unset http_proxy && unset https_proxy 全局使用代理 如果是root用户,修改/etc/profile。如果是普通用户,修改~/.bashrc。在文件最后添加…
阅读全文白嫖的原理是通过构建他在 Github 上开源出来的源代码,绝对官方正版。 前言 听说 Aseprite 是一款非常不错的像素绘图软件,最近闲的没事,想试一下。 但是一看,官网售价 19.99 USD,Steam 售价 70 RMB,实在是囊中羞涩,心有余而力不足。一看 Github,原来这个玩意儿是开源的,由 C++ 语言编写。 既然他是开源的,那我们就可以通过源代码自己编译出此软件。 当然,安装过程也可以查看官方给出的文档,看官方文档最大的好处就是不用担心时效性而且绝对准确 Windows 编译安装 环境准备 安装 Visual Studio 2022 并且记住安装位置 下载链接:https://visualstudio.mic…
阅读全文
11数据库操作 查看所有数据库:show dbs; 切换数据库:use xxx; 没有xxx时会自动创建 新建集合(对应MySQL表):db.createCollection(‘xxx’); 常用文档操作命令(增删改查) 增 1 2 3 4 5 6 db.collection.insertOne( , { writeConcern: } ) 1 2 3 4 5 6 db.collection.insertMany( , { writeConcern: } ) 删 1 2 3 4 5 6 db.emp.deleteMany({}) //删除所有文档 db.emp.deleteMany({name: 'pillage'}) //删除所有na…
阅读全文
12说明:通常所说的”数组”,”Numpy数组”,”ndarray”基本上都是指同一个东西,即ndarray对象。 Numpy常用函数以及用法 (1)创建ndarray数组 使用array函数 说明:他可以接收一切序列型的对象,然后产生一个新的含有传入数据的Numpy数组。除非用dtype自定义类型,否则他会根据你传入的数据类型自动帮你匹配合适的类型。 此类型规则为:如果有字符串,则优先字符串,如果没有字符串而有复数类型,则系统默认帮你判定为复数类型。然后依次为浮点数和整数。即优先级为”字符串>复数>浮点数>整数”。 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import…
阅读全文
13前言 CLion 在输出中文时会发生乱码,找了网上的一些教程,都是说更改编码为 GBK。这样虽然能解决问题,但是很麻烦,因为每次都要更改 用下述方法,只需设置一次,不用像其他教程重复设置 方法 快捷键Ctrl+Shift+Alt+/,弹出如下界面: 然后,取消第一项的勾选,也就是run.processes.with.pty 这样就成功解决了,完美! 测试一下: 1 2 3 4 5 6 #include int main() { printf("你好世界!\n"); return 0; }
阅读全文
14前言 RLCraft 是一款好评如潮的 Minecraft 整合包。在原生 Minecraft 的基础上做了多样的扩展,可玩性非常高。关于此扩展包的具体介绍可在如下网站查看:https://www.curseforge.com/minecraft/modpacks/rlcraft 将它运行在服务器上,就可以和好朋友一起玩了。 需要注意的是 RLCraft 只是一个代表性的例子。此方法适用于大部分 Forge Server 的搭建,不过具体的细节还是要看官网的介绍。 前期准备 JDK8 一定要是 JDK8,新版的 JDK 17 无法运行我们需要的旧版本的 Forge1.12.2 服务器。下载地址:https://www.oracle.…
阅读全文
15前言 配置文件一般存放一些系统变量或用户变量,例如数据库数据源的配置。它可以实现在不改变程序源代码的情况下修改程序的变量的值。通过配置文件可以使程序开发变得更加灵活。接下来我将介绍几种常见的在 SpringBoot 中获取配置文件的方式。 我的示例配置文件(userinfo.yml)位置如下: 1 2 3 4 5 6 7 8 9 10 11 12 my-profile: name: grape age: 6 users: - name: 张三 age: 20 - name: 李四 age: 21 - name: 王五 age: 22 通过 @value 读取简单信息 通过在变量前加上注解 @value("${xxx}") 可以将配置…
阅读全文
16手把手教你配置 LNMP 环境,其中大部分学习过程中需要用到的模块也在安装过程中一并安装了,或许是初学者的福音😁😁 版本说明 请注意不同版本号的软件的安装方式和软件兼容性可能有差别!!! 软件名版本号官网下载链接 LinuxCentos8.0https://www.centos.org// Nginx1.23.1https://www.nginx.com/https://nginx.org/download/nginx-1.23.1.tar.gz MySQL8.0.30https://www.mysql.com/https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-…
阅读全文
17前言 前端时间学习过程中写了几个小 Demo,但都是在本机开发环境下运行的。本以为部署到服务器就是简单把文件上传就可以。结果踩了一些很可笑的坑🤣🤣 部署普通 JavaEE 项目 这个比较简单,用 Maven 把项目打成 War 包,然后上传至 Tomcat 目录的 webapps 目录下,并且启动 Tomcat 服务即可。Tomcat 会自动将 War 包进行解压缩。然后访问 ip:port/project_name-project_version 即可看到项目首页。 需要注意的是:项目中的所有涉及到路径跳转的 url 都尽量使用相对路径 部署 Spring Boot 项目 问题说明 我使用的 IDE 是 Intellij ID…
阅读全文
18问题引出 我在 http://localhost:8080 放了一台后端服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.pushihao.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/hello") public class HelloController { @RequestMapp…
阅读全文
19引入 JavaScript 是一种轻量级、跨平台和解释编译的编程语言,也称为网页脚本语言。它以开发网页而闻名,但是许多非浏览器环境也可以使用它。JavaScript 可用于客户端开发以及服务器端开发。它既是命令式又是声明式语言。作为前端三件套之中唯一有编程逻辑的语言,JavaScript 常常用于页面交互、实现一些复杂的动画以及数据传输等。 浏览器工作原理 浏览器分为两个部分:渲染引擎和 JS 引擎 渲染引擎:用来解析HTML和CSS,俗称内核,比如 chrome 的blink,老版本的 webkit JS 引擎:也成为 JS 解释器。用来读取网页中的 JavaScript 代码,对其进行后台处理,比如 chrome 浏览器的 v8…
阅读全文
20前言 老师们似乎都倾向于使用 Eclipse 作为 Java 开发的 IDE。其实作为工具效果都是一样的,但是使用方式却不太相同。所以只能浅浅折腾一下 Eclipse 的相关配置。 前期准备–相关软件下载 注意:以下 “最新官网下载链接” 提供的均为64位windows环境下的下载链接。Linux/Mac 请前往官网下载相对应软件 软件名官网地址最新版官网下载链接 Eclipsehttps://www.eclipse.org/https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2022-06/R/eclipse-j…
阅读全文
21Vue是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 引入 使用 CDN: 1 2 3 4 5 开发版本: 生产版本: 下载并自行引入: 1 2 https://cdn.jsdelivr.net/npm/vue@next/dist/ https://unpkg.com/browse/vue@3.2.31/dist/ 第一个Vue应用 1 2 3 4 5…
阅读全文
22什么是负载均衡 负载均衡(load balancing)是一种电子计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡服务通常是由专用软件和硬件来完成。主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。 简单来说,就是将所有请求先集中在一起,然后再根据特定的算法将这些请求分配出去,使各个服务器的效率都能最大化。 常见的负载均衡算法有: 随机法(Random) 加权随机法(Weight Ran…
阅读全文
23Nacos 是什么 Nacos(Naming and Configuration Service)是阿里巴巴的一个开源项目,也是 Spring Cloud Alibaba 的一个重要组件。专注于服务发现和配置管理领域。 Nacos 官方文档 注意:如果中途发现操作过程一样但还是报错,很有可能是版本号不一致(新版本不一定兼容老版本)。 部署 Nacos 服务器 Nacos 作为 Spring Cloud Alibaba 的一个组件,版本号自然也一定要选择正确,参考 官方版本说明 Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ VersionDubbo…
阅读全文
24微服务概述 微服务(Microservices)是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块(Small Building Blocks)为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic)的API集相互通信。 简单来说,就是将一整套服务流程拆分成更小的模块,每个模块各司其职。各个模块之间通过 HTTP API 进行通信。 Spring Cloud 概述 Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务注册与发现、熔断器、智能路由等)。Spring Cloud 可…
阅读全文
25什么是RSS? RSS(英文全称:RDF Site Summary 或 Really Simple Syndication),可以翻译为“简易信息聚合”或“聚合内容”,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。将文章标题、摘要、内容按照用户需求推送给用户便是RSS的目的。 RSS 的第一个版本为 RDF Site Summary,在1999年三月由美国网景公司的 Guha 为了用在My.Netscape.Com 门户网站而开发。在 Netscape 放弃该标准后,软件制造商 UserLand 开始着手开发。随着 2002 年 RSS 2.0.1 规范的发布,UserLand 冻结了该标准并将版权转让给哈…
阅读全文什么是 docker 作为一个开源的应用容器引擎,docker主要用于开发和运行应用。docker容器和虚拟机有些类似,但二者在原理上不同。容器是将操作系统层虚拟化,而虚拟机则是虚拟化硬件。因此容器相较于虚拟机来说更加便携、轻量以及高效。 所以我们可以简单的将docker容器理解为一个轻量版的虚拟机。在docker之上我们可以高效地运行各式各样的应用,应用之间相互独立而又可以互相协调。 docker组成 其中,容器和镜像的概念一定要分清。他俩的关系就像是Java中的类与对象。镜像是一个只读模板,用于指示创建容器,而容器是镜像的可运行实例。一个镜像也可以创建很多个容器,这些容器可以相互独立运行。 Docker注册中心(Docker r…
阅读全文
27前言 据官网介绍,对于 tensorflow1.15 及更早版本,CPU和GPU软件包是分开的。 1 2 pip install tensorflow==1.15 # CPU pip install tensorflow-gpu==1.15 # GPU 而之后的版本,我们可以直接在CPU版本的基础上开启GPU加速。 参考:GPU支持 | TensorFlow (tensorflow官方网站,国内访问可能较慢) 安装TensorFlow最新版 1 pip install tensorflow 如果嫌弃安装速度太慢,也可以使用国内豆瓣源 1 pip install tensorflow -i https://pypi.doubanio.…
阅读全文
28什么是内网穿透 百度百科:内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。 维基百科:在电脑科学中,NAT穿越(NAT traversal)涉及 TCP/IP 网络中的一个常见问题,即在处于使用了NAT装置的私有 TCP/IP 网络中的主机之间建立连接的问题。 我的理解:内网穿透其实就是把局域网内的资源或服务映射到公网,从而达到通过互联网访问内网的效果。 根据我的理解,可以做出如下图: 因为内网穿透服务器是暴露在互联网(公网)的,所以它必须拥有公网IP地址。用户服务器既可以是公司内部的服务器集群,也可以是PC个人电脑。 一些常见的内网穿…
阅读全文
29什么是 “Hello, World!” “Hello, World!” 程序是编程世界的第一个仪式。 当你在新语言中写下这行代码并看到它成功输出时,就完成了与这门语言最初的握手。它简单到近乎平淡,却又至关重要——既是初学者验证语法规则的入门练习,也是开发者确认环境配置无误的快速检查。 这个传统始于1972年贝尔实验室的《A Tutorial Introduction to the Language B》,如今已成为跨越所有编程语言的共同起点。它不只是一段代码,更像是程序员之间的默契:如果连 “Hello, World!” 都跑不通,那更复杂的挑战也不必继续了。 “Hello, World!” 的 N 种写法 Ada 1 2 3 4…
阅读全文前言 曾经稍微学习过一点git,对git稍微有一点认识,但也仅仅是知道他是干嘛的。本笔记主要用来记录一下git的常用命令和功能以及我的一些个人理解。 什么是git 对于什么是git,官方文档是这样介绍它的: Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals. 总结下来,git是一个可扩展的、分布式的版本控制系统。 安装git windowsLinux 通过…
阅读全文