202209

mysql

数据同步平台CloudCanal的透明化、可视化运维之道
https://zhuanlan.zhihu.com/p/409094498

数据中台
https://gitee.com/zrxjava/srt-data
https://toscode.gitee.com/LuckyFishSpace/datax-cloud
https://gitee.com/LarkMidTable/LarkMidTable
https://gitee.com/475660/databand
https://gitee.com/WeBank/DataSphereStudio

dataease + cloudcanal + clickhouse

分布式存储:HDFS、HBase
行式关系存储:MySQL、Oracle
列式存储:ClickHouse
列族存储:HBase、Cassandra
文档库:ElasticSearch、MongoDB

查看默认密码

sudo cat /etc/mysql/debian.cnf

修改 datadir

systemctl stop mysql
mv /var/lib/mysql /data_ext/mysql_data_dir
# 父目录要有cd的权限
chmod o+x /data_ext

vi /etc/mysql/mysql.conf.d/mysqld.cnf
    datadir = /data_ext/mysql_data_dir


vi  /etc/apparmor.d/usr.sbin.mysqld
    # Allow data dir access
      /data_ext/mysql_data_dir/ r,
      /data_ext/mysql_data_dir/** rwk,
systemctl restart apparmor
systemctl start mysql

# 查看日志
journalctl -ru mysql

show variables like '%datadir%';

linux

TODO:
一篇文章带你读懂 io_uring 的接口与实现
https://zhuanlan.zhihu.com/p/380726590

存储大师班 | Linux IO 模式之 io_uring
https://zhuanlan.zhihu.com/p/389978597

https://man.archlinux.org/man/io_uring.7
https://blogs.oracle.com/linux/post/an-introduction-to-the-io-uring-asynchronous-io-framework

挂硬盘

lsblk
fdisk -l
parted /dev/xvdg
    mklabel gpt
    print
    mkpart primary 0% 100% 
    q
fdisk -l

mkfs.ext4 -T largefile /dev/xvdg1
mkdir /data_ext2
mount -t ext4 /dev/xvdg1 /data_ext2
echo '/dev/xvdg1 /data_ext2  ext4    defaults    0   0'  >>/etc/fstab

mkfs.xfs -f -n ftype=1 /dev/nvme1n1
mkdir /data_ext
mount -t xfs /dev/nvme1n1 /data_ext
echo '/dev/nvme1n1 /data_ext xfs  defaults    0   0'  >>/etc/fstab

扩展磁盘

在 aws 的 ebs console 修改卷的大小
lsblk
    nvme0n1     259:0    0   40G  0 disk
    └─nvme0n1p1 259:1    0   20G  0 part /
sudo growpart /dev/nvme0n1 1
df -hT
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/root      ext4       20G   20G  277M  99% /
# ext4
sudo resize2fs /dev/nvme0n1p1
# xfs 
sudo xfs_growfs -d /data_ext
df -hT /
    Filesystem     Type  Size  Used Avail Use% Mounted on
    /dev/root      ext4   39G   20G   20G  50% /

putty 免密无法登录 ubuntu 20.04

pubkeyauthentication yes
pubkeyacceptedkeytypes ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa

shell for

  • for 循环在实际生成中应用非常多,避免人工重复的去操作某个事情

  • for 循环中的列表支持正则表达式

  • for 循环中使用(()),双括号内支持 C 语言的命令

  • for 循环中的变量,只是循环去取值列表中取值,然后进行 do 操作,所以取值列表中的参数个数,决定了循环的次数

    for i in {1…5};do echo $i;done
    for((i=1;i<=5;i++));do echo $i;done
    for i in seq 5;do echo $i;done

    for IP in cat /root/for/ip.txt #ip文件为存放ip地址的
    do
    ping -c 3 -i 0.2 -w 3 $IP &>/dev/null # -c 3 ping 3 次主机 -i 0.2 ping主机间隔 -w 3 ping主机超时间隔
    if [ $? -eq 0 ];then
    echo “host $IP is up”
    else echo “host $IP is down”
    fi
    done

    for user in cat /root/for/a.txt #a.txt为存放用户名单文件
    do
    if grep $user /etc/passwd &>/dev/null; then #检查用户是否存在
    echo “$user用户已经存在”
    elif [ -d /home/$user ];then #检查home下是否存在和用户相同的目录
    echo “$user用户存在宿主目录”
    else useradd $user #添加用户并设置初始密码
    echo “123456” |passwd --stdin $user &>/dev/null
    echo “$user用户已经创建,初始密码为:123456”
    fi
    done

qemu-system-arm仿真vexpress-a9踩坑记
https://www.jianshu.com/p/91baa4d140a2

Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。

qemu 挂 U 盘

qemu-img create -f raw disk.img 512M
mkfs -t ext4 ./disk.img
mkdir tmpfs
mount -o loop ./disk.img tmpfs/

vi tmpfs/hello.c
    #include <stdio.h>
    int main()
    {
        printf("HelloWorld! \n");
        return 0;
    }

arm-linux-gnueabi-gcc tmpfs/hello.c -o tmpfs/hello
arm-linux-gnueabi-gcc -static tmpfs/hello.c -o tmpfs/hello

ls tmpfs/
    hello  hello.c  lost+found
file tmpfs/hello
    tmpfs/hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=ee8ecff9cbfca92688bbbe7dd4e721ce9e6d23ce, not stripped
umount tmpfs

file disk.img
    disk.img: Linux rev 1.0 ext4 filesystem data, UUID=31c631fb-08fc-4874-8306-e2eae5441050 (extents) (64bit) (large files) (huge files)

qemu-system-arm -M vexpress-a9 -m 256M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -sd ./disk.img

ls /dev/mmcblk0* -l
    brw-rw----    1 0        0         179,   0 Sep 26 10:23 /dev/mmcblk0
mount -t ext4 /dev/mmcblk0 /mnt/
ls /mnt/
    hello       hello.c     lost+found

Linux ARM 环境
https://zhuanlan.zhihu.com/p/146580665

wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.4.5.tar.gz
wget https://busybox.net/downloads/busybox-1.28.4.tar.bz2
tar -xzvf linux-5.4.5.tar.gz
tar -jxvf busybox-1.28.4.tar.bz2
cd busybox-1.28.4
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make menuconfig

    Settings ---->

Build Options        [*]Build static binary(no shared libs)
make install
cd …
cp -r ./busybox-1.28.4/_install ./linux-5.4.5/

cd ./linux-5.4.5/_install/
mkdir etc
mkdir dev
mkdir mnt
mkdir -p etc/init.d

cd ..
vi _install/etc/init.d/rcS
    mkdir -p /proc
    mkdir -p /tmp
    mkdir -p /sys
    mkdir -p /mnt
    /bin/mount -a
    mkdir -p /dev/pts
    mount -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev –s

chmod +x _install/etc/init.d/rcS

vi _install/etc/fstab
    proc /proc proc defaults 0 0
    tmpfs /tmp tmpfs defaults 0 0
    sysfs /sys sysfs defaults 0 0
    tempfs /dev tmpfs defaults 0 0
    debugfs /sys/kernel/debug debugfs defaults 0 0

vi _install/etc/inittab
    ::sysinit:/etc/init.d/rcS
    ::respawn:-/bin/sh
    ::askfirst:-/bin/sh
    ::ctrlaltdel:/bin/umount -a -r

cd _install/dev
mknod console c 5 1
mknod null c 1 3
cd ..

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make menuconfig

General setup ---->
    [*]Initial RAM filesystem and RAM disk (initramfs/initrd) support
    (_install)Initramfs source file(s)
Boot option ---->
    ()Default kernel command string
Kernel features ---->
    Memory split(3G/1G user/kernel split) 
    [*] High Memory Support

vi ./usr/gen_initramfs_list.sh+131
    local dev="`LC_ALL=C ls -l "${location}"`"

make bzImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbs

apt-get install gcc qemu qemu-system-arm gcc-arm-linux-gnueabi libncurses5-dev build-essential flex bison bc
qemu-system-arm -M vexpress-a9 -m 256M -kernel arch/arm/boot/zImage \
    -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" \
    -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic

killall qemu-system-arm

windows gcc
https://github.com/lordmilko/i686-elf-tools/releases/tag/7.1.0

浅析linux内存管理
https://blog.csdn.net/faxiang1230/article/details/105720640

linux-0.11
https://github.com/karottc/linux-0.11

Remove Last character in String
https://www.folkstalk.com/2012/05/remove-last-character-in-string-unix.html

sed s/.$// filename

#! /bin/bash
while read LINE
do
echo ${LINE%?}
done < filename

awk '{$0=substr($0,1,length($0)-1); print $0}' filename

awk 捕获正则分组
https://www.markhneedham.com/blog/2013/06/26/unixawk-extracting-substring-using-a-regular-expression-with-capture-groups/

抓包分析 TCP 连接时间

tcpdump -nn -v -i ens5 "(host 1.1.1.1 or 2.2.2.2) and tcp[tcpflags] & (tcp-syn) != 0"

awk '{match($1,/.*([0-9]\.[0-9]+)$/,arr); if($7=="[S],") {sync[$3]=arr[1];} {if($7=="[S.],") {ep=substr($5,1,length($5)-1); if(sync[ep]){print "local = "ep", connect time = "arr[1]-sync[ep];} }}} ' es_dump.txt| sort -rn -k7

tcpdump 看这一篇就够了
https://www.jianshu.com/p/e3292f4dcc99

https://askubuntu.com/questions/343727/filenames-with-spaces-breaking-for-loop-find-command
https://unix.stackexchange.com/questions/81349/how-do-i-use-find-when-the-filename-contains-spaces

查看当前目录下所有压缩文件的压缩内容

find . -type f -name '*.*' -print0 |
while IFS= read -r -d '' file; do
    if [ "${file##*.}"x = "zip"x ];then
        echo '###', $file
        unzip -O gbk -l "$file"
    fi
    if [ "${file##*.}"x = "rar"x ];then
        echo '###' $file
        rar v "$file"
    fi
done

linux 0.11 源码
linus曾经说过:RTFSC - Read The Fucking Source Code.
https://github.com/karottc/linux-0.11

关于这个Tiny_OS 这个是我随着《操作系统真象还原》从零开始自写的项目 当然现在里面的代码都是最后版本的代码了
https://gitee.com/residual_nozzle_on_dust/Tiny_OS

不解压查看压缩包文件列表

unzip -l a.zip
tar tvf a.tar.gz
rar v a.rar

6.S081 — 操作系统这门课程
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec01-introduction-and-examples/1.1-ke-cheng-jian-jie

  • 理解操作系统的设计和实现。设计是指整体的结构,实现是指具体的代码长什么样。
  • 为了深入了解具体的工作原理,你们可以通过一个小的叫做 XV6 的操作系统,获得实际动手经验。
  • 通过研究现有的操作系统,并结合课程配套的实验,你可以获得扩展操作系统,修改并提升操作系统的相关经验,并且能够通过操作系统接口,编写系统软件。

ss 命令
ss -o state established

Linux环境编程:从应用到内核
https://book.douban.com/subject/26820213/

本书是Linux技术专家高峰和李彬的合力之作,是两个人多年开发经验的总结和分享,也是市场上唯一一本将Linux应用态与内核态相结合的技术图书,选择这种写作方式是为了向APUE的作者致敬。本书涵盖了APUE中大部分章节的内容,并针对Linux环境,以作者多年经验,详细解析了Linux常用接口的使用方法和陷阱。为了让读者更清楚地理解接口的工作原理,对于绝大部分接口,作者都会深入C库或内核源码进行全面分析。

Linux中的RCU机制[一] - 原理与使用方法
https://zhuanlan.zhihu.com/p/89439043
rcu 机制简介
https://zhuanlan.zhihu.com/p/113999842

iotop 非交互式

iotop -o -b -k -P -n3

crontab 设置重启后执行

sudo tail /var/spool/cron/crontabs/ubuntu
@reboot /home/ubuntu/reboot.sh >> /home/ubuntu/reboot.log 2>&1

rc.local里指定用户来运行程序

/bin/su - urs -c "/home/script/mount-oss.sh"

Linux Kernel Hash Table Behavior:
Analysis and Improvements
http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

The Linux kernel employs hash table data structures to store high-usage data objects such as
pages, buffers, inodes, and others. In this report we find significant performance boosts with
careful analysis and tuning of four critical kernel data structures.

几种开源的TCP/IP协议栈分析
https://www.cnblogs.com/littleKing163/p/5003778.html

  • BSD TCP/IP协议栈,BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的。
  • uC/IP是由Guy Lancaster编写的一套基于uC/OS且开放源码的TCP/IP协议栈,亦可移植到其它操作系统,是一套完全免费的、可供研究的TCP/IP协议栈,uC/IP大部分源码是从公开源码BSD发布站点和KA9Q(一个基于DOS单任务环境运行的TCP/IP协议栈)移植过来。
  • LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议,相对于uip。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。
    • LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使 LwIP协议栈适合在低端嵌入式系统中使用。
    • LwIP的特性如下:
      • 支持多网络接口下的IP转发
      • 支持ICMP协议
      • 包括实验性扩展的的UDP(用户数据报协议),
      • 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议),
      • 提供专门的内部回调接口(Raw API)用于提高应用程序性能
      • 并提供了可选择的Berkeley接口API。
  • uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈。完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行。
  • TinyTcp 栈是TCP/IP的一个非常小和简单的实现,它包括一个FTP客户。TinyTcp是为了烧入ROM设计的并且现在开始对大端结构似乎是有用的(初始目标是68000芯片)。

Cache和DMA一致性
https://zhuanlan.zhihu.com/p/109919756
并发基础理论:缓存可见性、MESI协议、内存屏障、JMM
https://zhuanlan.zhihu.com/p/84500221
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
https://blog.csdn.net/AliCoder/article/details/103039202
漫谈linux文件IO
http://blog.chinaunix.net/uid-27105712-id-3270102.html

查看日志

journalctl --since yesterday
journalctl --since "30 min ago"

OOM排查与优化
https://blog.csdn.net/weixin_57400332/article/details/123812918

  • Linux内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽内核会把该进程杀掉。
  • root 权限的进程通常被认为很重要,不应该被轻易杀掉,所以打分的时候可以得到 3% 的优惠(分数越低越不容易被杀掉)。

elasticsearch

Elasitcsearch CPU 使用率突然飙升,怎么办?
https://blog.csdn.net/laoyang360/article/details/122816850

核查 CPU 使用率

GET _cat/nodes?v=true&s=cpu:desc

核查热点线程

GET _nodes/my-node,my-other-node/hot_threads

检查长时间运行的搜索会阻塞搜索线程池中的线程。

GET _tasks?actions=*search&detailed

取消任务以释放资源

POST _tasks/oTUltX4IQMOUUVeiohTt8A:464/_cancel

elasticsearch 中的fielddata 和 doc_values
http://t.zoukankan.com/thewindyz-p-14360503.html

  • Doc Values 本质上是一个序列化的 列式存储, 列式存储 适用于聚合、排序、脚本等操作
  • Doc Values 通过序列化把数据结构持久化到磁盘,我们可以充分利用操作系统的内存,而不是 JVM 的 Heap
    • 当 working set 远小于系统的可用内存,系统会自动将 Doc Values 驻留在内存中,使得其读写十分快速
    • 当 working set 远大于可用内存时,系统会根据需要从磁盘读取 Doc Values,然后选择性放到分页缓存中
    • 很显然,这样性能会比在内存中差很多,但是它的大小就不再局限于服务器的内存了。
    • 如果是使用 JVM 的 Heap 来实现那么只能是因为 OutOfMemory 导致程序崩溃了。
  • 与 doc values 不同, fielddata 构建和管理 100% 在内存中,常驻于 JVM 内存堆;
    • fielddata 结构不会在索引时创建。相反,它是在查询运行时,动态填充;
    • 这意味着它本质上是不可扩展的,有很多边缘情况下要提防

同义词
Synonyms in Elasticsearch
https://medium.com/version-1/synonyms-in-elasticsearch-c527280ba8a5

The same, but different: Boosting the power of Elasticsearch with synonyms
https://www.elastic.co/blog/boosting-the-power-of-elasticsearch-with-synonyms

acronyms on Elastic Search request
https://stackoverflow.com/questions/67707925/acronyms-on-elastic-search-request

Function score query
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

java

java.security 框架之签名、加密、摘要及证书
https://blog.csdn.net/piaoranyuji/article/details/126122378

https://blog.csdn.net/am_Sun/article/details/106374866
Maven编译项目显示 程序包com.sun.*包不存在 【原因及三种解决方案】

IDEA 正常编译的项目,在生产环境 mvn package 报错

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project wxpaydemo: Compilation failure
[ERROR] /src/main/java/com/example/wxpaydemo/controller/TestController.java:[8,61] package com.sun.org.glassfish.external.statistics.annotations does not exist

解决:在 maven-compiler-plugin下 增加 forkcompilerArgs

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <fork>true</fork>
        <compilerArgs>
            <arg>-XDignore.symbol.file</arg>
        </compilerArgs>
    </configuration>
</plugin>

线上启动

mvn clean package -Dmaven.test.skip=true
mkdir config
cp src/main/resources/application.yml ./config/
vi ./config/application.yml # 修改端口
    server:
      port: 8081        
java -jar target/wxpaydemo-0.0.1-SNAPSHOT.jar

# 修改代码或 resource 后要重新 mvn package 再启动 jar
mvn package && java -jar target/wxpaydemo-0.0.1-SNAPSHOT.jar

MVCS - Model View Controller Service
https://stackoverflow.com/questions/5702391/mvcs-model-view-controller-service

一般而言,影响视频画质的因素主要有以下几点:

硬件

一块带给无数人年少欢乐的CPU,别说你没用过它
https://zhuanlan.zhihu.com/p/415064726

《自己动手写CPU》读后感
https://zhuanlan.zhihu.com/p/278434972

MIPS架构CPU设计
https://gaozhiyuan.net/series/mips-cpu-design

【手写CPU】7.9 除法指令说明及实现
https://gaozhiyuan.net/computer/cpu/division-instruction-description-and-implementation.html

半导体所用的高纯硅是如何提纯到 99.999999999% 的?
https://www.zhihu.com/question/341011975

基础逻辑门
https://vlab.ustc.edu.cn/guide/doc_basic_logic.html
Verilog语法
https://vlab.ustc.edu.cn/guide/doc_verilog.html

KiCad EDA
A Cross Platform and Open Source Electronics Design Automation Suite
https://www.kicad.org/

流片一次有多贵?
http://news.sohu.com/a/564182392_121341339

先引用CMP(Circuits Multi-Projets,美国一家非营利性多项目晶圆服务组织)的公开报价吧。
按照这份报价,以业内裸芯(die)面积最小的处理器高通骁龙855为例(尺寸为8.48毫米×8.64毫米,面积为73.27平方毫米),用28纳米制程流片一次的标准价格为499,072.5欧元,也就是近400万元人民币!

https://vlab.ustc.edu.cn/guide/index.html
Logisim是一种用于设计和模拟数字逻辑电路的教育工具。

芯片设计之仿真工具
https://www.elecfans.com/d/1876977.html

  • 在通过Verilog语言完成芯片设计,且通过测试平台设计(编写testbench)对所设计的芯片施加激励和观测输出后,需要在计算机上模拟芯片设计,以判断所编写的代码是否符合预期。
  • 在计算机上模拟芯片设计需运用仿真工具,常用的EDA仿真工具主要由三家集成电路公司提供,分别是Mentor Graphics、Cadence、SYNOPSYS。

仿真的步骤如下:

  • 设置环境。包括在软件里设置相应的工程环境,设置相应的库文件,库文件是其他人员已完成的设计文件,当设计芯片需要某些已设计完成的文件时,可以调用库文件。
  • 编写Verilog代码。编写Verilog代码既可以使用文本编辑工具,也可以使用Modelsim中提供的代码编辑工具。
  • 编译。编译的目标是将Verilog代码转化成计算机上可以执行的程序。
  • 仿真。在仿真工具中模拟电路执行过程。
  • 分析仿真结果。 分析仿真结果是比较重要的步骤。分析仿真结果的目的是检查电路模拟的结果是否正确,是否符合预期的设计目标。

分析仿真结果的方法有多种:

  • 最直接的方法是用波形的方式检查,
  • 更高层次的方法包括数据流图(以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程)
  • 有限机(全称有限状态机,是一种用于进行对象行为建模的工具,作用是描述对象在其生命周期内所经历的状态序列,以及如何响应来自外界的各种事件)
  • 或用比较高效的方法定位故障发生的位置。

流程

  1. 用 Verilog 语言设计电路
  2. 编写 Testbench 施加激励,观测输出
  3. 使用 Modelsim 做仿真
  4. 用 KiCad 画 pcb
  5. 去立创平台做流片

https://brng.dev/blog/technical/tutorial/2019/05/11/icarus_gtkwave/

  • Icarus Verilog is a free Verilog simulator with some SystemVerilog support.
  • I personally enjoy using it because it’s really easy and quick to get it up and running.
  • Icarus Verilog compiles the Verilog source into a file that is executed by its simulator vvp.
  • GTKWave is a free waveform viewer, which is useful for debugging designs.

Xilinx Vivado卡在Initializing Language Server的解决方法
https://blog.csdn.net/yihuajack/article/details/120830612

打开 Tools -> Settings -> Tool Settings -> Text Editor -> Syntax Checking,将 Syntax checking 从 Sigasi 改为 Vivado:

【计算机组成原理】MIPS单周期CPU设计 | Verilog
https://www.bilibili.com/video/BV1rD4y1D7h9
https://github.com/qing-2/CPU

http://buthowdoitknow.com/
But How Do It Know? is the book you have been looking for if you want to know how computers work.

  • What is a bit?
  • What is a byte?
  • What is RAM?
  • What is a CPU?
  • What is a clock?
  • What is a computer?
  • What is a program?
  • How do the parts work together?
  • And much much more…

https://mcpedl.com/scott-cpu-map/

  • This is a fully functional 8Bit Computer in Minecraft Bedrock.
  • The design of the computer is based on the famous Scott CPU in the book But How Do It Know?
  • The Basic Principles of Computers for Everyone by J. Clark Scott. Give it a try!

QEMU虚拟机相关概念介绍
原文链接:https://blog.csdn.net/qq_34719392/article/details/125543643

  • Hypervisor介于虚拟机和宿主机操作系统之间,负责对宿主机资源(为方便表述,本文均以硬件资源为例,但实际上被虚拟化的不只有硬件资源)进行虚拟化,并将虚拟化后的硬件资源提供给虚拟机。Hypervisor分为两类:
    • Type-1 Hypervisor:位于操作系统内核空间,具备对宿主机硬件资源的直接访问权限。代表:Microsoft Hyper-V、Linux KVM、VMWare ESXi。
    • Type-2 Hypervisor:位于用户空间,需要通过操作系统内核才能访问硬件。代表:QEMU、Oracle VirtualBox。
  • QEMU 有两种工作模式:
    • QEMU 本身作为 Hypervisor。QEMU 与Linux 内核交互,从而获取虚拟化后的硬件。这就是前文所述的 Type-2 Hypervisor。
      • 交互层次:VM - QEMU - Linux Kernel - Driver - Hardware
    • QEMU 作为虚拟机与 Linux KVM 交互的中间层,仅负责传递交互信息,而不发挥 Hypervisor 的实际功能。真正发挥 Hypervisor 功能的是 Linux KVM。
      • 交互层次:VM - QEMU - Linux KVM - KVM Virtual Driver - Hardware
    • 第二种工作模式能够直接利用 KVM,因而效率更高。
    • 而第一种工作模式多用于不需要和硬件直接交互的场合,例如在虚拟机中启动虚拟机。
  • libvirtd、libvirt、virt-manager 的概念及与 QEMU 的关系
    • libvirtd 是 Linux 中的一个守护进程,其使用的是 libvirt 库。
    • libvirt 与 QEMU 的关系,类似于 Kubernetes 与 Docker 的关系:
      • QEMU 负责实际管理一台宿主机上的所有虚拟机;
      • 而 libvirtd 适用于一台宿主机上启用多台虚拟机的场景,它提供了一系列在虚拟机之间进行资源调度的接口,这些接口底层仍然是以 QEMU 命令来实现的。
    • virt-manager 是 libvirt 的图形化界面。
      • 在 virt-manager 上的所有操作,都会被映射为 libvirt 命令;
      • libvirt 命令又会被映射为 QEMU 命令;
      • 如果 QEMU 处于第二种工作模式,那么 QEMU 命令又会再次被映射为 KVM 命令。
    • virt-manager、libvirt、QEMU 与 KVM 都属于 Hypervisor 层次。
      • 前三者都处于用户空间,只有KVM处于内核空间。

Vivado安装和使用
https://vlab.ustc.edu.cn/guide/doc_vivado.html

一个典型的设计流程包括创建 model,创建用户约束文件,创建 Vivado 项目,导入已创建的model,编译约束文件,选择性调试运行时的行为仿真,综合你的design,实现design,生成 bitstream 文件,最后将 bitstream 文件下载到硬件中,并确认硬件能否正确的实现功能。

如何快速掌握一款MCU,可以从这几方面入手
https://mp.weixin.qq.com/s/YBP-bU3OfGqmSdniI-_3Tg

中断嵌套

中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。

mcu就是单片机的意思,而plc是可编程逻辑控制器,两者都是可编程的控制器件。
https://www.sohu.com/a/569640464_120676425

  • PLC 就能够满足设备工业级要求,在抗干扰方面、输入和输出点可靠性方面更为优越,并采用可靠的组态方式,因此可靠性更高,而且通信方面有很多工业控制设备采用光纤以抗干扰。
  • PLC 等设备可采用整体式或者积木式,各个组件可以按需选用,并便于组态实现。各个工作站之间采用规范的总线通讯,这都是模块内置的,只需配置无须编写代码,简单可靠。
  • 在工业环境下,传感器的输出多采用4~20mA、0~10V的形式,这与MCU常用的0~3.3V或者0~5V的AD模块不相符合,因此需要针对工业环境设计传感信号接收模块。
  • PLC 是基于 mcu 的产品,在 mcu 的基础上增加了模块化的开发。不用编写底层的代码,无须了解单片机的底层资源。
  • 单片机开发需要从底层代码开始,需要用汇编或者C语言编写,其I/O接口、协议、读写时序、算法与数据结构都必须自己编写开发。

如何正确的评测视频画质
https://wangwei1237.github.io/2022/05/09/How-to-Assess-the-Video-Quality-Correctly/

  • 分辨率:图像中的像素数量,在特定尺寸下,分辨率越高,像素越多,显示的细节则更精细。[3]
  • 帧率:一秒内显示的图像数量,电影的帧率一般是 24fps,标准电视的帧率通常是 30fps。[3:1]
  • 亮度:可以显示的图像照明强度的范围,人眼能感知到的亮度范围在 10W 尼特左右。
  • 位深:每个像素可以显示的颜色数量,位深度越大,可显示的颜色越多,从而渐变更平滑、更自然。[4]
  • 色域:色域是某个特定的色彩的子集,用以表示可以显示的所有颜色的范围。色域一般使用 CIE 1931 色度图上的面积来表示,CIE 1931 曲线的边缘代表可见光光谱颜色的范围。[4:1]
  • 码率:编码每秒视频需要的 bit 数量称之为码率(bitrate)。在一定条件下,码率会影响视频的质量,码率越低,压缩率越大,画质相对越差。当然,并非码率越高画质越好,在很多情况下,更高的码率带来的往往却只是带宽的浪费。[5]

关于时钟与触发器的感想
https://blog.csdn.net/weixin_30349597/article/details/96950680

  • 时钟是时序电路的控制者” 这句话太经典了,可以说是FPGA设计的圣言。
  • FPGA的设计主要是以时序电路为主,因为组合逻辑电路再怎么复杂也变不出太多花样,理解起来也不没太多困难。 但是时序电路就不同了,它的所有动作都是在时钟一拍一拍的节奏下转变触发,可以说时钟就是整个电路的控制者,控制不好,电路功能就会混乱。
  • 时序逻辑电路的时钟是控制时序逻辑电路状态转换的“发动机”,没有它时序逻辑电路就不能正常工作,因为时序逻辑电路主要是利用触发器存储电路的状态,而触发器状态变换需要时钟的上升或下降沿!由此可见时钟在时序电路中的核心作用!

FPGA能代替CPU架构吗?
https://www.cnblogs.com/alifpga/p/9503593.html

FPGA基础知识介绍
https://vlab.ustc.edu.cn/guide/doc_fpga.html

  • FPGA(Field-Programmable Gate Array),即现场可编程门阵列。
  • 它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
  • 现如今的集成电路绝大部分采用 CMOS 工艺,基本结构是一个 N 沟道 MOS 管和一个 P 沟道 MOS 管。
  • NMOS 和 PMOS 可以认为是两种开关电路,两种电路均包含 G(栅极)、D(漏极)、S(源极)三个极。
  • 一个 NMOS 和一个 PMOS 可构成一个 CMOS 反相器, 同理,可构成 CMOS 的与非门、或非门。
  • 多个与非门可组成一个带有复位、置位功能的D触发器,而D触发器则是时序逻辑电路的最核心部件。
  • 由此可知,通过非门、与非门、或非门的有序堆叠,可实现任意功能的数字电路。
  • 如果有一款电路,其基本单元可配置成各种基本门,则其就具备了硬件编程能力。
  • FPGA就是这种芯片,它基于查找表(LUT:Look Up Table)技术的可编程逻辑器件。
  • 通过配置,LUT 可实现与门、或门、与非门、或非门或者其他简单组合逻辑功能,其本质上就是 1bit 位宽的 RAM。
  • CPU 中拥有控制取指、译码等流程,具备处理各式各样千奇百怪的指令要求的能力。
  • 相比之下 FPGA 只能根据一个固定的模式来处理输入的数据然后输出,这也是为什么 FPGA 经常被看作一种行家专属的架构。
  • 不同于 CPU 的是,FPGA 和 GPU 内都有大量的计算单元,因此它们的计算能力都很强。在进行神经网络运算的时候,两者的速度会比 CPU 快很多。
  • 但是 GPU 由于架构固定硬件原生支持的指令固定了,而 FPGA 则是可编程的。

mysql

UTC 时间

SET time_zone ='+8:00';

mysql> select now(),CONVERT_TZ(NOW(), '+08:00', 'UTC') utc, UTC_TIMESTAMP(),UTC_DATE(),UTC_TIME();
+---------------------+---------------------+---------------------+------------+------------+
| now()               | utc                 | UTC_TIMESTAMP()     | UTC_DATE() | UTC_TIME() |
+---------------------+---------------------+---------------------+------------+------------+
| 2022-09-07 17:43:23 | 2022-09-07 09:43:23 | 2022-09-07 09:43:23 | 2022-09-07 | 09:43:23   |
+---------------------+---------------------+---------------------+------------+------------+
1 row in set (0.00 sec)

code

Feature Toggles (aka Feature Flags)
https://martinfowler.com/articles/feature-toggles.html

docker

修改一个容器开机自动启动

docker update --restart=always c0d6948dae7a

PHP

config php slowlog

touch /var/log/php8.1-slow.log
chmod o+w /var/log/php8.1-slow.log
vi /etc/php/8.1/fpm/pool.d/www.conf
slowlog = /var/log/php8.1-slow.log
request_slowlog_timeout = 5s
php-fpm8.1 -tt
systemctl status php8.1-fpm
systemctl restart php8.1-fpm

nginx 超时

client_header_timeout 1000000;
client_body_timeout 1000000;
send_timeout 1000000;
fastcgi_read_timeout 1000000;

php-fpm 超时

request_terminate_timeout = 5s

遇到如下错误

2022/09/16 15:24:28 [crit] 3550790#3550790: *62 open() "/var/lib/nginx/fastcgi/1/03/0000000031" failed (13: Permission denied) while reading upstream, client: 122.5.23.146,

这样解决

sudo chown -R www-data:www-data /var/lib/nginx

nginx

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

composer 安装

curl -x 111.111.103.12:8080 ifconfig.me
composer config -l
composer config -g repo.packagist composer https://repo.packagist.org
sudo apt-get install php8.1-intl
HTTP_PROXY=http://111.111.103.12:8080  composer self-update
HTTP_PROXY=http://111.111.103.12:8080 composer -vvv install
sudo systemctl restart php8.1-fpm

composer install和update的使用经验
https://blog.csdn.net/u012449363/article/details/90436769

  • composer install 是从 composer.lock 读取第三方组件及其版本,并将其安装到 vendor 目录下。
    • 如果 composer.lock 文件不存在,则读取 composer.json 第三方组件及其版本,然后安装到 vendor 目录下。
  • update是直接从 composer.json 获取第三方组件及其版本,然后更新 composer.lock 文件。
    • 如果依赖的第三方组件有版本更新,update 会将最新的版本安装到 vendor 目录下,并更新 composer.lock。
  • 在生产环境下,直接使用 composer update 命令是有较大风险的。
  • 比较推荐的做法,将composer.json 和 composer.lock 都加入到版本管理中
    • 在开发过程中注意 composer.lock 中依赖版本的变化
    • 每次上线打包使用 composer install,从 composer.lock 中获取依赖的第三方组件和版本。
    • 如果需要更新第三方组件,执行 composer update 命令时,应该在后面追加有必要更新的组件库。

Get a stack trace of a running or hung PHP script
https://stackoverflow.com/questions/14261821/get-a-stack-trace-of-a-running-or-hung-php-script

前端

coffee script, less
https://coffeescript.org/
https://lesscss.org/

go

go runtime 简析
https://zhuanlan.zhihu.com/p/111370792

gdb

用QEMU模拟调试裸机ARM64汇编,支持gdb单步调试
https://blog.csdn.net/luteresa/article/details/119615923

gdb调试的layout使用
https://blog.csdn.net/zhangjs0322/article/details/10152279

远程调试内核:

target remote localhost:1234
b start_kernel
c
layout src

基本命令

layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

run(简写r): 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
continue(简写c):继续执行,到下一个断点处(或运行结束)
next(简写n): 单步跟踪程序,当遇到函数调用时,直接调用,不进入此函数体;
step(简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
until:运行程序直到退出循环体; / until+行号: 运行至某行
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
call 函数(参数):调用“函数”,并传递“参数”,如:call gdb_test(55)
quit:简记为 q ,退出gdb