ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路
2023年10月29日
环境说明
操作系统版本:ubuntu 18.04
python版本:3.6.9
gcc版本:7.5.0
编译安装路径:/usr/local
cmake: 3.10.2
所需要的源码包我已经打包放到我的资源。
2021年1月份已经写过一篇Ubuntu 编译安装的帖子FLEXPART安装配置笔记(成功案例)——筑梦之路_筑梦之路的博客-CSDN博客
也遇到比较多的网友来咨询在编译安装过程中的问题,因此今天再次整理一下编译安装的过程,顺便解决之前写的不是很明确的地方,欢迎大家交流指正。
准备编译工作
# 更新软件源
sudo apt-get update# 安装编译工具和依赖包
sudo apt-get install -y g++ gfortran autoconf libtool automake flex bison cmake python3-dev python3-pip git vim curl unzip build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev ruby# 安装python相关包sudo apt-get install -y python3 python3-eccodes python3-genshi python3-numpy gfortran fftw3-dev libeccodes-dev libemos-dev# 配置pip显示的格式sudo mkdir ~/.pipsudo cat > ~/.pip/pip.conf << EOF
[list]
format=columns
EOF# 建立软链接sudo ln -sf /usr/bin/python3 /usr/bin/python
sudo ln -sf /usr/bin/pip3 /usr/bin/pip# 检查sudo python -V
sudo pip -V

准备python环境
# 安装pip的包sudo pip3 install cdsapi ecmwf-api-client eccodes==1.6.1 -i https://pypi.douban.com/simple#检查是否安装成功sudo python3 -c "import eccodes; print(eccodes.__version__)"
sudo python3 -c "import genshi; print(genshi.__version__)"
sudo python3 -c "import numpy; print(numpy.__version__)"
sudo pip3 list | grep cdsapi | awk '{print $2}'
sudo python3 -c "import ecmwfapi; print(ecmwfapi.__version__)"

编译安装
1. 编译安装jasper
# 下载源码包wget -c http://www.ece.uvic.ca/~mdadams/jasper/software/jasper-1.900.1.zip# 解压文件到指定目录unzip jasper-1.900.1.zip -d /usr/local/# 新建目录mkdir -p /usr/local/jasper# 切换目录cd /usr/local/jasper-1.900.1# 配置CFLAGS="-fPIC" ./configure --prefix=/usr/local/jasper# 编译
make# 编译检查
make check# 安装
make install
2. 编译安装grib_api
# 下载源码wget -c https://people.freebsd.org/~sunpoet/sunpoet/grib_api-1.28.0-Source.tar.gz# 解压到指定目录tar -zxvf grib_api-1.28.0-Source.tar.gz -C /usr/local/# 创建目录mkdir -p /usr/local/grib_api# 切换目录cd /usr/local/grib_api-1.28.0-Source# 编译三部曲./configure --prefix=/usr/local/grib_api --with-jasper=/usr/local/jaspermakemake checkmake install
3. 编译安装eccodes
# 下载源码wget -c https://confluence.ecmwf.int/download/attachments/45757960/eccodes-2.7.3-Source.tar.gz?api=v2# 解压源码到指定目录tar xvzf eccodes-2.7.3-Source.tar.gz -C /usr/local/# 创建目录mkdir -p /usr/local/eccodes# 切换目录cd /usr/local/eccodes-2.7.3-Source# 编译三部曲mkdir build && cd buildcmake -DCMAKE_INSTALL_PREFIX=/usr/local/eccodes /usr/local/eccodes-2.7.3-Source -DPYTHON_EXECUTABLE=/usr/bin/python3makectestmake install# 配置环境变量cat >> /etc/profile << 'EOF'
export ECCODES_SAMPLES_PATH=$PATH:/usr/local/eccodes/share/eccodes/samples
export ECCODES_DEFINITION_PATH=$PATH:/usr/local/eccodes/share/eccodes/definitions
EOFsource /etc/profile# 检查验证sudo apt-get install libeccodes-dev
python3 -m eccodes selfcheck# 正常输出如下:
Found: ecCodes v2.6.0.
Your system is ready.

