常用笔记索引

TASK TO DO LIST

我在工作中存在的问题

Linux

Linux软件管理 常用命令

Linux编译安装

Linux进程管理 常用命令和工具

Linux网络调试 常用命令和分析工具

Linux日志管理 常用命令和工具

Linux网络文件传输 常用命令工具

常用防火墙指南

生产环境部署配置

jemalloc内存分配工具

Web服务器

Nginx系服务器

Apache服务器

负载均衡指南

LVS

Keepalived

Keepalived 原理介绍和配置实践

Nginx upstream

语言知识体系

PHP知识框架

Go开发生态 常用笔记

前端开发生态 常用笔记本

Shell学习笔记

Lua脚本学习笔记

正则表达式

数据库和中间件

关系型数据库(RDBMS)

关系型数据库设计知识

Mysql常用

分库分表指南

Redis常用

Memcached常用

全文索引指南

Elasticsearch常用

MongoDB常用(ES可替代)

消息队列中间件(Message Quene)指南

RabbitMQ常用

Kafka常用

RocketMQ常用

开发工具软件

Git常用命令

navicat-premium 延期试用和激活

Jmeter工具使用指南

VSCode使用总结笔记

开发规范和约定

语义化版本

数据迁移使用规范

网络编程

网络基础知识及概念

服务端网络编程知识框架

数据结构和算法

学习笔记

软件设计

软件架构知识索引

软件开发定律和心得

如何编写高质量代码

在框架中如何封装业务和功能代码

如何设计SDK和类库

API设计

Api设计经验总结

架构总结

其它

安全指南

IP查询工具

网络搜集的编程相关电子书

鸟哥Linux私房菜

电子书

进程间通信(process communication IPC)

管道(piepline)

内核管理的缓冲区,形象的理解管道两端连接着两个进程 ,一个读取一个写入。linux系统中将管道视为文件

匿名管道( pipeline )

有亲缘关系的进程才可以使用,父子进程,兄弟进程。以字节流形式传输,需要约定好数据格式,缓存区为空或写满时会阻塞。shell终端 | 管道符号就是匿名管道,示例如下:

ls | wc

命名管道FIFO(first in first out)

与匿名管道的区别,命名管道与系统中一个路径名关联,以文件的形式存在于文件系统中,进程可以通过FIFO路径名访问FIFO文件,实现进程间数据传输。遵循先进先出原则,缓存区为空或写满时会阻塞。

使用demo,待完善

php 命名管道函数 posix_mkfifo()

注意要和管道设计范式区分

How fast are Linux pipes anyway?

SystemV IPC

每个内核的IPC结构(消息队列,信号量,共享内存)都用一个非负整数的标识符加以引用。

php的扩展 Semaphore函数 命名和c语言及系统函数命名基本一致。

消息队列(sysvmsg)

消息队列的实质是一个存放消息的链表,由内核维护。每个消息视为一条记录,消息包括一个长整形的类型字段和需要传递数据。由消息队列标识符标识,有读写权限的进程可以从队列读取消息,写入消息到队列。通过key来找到对应消息队列。

如何使用?注意事项。使用demo,待完善

信号量(semaphore)

多进程之间可能因为进程合作和资源共享而产生制约关系。

直接相互制约关系

两个进程通过管道通信,管道为空时,读进程无法从管道读取数据,进入阻塞;管道满时,写进程无法向管道写入数据,进入阻塞。类似这种需要进程间合作导致的制约关系称为直接相互制约。进程间有同步关系

间接相互制约关系

假设当前系统中只有一台打印机,当A进程占用打印机时,进程B也申请使用打印机。进程B就会进入阻塞,等待打印机释放。其它进程同理。类似这种因资源共享导致的制约关系称为间接相互制约关系。进程间有互斥关系

临界资源

同步和互斥存在的根源是系统中存在临界资源(硬件资源:内存,打印机,硬盘;软件:共享代码段,变量等)。为了避免多进程的并发执行造成的不一致性,临界资源在同一时刻只允许有限个进程对其进行访问或修改。

信号量,是专门用户解决进程间同步与互斥问题的一种通信机制,它与信号无关,也不同于管道,FIFO以及消息队列 ,一般不用于传输数据,包含一个变量(表示资源数量,类型为非负整型),修改信号量的原子操作P和V,该信号量下等待资源进程的队列。

