如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1


作者:双飞(花名:小鱼)
杭州电子科技大学在读硕士
StoneDB 内核研发实习生
❝大家好,我是 StoneDB 的实习生小鱼,目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久,在 Ubuntu 22.04 下编译 StoneDB 8.0 时踩了不少坑。比如重装了 make、cmake,到后来发现没必要,还有用 gcc-11(推荐用 gcc-9 一次编译通过) 通过源码来编译 RocksDB 等库的时候也踩了不少坑,不过在同事的协助下都解决了,并把这个过程中遇到的一些问题形成了一篇编译指南,记录在 Ubuntu22.04 下编译 StoneDB 8.0 的一些心得,希望其它同学能更轻松顺利的编译使用 StoneDB 8.0。
❞
本文说明了如何在Ubuntu 22.04 的环境下编译 StoneDB for MySQL 8.0
编译工具以及第三方库的版本要求如下:
-
GCC 9.4.0
-
Make 3.82 or later
-
CMake 3.7.2 or later
-
marisa 0.77
-
RocksDB 6.12.6
-
Boost 1.77
以下命令的执行可能会遇到权限问题,建议在管理员权限下运行,或者使用 sudo
第一步:安装依赖包
sudo apt install -y gcc
sudo apt install -y g++
sudo apt install -y make
sudo apt install -y cmake
sudo apt install -y build-essential
sudo apt install -y autoconf
sudo apt install -y tree
sudo apt install -y bison
sudo apt install -y git
sudo apt install -y libtool
sudo apt install -y numactl
sudo apt install -y python3-dev
sudo apt install -y openssl
sudo apt install -y perl
sudo apt install -y binutils
sudo apt install -y libgmp-dev
sudo apt install -y libmpfr-dev
sudo apt install -y libmpc-dev
sudo apt install -y libisl-dev
sudo apt install -y zlib1g-dev
sudo apt install -y liblz4-dev
sudo apt install -y libbz2-dev
sudo apt install -y libzstd-dev
sudo apt install -y zstd
sudo apt install -y lz4
sudo apt install -y ncurses-dev
sudo apt install -y libsnappy-dev
sudo apt install -y libedit-dev
sudo apt install -y libaio-dev
sudo apt install -y libncurses5-dev
sudo apt install -y libreadline-dev
sudo apt install -y libpam0g-dev
sudo apt install -y libicu-dev
sudo apt install -y libboost-dev
sudo apt install -y libgflags-dev
sudo apt install -y libjemalloc-dev
sudo apt install -y libssl-dev
sudo apt install -y pkg-config
libssl-dev可能安装不成功,你可以使用aptitude安装,安装过程中的选项要选择n y y
sudo apt install aptitude
sudo aptitude install libssl-dev...
# type n y y
第二步:安装第三方库
StoneDB 依赖 marisa、rocksdb、boost,在编译 marisa、rocksdb、boost 时,建议指定安装路径。示例中我们指定了 marisa、rocksdb、boost 的安装路径,你可以根据自己的需求更改安装路径。
1. 安装 cmake
注意检查你的 cmake 版本,如果你的cmake 版本 < 3.72, 安装 cmake
wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz
tar -zxvf cmake-3.7.2.tar.gz
cd cmake-3.7.2
./bootstrap && make && make install
/usr/local/bin/cmake --version
apt remove cmake -y
ln -s /usr/local/bin/cmake /usr/bin/
cmake --version
如果你的gcc版本过高, 可能导致编译失败. 你可以在
cmake-3.72/Source/cmServerProtocal.cxx的文件开头加上#include <limits>来解决这个问题.
#include <algorithm>
#include <string>
#include <vector>
#include <limits>
2. 安装 make
注意检查你的Make版本,如果你的make版本 < 3.82, 安装 make
wget http://mirrors.ustc.edu.cn/gnu/make/make-3.82.tar.gz
tar -zxvf make-3.82.tar.gz
cd make-3.82
./configure --prefix=/usr/local/make
make && make install
rm -rf /usr/local/bin/make
ln -s /usr/local/make/bin/make /usr/local/bin/make
make --version
3. 安装marisa
git clone https://github.com/s-yata/marisa-trie.git
cd marisa-trie
autoreconf -i
./configure --enable-native-code --prefix=/usr/local/stonedb-marisa
sudo make && make install
在这个例子中marisa的安装路径是/usr/local/stonedb-marisa. 你可以根据实际情况修改路径. 在这一步中, /usr/local/stonedb-marisa/lib目录中的内容如下.
root@htap-dev-64-2:/usr/local/stonedb-marisa/lib$ ls -l
total 4136
-rw-r--r-- 1 root root 2947618 Mar 20 16:25 libmarisa.a
-rwxr-xr-x 1 root root 967 Mar 20 16:25 libmarisa.la
lrwxrwxrwx 1 root root 18 Mar 20 16:25 libmarisa.so -> libmarisa.so.0.0.0
lrwxrwxrwx 1 root root 18 Mar 20 16:25 libmarisa.so.0 -> libmarisa.so.0.0.0
-rwxr-xr-x 1 root root 1273936 Mar 20 16:25 libmarisa.so.0.0.0
drwxrwxr-x 2 root root 4096 Mar 20 16:25 pkgconfig
4. 安装RocksDB
wget https://github.com/facebook/rocksdb/archive/refs/tags/v6.12.6.tar.gz
tar -zxvf v6.12.6.tar.gz
cd rocksdb-6.12.6sudo cmake ./ \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/usr/local/stonedb-gcc-rocksdb \-DCMAKE_INSTALL_LIBDIR=/usr/local/stonedb-gcc-rocksdb \-DWITH_JEMALLOC=ON \-DWITH_SNAPPY=ON \-DWITH_LZ4=ON \-DWITH_ZLIB=ON \-DWITH_ZSTD=ON \-DUSE_RTTI=ON \-DROCKSDB_BUILD_SHARED=ON \-DWITH_GFLAGS=OFF \-DWITH_TOOLS=OFF \-DWITH_BENCHMARK_TOOLS=OFF \-DWITH_CORE_TOOLS=OFF sudo make -j`nproc`
sudo make install -j`nproc`
你的gcc版本可能过高, 可以将你的 CMakeLists.txt 的 310-317 行改成下方这样.
if(FAIL_ON_WARNINGS)if(MSVC)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")else() # assume GCC# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")endif()
endif()
在本例中RocksDB的安装目录为/usr/local/stonedb-gcc-rocksdb. 你可以根据实际情况修改路径. 在这一步中, /usr/local/stonedb-gcc-rocksdb目录中文件如下
root@htap-dev-64-2:/usr/local/stonedb-gcc-rocksdb$ ls -l
total 29352
drwxr-xr-x 3 root root 4096 Mar 20 17:12 cmake
drwxr-xr-x 3 root root 4096 Mar 20 17:12 include
-rw-r--r-- 1 root root 20555728 Mar 20 17:11 librocksdb.a
lrwxrwxrwx 1 root root 15 Mar 20 17:12 librocksdb.so -> librocksdb.so.6
lrwxrwxrwx 1 root root 20 Mar 20 17:12 librocksdb.so.6 -> librocksdb.so.6.12.6
-rw-r--r-- 1 root root 9490272 Mar 20 17:12 librocksdb.so.6.12.6
5. 安装Boost
wget https://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
tar -zxvf boost_1_77_0.tar.gz
cd boost_1_77_0
./bootstrap.sh --prefix=/usr/local/stonedb-boost177
./b2 install --with=all
在本例中boost的安装目录为/usr/local/stonedb-boost. 你可以根据实际情况修改路径. 在这一步中, /usr/local/stonedb-boost/lib目录中的内容如下.
root@htap-dev-64-2:/usr/local/stonedb-boost177/lib$ ls -l
total 41612
drwxrwxr-x 49 root root 4096 Mar 20 18:57 cmake
-rw-rw-r-- 1 root root 14648 Mar 20 18:56 libboost_atomic.a
lrwxrwxrwx 1 root root 25 Mar 20 18:57 libboost_atomic.so -> libboost_atomic.so.1.77.0
-rwxrwxr-x 1 root root 22248 Mar 20 18:57 libboost_atomic.so.1.77.0
-rw-rw-r-- 1 root root 181638 Mar 20 18:56 libboost_chrono.a
lrwxrwxrwx 1 root root 25 Mar 20 18:57 libboost_chrono.so -> libboost_chrono.so.1.77.0
-rwxrwxr-x 1 root root 55000 Mar 20 18:57 libboost_chrono.so.1.77.0
-rw-rw-r-- 1 root root 166894 Mar 20 18:56 libboost_container.a
lrwxrwxrwx 1 root root 28 Mar 20 18:57 libboost_container.so -> libboost_container.so.1.77.0
-rwxrwxr-x 1 root root 111912 Mar 20 18:57 libboost_container.so.1.77.0
-rw-rw-r-- 1 root root 6874 Mar 20 18:56 libboost_context.a
lrwxrwxrwx 1 root root 26 Mar 20 18:57 libboost_context.so -> libboost_context.so.1.77.0
-rwxrwxr-x 1 root root 16584 Mar 20 18:57 libboost_context.so.1.77.0
-rw-rw-r-- 1 root root 275376 Mar 20 18:56 libboost_contract.a
lrwxrwxrwx 1 root root 27 Mar 20 18:57 libboost_contract.so -> libboost_contract.so.1.77.0
-rwxrwxr-x 1 root root 148672 Mar 20 18:57 libboost_contract.so.1.77.0
-rw-rw-r-- 1 root root 178370 Mar 20 18:56 libboost_coroutine.a
lrwxrwxrwx 1 root root 28 Mar 20 18:57 libboost_coroutine.so -> libboost_coroutine.so.1.77.0
-rwxrwxr-x 1 root root 84440 Mar 20 18:57 libboost_coroutine.so.1.77.0
-rw-rw-r-- 1 root root 1458 Mar 20 18:56 libboost_date_time.a
lrwxrwxrwx 1 root root 28 Mar 20 18:57 libboost_date_time.so -> libboost_date_time.so.1.77.0
-rwxrwxr-x 1 root root 15184 Mar 20 18:57 libboost_date_time.so.1.77.0
-rw-rw-r-- 1 root root 1654 Mar 20 18:57 libboost_exception.a
-rw-rw-r-- 1 root root 249818 Mar 20 18:56 libboost_fiber.a
lrwxrwxrwx 1 root root 24 Mar 20 18:56 libboost_fiber.so -> libboost_fiber.so.1.77.0
-rwxrwxr-x 1 root root 107648 Mar 20 18:56 libboost_fiber.so.1.77.0
-rw-rw-r-- 1 root root 520738 Mar 20 18:56 libboost_filesystem.a
lrwxrwxrwx 1 root root 29 Mar 20 18:56 libboost_filesystem.so -> libboost_filesystem.so.1.77.0
-rwxrwxr-x 1 root root 178288 Mar 20 18:56 libboost_filesystem.so.1.77.0
-rw-rw-r-- 1 root root 1015048 Mar 20 18:57 libboost_graph.a
lrwxrwxrwx 1 root root 24 Mar 20 18:56 libboost_graph.so -> libboost_graph.so.1.77.0
-rwxrwxr-x 1 root root 525440 Mar 20 18:56 libboost_graph.so.1.77.0
-rw-rw-r-- 1 root root 250402 Mar 20 18:56 libboost_iostreams.a
lrwxrwxrwx 1 root root 28 Mar 20 18:56 libboost_iostreams.so -> libboost_iostreams.so.1.77.0
-rwxrwxr-x 1 root root 129440 Mar 20 18:56 libboost_iostreams.so.1.77.0
-rw-rw-r-- 1 root root 478396 Mar 20 18:57 libboost_json.a
lrwxrwxrwx 1 root root 23 Mar 20 18:56 libboost_json.so -> libboost_json.so.1.77.0
-rwxrwxr-x 1 root root 329512 Mar 20 18:56 libboost_json.so.1.77.0
-rw-rw-r-- 1 root root 3158276 Mar 20 18:57 libboost_locale.a
lrwxrwxrwx 1 root root 25 Mar 20 18:56 libboost_locale.so -> libboost_locale.so.1.77.0
-rwxrwxr-x 1 root root 1177200 Mar 20 18:56 libboost_locale.so.1.77.0
6. 安装Gtest
sudo git clone https://github.com/google/googletest.git -b release-1.12.0
cd googletest
sudo mkdir build
cd build
sudo cmake .. -DBUILD_GMOCK=OFF
sudo make
sudo make install
默认安装路径为/usr/local/.
ls /usr/local/include/
...... gtest
ls /usr/local/lib/ # 32-bit os
ls /usr/local/lib64/ # 64-bit os
...... cmake libgtest.a libgtest_main.a
第三步:编译StoneDB
现在StoneDB有三个分支: StoneDB-5.6 (for MySQL 5.6)、 StoneDB-5.7 (for MySQL 5.7) and StoneDB-8.0 (for MySQL 8.0). 本文安装的是StoneDB-8.0. 在本例中源代码保存在/目录中.
cd /
git clone https://github.com/stoneatom/stonedb.git
在编译前, 像下文一样更改编译脚本:
你可以根据自己的需求将安装目录更改为你的实际安装目录, 本例中用的是
/stonedb/,记得将marisa, RocksDB, 和 Boost的路径改为你的这三个库的实际安装路径.
cd stonedb
git checkout -b 8.0 origin/stonedb-8.0-dev
mkdir build
cd build
mkdir install8 mysql8
cd mysql8
cmake ../../ \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/stonedb/build/install8 \
-DMYSQL_DATADIR=/stonedb/build/install8/data \
-DSYSCONFDIR=/stonedb/build/install8 \
-DMYSQL_UNIX_ADDR=/stonedb/build/install8/tmp/mysql.sock \
-DWITH_BOOST=/usr/local/stonedb-boost177 \
-DWITH_MARISA=/usr/local/stonedb-marisa \
-DWITH_ROCKSDB=/usr/local/stonedb-gcc-rocksdb \
-DDOWNLOAD_BOOST=0
make -j`nproc`
make install -j`nproc`
第四步:启动StoneDB
你需要手动创建几个目录, 然后初始化并启动StoneDB. 你还需要填写你的配置文件my.cnf, 包括安装目录和端口.
cd ../install8
### 新建目录
sudo mkdir data binlog log tmp redolog undolog### 配置my.cnf
sudo cp ../../scripts/my.cnf.sample my.cnf
sudo sed -i "s|YOUR_ABS_PATH|$(pwd)|g" my.cnf### 初始化StoneDB
sudo ./bin/mysqld --defaults-file=./my.cnf --initialize-insecure### 启动StoneDB
sudo ./bin/mysqld --user=root &
第五步:登录 StoneDB
./bin/mysql -uroot
### 设置用户 root 的密码为 'stonedb123'
mysql> alter user 'root'@'localhost' identified by 'stonedb123';
Query OK, 0 rows affected
### 允许远程访问
mysql> use mysql;
mysql> update user set host='%' where user='root';
以上就是在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 的方式,本文也同步在我们的官网上,如果有更多疑问可以查看 StoneDB 的官网,或者加入 StoneDB 用户群给我们反馈。
相关文章:
如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1
作者:双飞(花名:小鱼) 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好,我是 StoneDB 的实习生小鱼,目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久,…...
AMEYA360:尼得科科宝旋转型DIP开关系列汇总
旋转型DIP开关 S-4000 电路:BCD(十进制) 代码格式:实码 安装类型:表面贴装 调整位置:顶部 可水洗:无 端子类型:J 引线, 鸥翼型 旋转型DIP开关 SA-7000 电路:BCD(十进制), BCH(十六进制) 代码格式…...
为什么感觉 C/C++ 不火了?
首先C和C是两个非常不一样的编程语言。 C语言在系统开发领域地位非常稳固,几乎没有替代产品。应用层开发近年来略微有被Rust取代的迹象。 C由于支持的编程范式过多,导致不同水平的人写出来的代码质量差异太大,这给软件的稳健性带来了很大的…...
【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本
业务场景:该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 一、打开我们的服务器连接工具 连上服务器后,在任意位置都可以执行:crontab -e 如果没有进入编辑cron任务模式 根据提示查看…...
内存分析工具之Mat
自定义类MatClazz内存个数为9521。当前对象占用内存为16个字节。不包括其属性bytes的字节数。 通过查看MatClazz引用的类之byte数组之bytes。其单个数组占用的字节数为10256。整个内存MatClazz中属性bytes占用的byte[]字节数为97746376,与直方图统计趋近。 通过选…...
【逗老师的PMP学习笔记】项目的运行环境
一、影响项目运行的因素 主要分两种因素 事业环境因素(更多的是制约和限制因素)组织过程资产(可以借鉴的经验和知识) 1、细说事业环境因素(更多的是制约和限制因素) 资源可用性 例如包括合同和采购制约…...
Rust- 模块
(1)在项目根目录下创建mylib(里面实现自定义的外部模块) cargo new --lib mylib (2)在 项目名\mylib\src\lib.rs文件中实现新模块 pub mod add_salary {pub fn study(name: String) {println!("Rust…...
【开源源码学习】
C 迷你高尔夫 一款打高尔夫的游戏。亮点是碰撞反应和关卡设计。 GitHub - mgerdes/Open-Golf: A cross-platform minigolf game written in C. TypeScript 俄罗斯方块 复刻经典的俄罗斯方块,项目采用ReactReduxImmutable的技术栈。 GitHub - chvin/react-tetr…...
CNN-NER论文详解
论文:https://arxiv.org/abs/2208.04534 代码:https://github.com/yhcc/CNN_Nested_NER/tree/master 文章目录 有关工作前期介绍CNN-NER模型介绍 代码讲解主类多头biaffineCNNLoss解码数据传入格式 参考资料 有关工作 前期介绍 过去一共主要有四类方式…...
利用ChatGPT制作行业应用:哪些行业最受益
引言 随着人工智能技术的快速发展,ChatGPT(Chat Generative Pre-trained Transformer)成为了一种引人注目的工具,它能够生成自然流畅的对话内容。这种技术不仅在娱乐领域有着广泛的应用,还可以在各个行业中发挥重要作…...
【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用
【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用 一、QNX 侧:创建分区、配置下载、配置透传1.1 修改分区表,新增 android_test 分区,大小为 2GByte1.2 配置下载 android_test.img 镜像1.3 配置 /dev/disk/android_test_a 分区透传到 …...
Linux 用户和权限
一、root 用户 root 用户(超级管理员) 无论是windows、Macos、Linux均采用多用户的管理模式进行权限管理。在Linux系统中,拥有最大权限的账户名为:root (超级管理员)。 root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。…...
分布式应用:ELFK集群部署
目录 一、理论 1.ELFK集群 2.filebeat 3.部署ELK集群 二、实验 1. ELFK集群部署 三、总结 一、理论 1.ELFK集群 (1)概念 ELFK集群部署(FilebeatELK),ELFK ES logstashfilebeatkibana 。 数据流 架构 2.fi…...
Quartz使用文档,使用Quartz实现动态任务,Spring集成Quartz,Quartz集群部署,Quartz源码分析
文章目录 一、Quartz 基本介绍二、Quartz Java 编程1、文档2、引入依赖3、入门案例4、默认配置文件 三、Quartz 重要组件1、Quartz架构体系2、JobDetail3、Trigger(1)代码实例(2)SimpleTrigger(3)CalendarI…...
Go -- 测试 and 项目实战
没有后端基础,学起来真是费劲,所以打算速刷一下,代码跟着敲一遍,有个印象,大项目肯定也做不了了,先把该学的学了,有空就跟点单体项目,还有该看的书.... 目录 🍌单元测试…...
GitHub基本使用
GitHub搜索 直接搜索 直接搜索关键字 明确搜索仓库标题 语法:in:name [关键词]展示:比如我们想在GitHub仓库中标题中搜索带有SpringBoot关键词的,我们可以样搜: in:name SpringBoot 明确搜索描述 语法:in:description [关键词]展…...
微信小程序生成带参数的二维码base64转png显示
getQRCode() {var that this;wx.request({url: http://localhost:8080/getQRCode?ID 13,header: {content-type: application/json},method: POST,responseType: arraybuffer,//将原本按文本解析修改为arraybuffersuccess(res) {that.setData({getQRCode: wx.arrayBufferToB…...
量子计算机:下一代计算技术的奇点
介绍 量子计算机是一种基于量子力学原理的全新计算技术,它利用量子比特的特性进行计算,具有破解当前经典计算机难以解决问题的潜力。在过去几十年里,量子计算机一直是计算机科学领域的一个热门话题。本篇博客将深入探讨量子计算机的基本原理…...
【ChatGPT】ChatGPT是如何训练得到的?
前言 ChatGPT是一种基于语言模型的聊天机器人,它使用了GPT(Generative Pre-trained Transformer)的深度学习架构来生成与用户的对话。GPT是一种使用Transformer编码器和解码器的预训练模型,它已被广泛用于生成自然语言文本的各种…...
Docker设置代理、Linux系统设置代理
使用方式 新建或修改~/.docker/config.json文件,设置可用的代理地址。 {"proxies": {"default": {"httpProxy": "http://192.168.0.32:1080","httpsProxy": "http://192.168.0.32:1080","noPro…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