4. 编译安装zlib
# 下载源码v=1.2.8 sudo wget http://www.zlib.net/fossils/zlib-${v}.tar.gz# 解压到指定目录sudo tar -xf zlib-${v}.tar.gz -C /usr/local/ && cd /usr/local/zlib-${v}# 编译三部曲sudo ./configure --prefix=/usr/localsudo make && make install
5. 编译安装 szlib
# 下载源码v=2.1
wget http://sources.buildroot.net/szip/szip-${v}.tar.gz# 解压到指定目录tar -xf szip-${v}.tar.gz -C /usr/local/cd /usr/local/szip-${v} && mkdir -p /usr/local/szip# 编译三部曲./configure --prefix=/usr/local/szip
make
make install
6. 编译安装hdf5
# 下载源码v=1.8.13wget https://www.gfd-dennou.org/arch/ucar/netcdf/netcdf-4/hdf5-${v}.tar.gz# 解压到指定目录tar -xf hdf5-${v}.tar.gz -C /usr/local/ && cd /usr/local/hdf5-${v}# 设置变量prefix="/usr/local/hdf5-$v"echo "Add HDF5_DIR=$prefix to .bashrc"echo "" >> ~/.bashrcecho "# HDF5 libraries for python" >> ~/.bashrcecho export HDF5_DIR=$prefix >> ~/.bashrc# 编译三部曲./configure --enable-shared --enable-hl --prefix=$HDF5_DIRmake -j 2 # 2 for number of procs to be usedmake install
7. 编译安装netcdf-c
# 下载源码v=4.1.3wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/netcdf-${v}.tar.gz# 解压到指定目录tar -xf netcdf-${v}.tar.gz -C /usr/local/ && cd /usr/local/netcdf-${v}# 设置变量prefix="/usr/local/"echo "Add NETCDF4_DIR=$prefix to .bashrc"
echo "" >> ~/.bashrc
echo "# NETCDF4 libraries for python" >> ~/.bashrc
echo export NETCDF4_DIR=$prefix >> ~/.bashrc# 编译三部曲CPPFLAGS=-I$HDF5_DIR/include LDFLAGS=-L$HDF5_DIR/lib ./configure --enable-netcdf-4 --enable-shared --enable-dap --prefix=$NETCDF4_DIRmake
make install
8. python Netcdf4 安装
# install python's netCDF4sudo pip3 install cftime==1.3.1 -i https://pypi.douban.com/simplesudo pip3 install numpy==1.19.4 -i https://pypi.douban.com/simplesudo pip3 install netCDF4==1.5.5.1 -i https://pypi.douban.com/simplesudo python3 -c "import netCDF4;print(netCDF4.__version__)"