使用步骤

1.创建信号量/集,或者获取系统中已有的信号量/集。

2.初始化信号量/集。

3.信号量的P,V操作根据请求修改信号量数量,P操作使信号量-1,V操作使信号量+1.

4.从系统中删除不需要的信号量。

如何使用?注意事项。使用demo,待完善

共享内存(Shared memory)

允许多个进程访问给定的同一块存储区域。一般情况下,每个进程的虚拟地址空间会与不同的物理地址进行映射(参考上文页表指针)。当使用共享内存进行通信时,系统会将同一段物理内存映射给不同的进程,映射关系示意图如下。

映射关系

系统中的物理内存和虚拟内存都通过页面(页表)来管理,为多个进程分配共享内存实际是为进程分配一个或多个物理页面。因此共享内存的大小必须是系统中页面大小的整数倍。

进程使用共享内存时,先将虚拟内存空间与共享内存进行映射,映射完成后,进程对虚拟地址的读写,就相当于直接对物理内存读写。通信完成后需要释放物理内存解除进程与共享内存的映射关系。

共享内存,因为是进程直接读写物理内存,了不同进程间多次读写的时间。共享内存本身不限制读写次序,但是开发人员应该自觉遵循读写规则,在写进程操作尚未完成时,不应该有进程从共享内存中读取数据。通常,共享内存和信号量一起使用,由信号量帮它实现读写操作的同步。

Linux挂载磁盘错误

检查文件系统类型: 确保 /dev/sda1 上的文件系统类型是你操作系统支持的。使用以下命令查看文件系统类型:

sudo file -s /dev/sda1

这将输出文件系统类型,如果不是常见的文件系统类型(如 ext4、ntfs、fat32 等),你可能需要安装相应的文件系统工具。

检查并修复文件系统: 如果文件系统损坏,可以尝试使用 fsck 工具进行修复。注意,修复前请确保没有其他进程正在使用该分区。

sudo fsck /dev/sda1

运行该命令后,按照提示进行修复。

尝试手动挂载: 尝试使用以下命令手动挂载分区,并查看具体的错误信息:

sudo mount /dev/sda1 /mnt

如果挂载成功,你可以访问 /mnt 目录。如果失败,请记录并分析错误信息。

检查磁盘硬件问题: 使用 dmesg命令查看内核日志,查找与 /dev/sda1 相关的错误信息:如果日志中有硬件错误,可能是磁盘本身有问题,需要进一步的硬件检查。

dmesg | grep sda1 

检查挂载点的权限: 确保挂载点目录(如 /media/yangliuan/12321321)存在并且具有适当的权限:

sudo mkdir -p /media/yangliuan/12321321 
sudo chown your_username:your_username /media/yangliuan/12321321 

your_username 替换为你的用户名。如果经过以上步骤后问题仍未解决,可能需要进一步的详细诊断,或者咨询相关的技术支持人员。

手动挂载错误如下:

$MFTMirr does not match $MFT (record 3). Failed to mount '/dev/sda1': Input/output error NTFS is either inconsistent, or there is a hardware fault, or it's a SoftRAID/FakeRAID hardware. In the first case run chkdsk /f on Windows then reboot into Windows twice. The usage of the /f parameter is very important! If the device is a SoftRAID/FakeRAID then first activate it and mount a different device under the /dev/mapper/ directory, (e.g. /dev/mapper/nvidia_eahaabcc1). Please see the 'dmraid' documentation for more details. ChatGPT

这个错误提示表明 NTFS 文件系统存在一些问题,可能是由于文件系统不一致或硬件故障引起的。根据错误信息,你可以尝试以下步骤来解决问题:

在 Windows 下运行 chkdsk: 如果你有 Windows 系统,可以尝试在 Windows 下使用 chkdsk 工具来修复 NTFS 文件系统。打开命令提示符并以管理员身份运行以下命令:

chkdsk /f

这将在下次启动时对磁盘进行检查和修复。确保在 Windows 中运行 chkdsk 后重新启动系统,然后再次启动到 Linux。

检查硬件故障: 如果 chkdsk 无法解决问题,可能存在硬件故障。你可以尝试连接这个硬盘到另一台计算机上,看看是否能够正常访问。如果在其他计算机上也无法正常访问,那么很可能是硬件故障引起的。