9. 编译安装FLEXPART10.4
# 下载源码wget -c https://www.flexpart.eu/downloads/66# 解压到指定目录tar -xvf 66 -C /usr/local/ # 切换目录cd /usr/local/flexpart_v10.4_3d7eebf# 备份src目录cp -r src src-backup-`date +%F`# 修改makefile文件vim makefile#### 修改第一处#modified to 64-73行ROOT_DIR = /usr/localF90 = /usr/bin/gfortranMPIF90 = /usr/bin/mpifortINCPATH1 = ${ROOT_DIR}/grib_api/includeINCPATH2 = ${ROOT_DIR}/jasper/includeINCPATH3 = /includeLIBPATH1 = ${ROOT_DIR}/grib_api/libLIBPATH2 = ${ROOT_DIR}/jasper/libLIBPATH3 = /lib#### 修改第二处### Enable netCDF output?
ifeq ($(ncf), yes)NCOPT = -DUSE_NCF -lnetcdff -lnetcdf
elseNCOPT = -UUSE_NCF
endif#### 修改第三处## LIBRARIES
LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper $(NCOPT) -lnetcdffFFLAGS = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV) -g -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV) $(NCOPT) $(FUSER) #-Warray-bounds -fcheck=all # -march=nativeDBGFLAGS = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV_DBG) -g3 -ggdb3 -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV_DBG) $(NCOPT) -fbacktrace -Wall -fdump-core $(FUSER) # -ffpe-trap=invalid,overflow,denormal,underflow,zero -Warray-bounds -fcheck=allLDFLAGS = $(FFLAGS) -L$(LIBPATH1) -Wl,-rpath,$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)
LDDEBUG = $(DBGFLAGS) -L$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)# 编译make ncf=yes# 配置环境变量
cat >> /etc/profile <<'EOF'
export LD_LIBRARY_PATH=/usr/local/grib_api/lib:$LD_LIBRARY_PATH
EOFsource /etc/profile
10. 准备安装flex_extract
# 拉取源码cd /usr/localgit clone --single-branch --branch master https://www.flexpart.eu/gitmob/flex_extract
1)编译安装zlib 1.2.9
# 下载zlib 1.2.9源码,编译安装zlib 1.2.9版本wget https://sourceforge.net/projects/libpng/files/zlib/1.2.9/zlib-1.2.9.tar.gz# 解压到指定目录tar -zxvf zlib-1.2.9.tar.gz -C /usr/localcd /usr/local/zlib-1.2.9# 编译三部曲./configure; make; make install# 创建软链接ln -s -f /usr/local/lib/libz.so.1.2.9 /lib/x86_64-linux-gnu/libz.so.1
2) 编译安装emoslib
# 下载源码wget https://confluence.ecmwf.int/download/attachments/3473472/libemos-4.5.9-Source.tar.gz# 创建目录mkdir /usr/local/emoslib# 解压到指定目录tar -xzf libemos-4.5.9-Source.tar.gz -C /usr/local/# 切换目录cd /usr/local/libemos-4.5.9-Source# 编译安装mkdir build ; cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/emoslib /usr/local/libemos-4.5.9-Source
make
make install
3)安装ECMWF 与ERA5安装权限
cat > ~/.ecmwfapirc <<EOF
{"url" : "https://api.ecmwf.int/v1","key" : "8fb37b516ba233bde068613a8f08c785","email" : "791653827@qq.com"
}
EOFcat > ~/.cdsapirc <<EOF
url: {api-url}
key: {uid}:{api-key}
EOF
4) 修改makefile_local_gfortran文件
# 切换目录cd /usr/local/flex_extract/Source/Fortran/# 修改文件vim makefile_local_gfortran# change the original path of ECCODES_INCLUDE_DIR to
ECCODES_INCLUDE_DIR=/usr/include
5) 执行安装flex_extract
# 切换目录cd /usr/local/flex_extract# 执行安装./setup_local.sh#成功结果输出如下内容WARNING: installdir has not been specified
flex_extract will be installed in here by compiling the Fortran source in /usr/local/flex_extract/Source/Fortran
Install flex_extract_v7.1.2 software at local in directory /usr/local/flex_extractUsing makefile: makefile_local_gfortran
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./rwgrib2.f90
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./phgrreal.f90
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./grphreal.f90
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./ftrafo.f90
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./calc_etadot.f90
gfortran -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian -c ./posnam.f90
gfortran rwgrib2.o calc_etadot.o ftrafo.o grphreal.o posnam.o phgrreal.o -o calc_etadot_fast.out -O3 -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm -lemosR64 -fopenmp
ln -sf calc_etadot_fast.out calc_etadotlrwxrwxrwx 1 root root 20 Oct 29 06:30 ./calc_etadot -> calc_etadot_fast.out

6)测试flex_extract
# 测试flex_extractcd Testing/Installation/Calc_etadot
# execute the Fortran progam without arguments
../../../Source/Fortran/calc_etadot#成功结果展示:
STATISTICS: 98842.4598 98709.7359 5120.5385
STOP SUCCESSFULLY FINISHED calc_etadot: CONGRATULATIONS

至此,已经全部编译安装完成,并测试成功。
这里附上python包的版本信息,以供各位参考:
# pip list
Package Version
---------------------- -------------------
asn1crypto 0.24.0
attrs 17.4.0
Automat 0.6.0
blinker 1.4
cdsapi 0.6.1
certifi 2018.1.18
cffi 1.15.1
cftime 1.3.1
chardet 3.0.4
click 6.7
cloud-init 23.1.2
colorama 0.3.7
command-not-found 0.3
configobj 5.0.6
constantly 15.1.0
cryptography 2.1.4
distro-info 0.18ubuntu0.18.04.1
eccodes 1.6.1
ecmwf-api-client 1.6.3
findlibs 0.0.5
Genshi 0.7
httplib2 0.9.2
hyperlink 17.3.1
idna 2.6
importlib-resources 5.4.0
incremental 16.10.1
Jinja2 2.10
jsonpatch 1.16
jsonpointer 1.10
jsonschema 2.6.0
keyring 10.6.0
keyrings.alt 3.0
language-selector 0.1
MarkupSafe 1.0
netCDF4 1.5.5.1
netifaces 0.10.4
numpy 1.19.5
oauthlib 2.0.6
PAM 0.4.2
pexpect 4.2.1
pip 9.0.1
pyasn1 0.4.2
pyasn1-modules 0.2.1
pycparser 2.21
pycrypto 2.6.1
pygobject 3.26.1
PyJWT 1.5.3
pyOpenSSL 17.5.0
pyserial 3.4
python-apt 1.6.5+ubuntu0.7
python-debian 0.1.32
pyxdg 0.25
PyYAML 3.12
requests 2.18.4
requests-unixsocket 0.1.5
SecretStorage 2.3.1
service-identity 16.0.0
setuptools 39.0.1
six 1.11.0
sos 4.3
ssh-import-id 5.7
systemd-python 234
tqdm 4.64.1
Twisted 17.9.0
ubuntu-advantage-tools 27.2
ufw 0.36
unattended-upgrades 0.1
urllib3 1.22
wheel 0.30.0
zipp 3.6.0
zope.interface 4.3.2
如果不关心flexpart的版本,可以直接使用apt-get命令安装
apt-get update && apt-get install flexpart
相关源码包在我的资源或者通过文中链接地址下载。
注意事项:文中源码包的地址会随着时间过期,若不能下载请自行搜索相关版本文件。
相关文章:
ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路
2023年10月29日 环境说明 操作系统版本:ubuntu 18.04 python版本:3.6.9 gcc版本:7.5.0 编译安装路径:/usr/local cmake: 3.10.2 所需要的源码包我已经打包放到我的资源。 2021年1月份已经写过一篇Ubuntu 编译安装的帖子F…...
深度学习(生成式模型)——DDIM:Denoising Diffusion Implicit Models
文章目录 前言为什么DDPM的反向过程与前向过程步数绑定DDIM如何减少DDPM反向过程步数DDIM的优化目标DDIM的训练与测试 前言 上一篇博文介绍了DDIM的前身DDPM。DDPM的反向过程与前向过程步数一一对应,例如前向过程有1000步,那么反向过程也需要有1000步&a…...
HashMap的遍历方式 -- 好几次差点记不起来总结了一下
public class HashMapDemo {public static void main(String[] args) {// 创建一个HashMap并添加一些键值对Map<String, Integer> hashMap new HashMap<>();hashMap.put("Alice", 25);hashMap.put("Bob", 30);hashMap.put("Charlie"…...
PostgreSQL 两表关联更新sql
PostgreSQL两表关联更新SQL如下: UPDATE user SET username ft.name, age ft.age FROM userinfo WHERE user.id ft.id; user 要更新的表 userinfo数据来源表...
R2R 的一些小tip
批次间控制器(Run-to-run Controller),以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术,可在运行(如批次或晶圆…...
UML中类之间的六种主要关系
UML中类之间的六种主要关系: 继承(泛化)(Inheritance、Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组…...
机器学习-朴素贝叶斯之多项式模型
多项式模型: 记住一定用于离散的对象,不能是连续的 于高斯分布相反,多项式模型主要适用于离散特征的概率计算,切sklearn的多项式模型不接受输入负值 因为多项式不接受负值的输入,所以样本数据的特征为数值型数据&…...
下载的nginx证书转换成tomcat证书格式
1、下载的nginx证书格式 XXX.crt private.key 2、转换成JKS格式证书步骤 #crt格式证书转pem openssl x509 -in xxx.crt -out xxx.pem#先转成p12格式,此时注意,如果有别名,需要设置 openssl pkcs12 -export -in xxx.crt -inkey private.key…...
计算机毕业设计选题推荐-社区志愿者服务微信小程序/安卓APP-项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
ES6中数值扩展
目录 二进制和八进制表示法 Number.isFinite() Number.isNaN() Number.parseInt()和Number.parseFloat() Number.isInteger() Math.trunc() Math.sign() Math.cbrt(): Math.clz32(): Math.imul(): Math.fround(): ES6中…...
sql-50练习题11-15
sql-50练习题11-15 前言数据库表结构介绍学生表课程表成绩表教师表 1-1 查询没有学全所有课程的同学的信息1-2 查询至少有一门课与学号为01的同学所学相同的同学的信息1-3 查询和1号的同学学习的课程完全相同的其他同学的信息1-4 查询没学过张三老师讲授的任一门课程的学生姓名…...
【多线程面试题十九】、 公平锁与非公平锁是怎么实现的?
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: 公平锁与非公平锁是怎么…...
LabVIEW背景颜色设为和其他程序或图像中一样
LabVIEW背景颜色设为和其他程序或图像中一样 有时候LabVIEW背景色要和其他程序或者图片的颜色保持一致,如果要求不高可以大致设置一下。如果要求较高,那可以按照如下的方式。 先用PS打开标准图像,之后用吸管工具选择图像上中的点࿰…...
图表参考线,数据对比一目了然_三叠云
参考线 路径 仪表盘 >> 仪表盘设计 功能简介 新增「参考线」功能。 参考线是在单个图表组件中添加的一条水平虚线,也可以配置两条线形成的参考区间,它表示该水平线上纵坐标值的大小。 使用场景: 通过辅助线的设置,可…...
【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?
请看vcr:https://transformers.run/back/transformer/...
数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Javascript版)
关于LRU缓存 LRU - Lease Recently Used 最近使用 如果内存优先,只缓存最近使用的,删除 ‘沉睡’ 数据 核心 api: get set 分析 使用哈希表来实现, O(1)必须是有序的,常用放在前面,沉睡放在后面, 即:有序࿰…...
Matlab | 基于二次谱提取地震数据的地震子波
本文通过地震数据二次谱求取地震子波谱,具体方法如下: MATLAB代码实现如下: function w SndSpecExtWavelet(x, M) % 功能:基于二次谱提取输入地震数据data的地震子波wavelet % Extracting Wavelet from Input Seismic Dat…...
利用远程IO模块,轻松驾驭食品包装生产的自动化
常见的自动化包装系统,它的核心部分通常由一系列高端设备组成,包括自动开箱机、自动封箱机、自动捆扎机、装箱机器人、码垛机器人等。这些设备协同工作,形成一条高效运转的生产线,从开箱到装箱,再到码垛,每…...
华为OD机考算法题:计算最大乘积
题目部分 题目计算最大乘积难度易题目说明给定一个元素类型为小写字符串的数组,请计算两个没有相同字符的元素长度乘积的最大值。 如果没有符合条件的两个元素,返回 0。输入描述输入为一个半角逗号分隔的小写字符串的数组,2< 数组长度<…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