使用 ntfsfix 工具: 在 Linux 下,你也可以尝试使用 ntfsfix 工具来尝试修复 NTFS 文件系统。运行以下命令:

sudo ntfsfix /dev/sda1 

这个命令会尝试修复一些常见的、轻微的 NTFS 文件系统问题。

如果以上方法都无法解决问题,可能需要考虑备份数据并格式化磁盘,然后重新创建文件系统。但在此之前,请确保你已经备份了重要的数据。

Inode基础知识

  • http://www.ruanyifeng.com/blog/2011/12/inode.html(基础知识)
  • https://learnku.com/articles/46728(基础知识
  • https://learnku.com/articles/10048/remember-a-fault-due-to-full-disk-inode(故障处理)
  • https://www.cnblogs.com/quail2333/p/10674583.html(lost+found目录)

Web通讯技术应用

Http协议 mdn baike wiki

传输超文本内容(超媒体文档html,css,js,图片,音视频)的协议 ,发展过程

Ftp协议 mdn baike wiki

文件传输协议,现代浏览器已经不支持了

Websocket协议 mdn baike wiki

在单个TCP连接上进行全双工通信,允许服务端主动向客户端推送数据

SSE(Server-sent Event) mdn wiki

服务器可以随时向我们的 Web 页面推送数据和信息。这些被推送进来的信息可以在这个页面上以 事件 + 数据 的形式来处理。

WebRTC mdn wiki baike googledevloper

项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输

RTMP mdn RTMP Stream: What It Is & How to Set It Up – Essential Guide

Adobe开发的 实时消息协议 (RTMP)

RTSP mdn

HLS mdn

HLS(HTTP Live Streaming) 是由苹果公司研发的协议,支持在 IOS、Safari 及安卓上最新版本的浏览器/Chrome 浏览器。HLS 也是自适应的。

`

Web服务器

服务器类型

nginx

openrestry

tengine

nginx_php

apache

caddy

Lighttpd

althttpd

IIS

Let’s Encrypt  certbot

VirtualBox磁盘扩容

磁盘类型 VDI(VirtualBox 磁盘映像)

磁盘管理工具 Hard Disk

启动光盘镜像系统(PE系统)

动态分配 dynamically allocated

1.使用如何磁盘管理工具,修改磁盘大小,如上图所示

2.启动ubuntu光盘系统,或者gparted-live-1.5.0-1-amd64.iso 也可以,使用GParted ,扩容磁盘

固定分配 fixsize

pre allocate full size(预先分配所有大小)

1.使用磁盘管理,创建一个更大空间的虚拟硬盘

2.启动光盘镜像系统,打开终端,使用dd命令刻录数据到新的硬盘

dd if=/dev/sda of=/dev/sdb

3.更换存储设置中的控制器SATA中的硬盘

动态分配差分存储 Dynamically allocated differencing storage

需要将上述两种方式结合起来

1.创建一个更大空间动态分配的硬盘

2.将原先的系统盘dd刻录到新的硬盘

3.使用动态分配中的扩容方法,使用GParted扩容剩余空间

参考文章

https://www.cnblogs.com/xueweihan/p/5923937.html

https://www.modb.pro/db/493372

ubuntu desktop 22.04 安装多版本Python

二进制安装

添加存储库

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update

安装python

sudo apt-get install python3.11

安装多个版本python

sudo apt-get install python3.11 python3.9 python3.8

将旧版本的 Python 和新版本添加到更新替代方案

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

键入以下命令以配置 python3, 输入需要选择python

sudo update-alternatives --config python3

有 2 个候选项可用于替换 python3 (提供 /usr/bin/python3)。

  选择       路径               优先级  状态
------------------------------------------------------------
  0            /usr/bin/python3.11   2         自动模式
  1            /usr/bin/python3.10   1         手动模式
* 2            /usr/bin/python3.11   2         手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:^^^^^^

查看版本 python3 -V

编译安装

默认安装到/usr/local/bin

sudo apt install gcc dialog libaugeas0 augeas-lenses libssl-dev libffi-dev ca-certificates
tar xzf Python-3.11.3.tgz
pushd Python-3.11.3 > /dev/null
./configure --enable-optimizations
 make -j 8 && make altinstall

配置默认python3

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 2
sudo update-alternatives --config python3

集成环境

conda 占用空间太大,每个环境都要重复安装基础组件,适合AI项目

pyenv

存在的问题

apt update 报错

Traceback (most recent call last):
  File "/usr/lib/cnf-update-db", line 3, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi'
$ cd /usr/lib/python3/dist-packages
$ ls -la | grep "apt_pkg.cpython"
$ sudo cp apt_pkg.cpython-310-x86_64-linux-gnu.so apt_pkg.so

编译安装的python使用此方法无法解决

gnome-terminal等基于的python软件无法使用

cd /usr/lib/python3/dist-packages/gi/

sudo cp _gi_cairo.cpython-310-x86_64-linux-gnu.so _gi_cairo.cpython-311-x86_64-linux-gnu.so

sudo cp _gi.cpython-310-x86_64-linux-gnu.so _gi.cpython-311-x86_64-linux-gnu.so

编译安装的python使用此方法无法解决

最好不要更改系统默认python

https://stackoverflow.com/questions/56218562/how-to-fix-modulenotfounderror-no-module-named-apt-pkg

https://askubuntu.com/questions/1301461/modulenotfounderror-no-module-named-apt-pkg-whilst-running-apt-update

https://blog.csdn.net/yulinxx/article/details/125472350

Refer To

https://ubuntuhandbook.org/index.php/2021/10/compile-install-python-3-10-ubuntu/

https://ubuntuhandbook.org/index.php/2022/10/python-3-11-released-how-install-ubuntu/

https://towardsdatascience.com/installing-multiple-alternative-versions-of-python-on-ubuntu-20-04-237be5177474

Mac OS开发者常用笔记

macOS Recovery mode

如何进入回复模式?

Intel 芯片架构 重启,在Mac启动或听到启动铃声后立即按住Command + R键

MI/M2芯片架构 关机,按住触控 ID(电源按钮)几秒钟,直到看到“加载启动选项”

Disable System Integrity Protection Temporarily

禁用系统完整性保护,用来解决开发时候操作系统文件提示operation not permitted问题

1.按上文操作进入macOS Recovery mode

2.进入系统后,下拉顶部栏工具,打开终端,输入csrutil disable (禁用),按照提示输入用户名和密码,重启系统。

3.为了安全,敏感操作之后,建议csrutil enable (启用) 保护模式。否则可能导致app store上的某些ios应用(非dmg)无法使用

ubuntu音乐播放器

QQ音乐

下载页面:https://y.qq.com/download/download.html

shell安装脚本 https://github.com/yangliuan/ubuntu-start/blob/main/include/linuxqq.sh

网易云音乐

下载页面 https://music.163.com/#/download (页面上没有了ubuntu的下载项)

下载地址 https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb

shell安装脚本https://github.com/yangliuan/ubuntu-start/blob/main/include/neteasy_cloud_music.sh

Lollypop

有漂亮的界面和直观的用户体验。支持音频标签编辑、歌词显示和艺术家图片显示等功能

安装(可以从商店安装)

sudo apt-get install lollypop

Rhythmbox

ubuntu默认音乐播放器

https://wiki.gnome.org/Apps/Rhythmbox

安装 (可以从商店安装)

sudo apt install rhythmbox

如何修改mp3文件的元数据,如专辑名称,歌手名称

使用命令行工具 “id3v2″(需要安装):

a. 打开终端。
b. 安装 id3v2 工具:sudo apt-get install id3v2
c. 进入包含要编辑的 MP3 文件的目录:cd /path/to/mp3/files
d. 使用以下命令来修改元数据:

修改专辑名称:id3v2 –album “新专辑名称” 文件名.mp3
修改歌手名称:id3v2 –artist “新歌手名称” 文件名.mp3
e. 替换 “新专辑名称” 和 “新歌手名称” 为你想要的实际名称,将 “文件名.mp3” 替换为要编辑的 MP3 文件的实际文件名。

使用图形界面工具 “EasyTAG”(需要安装):

a. 打开终端。
b. 安装 EasyTAG 工具:sudo apt-get install easytag
c. 运行 EasyTAG:easytag
d. 在 EasyTAG 窗口中,打开要编辑的 MP3 文件。
e. 找到并编辑专辑名称和歌手名称字段。
f. 保存修改后的文件。

Kid3: Kid3 是一个跨平台的开源音乐标签编辑器,支持多种音频文件格式(包括 MP3、FLAC、AAC、WMA 等)。官方网站(https://kid3.kde.org/)