当前位置: 首页 > news >正文

AI 编程的世界:用Cursor编写评分项目

AI 编程的世界:用Cursor编写评分项目

  今天是2024年的最后一天,祝大家在新的一年,健康开心快乐!

  岁末之际,星辰为伴,灯火长明,我终于在 2024 年的最后一天成功上线了 AI 编程项目。回首这一年,那些与代码鏖战的日夜、攻克难题的瞬间,都化作此刻内心的满足与安宁。感谢这一年来努力奔跑、不曾放弃的自己,所有的汗水与坚持,都在今日结成了最美的果实。新岁将启,愿未来的路上,继续心怀热爱,奔赴下一场山海,书写更多篇章!

  本项目的创意最初源自一位朋友的构想,目标是构建一个评委评分系统。值得一提的是,在整个项目开发进程中,我未手动编写任何一行代码,而是完全依赖于与多种人工智能工具(如 o1、Cursor、豆包等)的交互协作来达成项目目标。经过多日持续不懈的调试与优化工作,项目最终成功部署于腾讯云服务器之上(得益于腾讯云所提供的为期一个月的免费服务器资源),并且额外花费 15 元在腾讯云平台上购置了域名 aibobo.tech。项目访问方式如下:您既能够通过域名访问访问,也可以直接使用 IP访问访问项目。各位可以进行测试体验自已下载项目源码进行部署,管理员账号为 admin,密码为 admin123。管理员登录后,在数据初始化中下载模块,在这个模块中我已让AI生成了一些模拟数据,下载后可以直接导入进行数据初始化。有关项目的详细功能介绍,请见下文。项目源码地址:项目源码,小程序已调试通过,正在审核。

  在使用 Cursor 进行编程辅助的过程中,发现其存在一定的不稳定性问题。例如,有时会出现代码丢失的情况,原本长达 1K 多行的代码,经其处理后仅剩下百余行,着实令人惊出一身冷汗。此外,对于一些原本能够正常执行的功能代码,经 Cursor 再次编辑后,会出现诸如 403、500 等错误状态。基于此,在使用过程中,建议采用以下提示词来优化与 Cursor 的交互,以提升代码生成的准确性和稳定性。

在开发新功能前,我需要: 
1. 理解现有架构 - 查看相关模块的代码实现 - 分析代码组织方式和设计模式 - 理解数据流转和状态管理 - 确认现有的工具和方法 
2. 确认开发规范 - 检查相似功能的实现方式 - 遵循项目的命名规范 - 保持代码风格一致 - 复用现有组件和工具 
3. 开发步骤 - 先写类型定义 - 实现核心逻辑 - 添加错误处理 - 进行功能测试 
4. 如果遇到问题 - 查看相似功能的实现 - 不随意修改现有代码 - 保持架构的一致性 - 完整测试后再提交。

  提示词举例

1、基于python+flask设计的web程序,界面现代风格,同时兼容手机浏览,在手机上能正常美观显示。
2、设计一个评分系统,管理员帐号登录可以对数据管理,评委登录进去,可以选择组,只能对分配的组的被评人进行评分,分数值在0到100,分数提交后,不能重新再评分,重新再选择组,继续对被评人评分。
3、有各表的管理页面,包括添加、编辑和删除,对于评委以及被评人数据量大的可以通过电子表格直接上传添加。
4、有评分统计,对于每一个被评分对象,给出一个二维表显示各评委的打分,以及最后所得平均分,可以导出为电子表格。

项目介绍

这是一个基于Flask和微信小程序的评分系统,主要用于组织评委对参评人员进行打分评估。系统分为Web管理端和微信小程序评委端两部分。

主要功能

Web管理端
  • 用户管理:管理员可以添加、编辑、删除评委账号
  • 分组管理:创建和管理不同的评分分组
  • 成员管理:添加、编辑、删除待评分成员
  • 数据导入:支持Excel批量导入评委和待评分成员数据
  • 评分统计:查看所有评分数据,支持按学段、学科筛选
  • 数据导出:支持导出评分统计数据到Excel
小程序评委端
  • 评委登录:评委使用账号密码登录
  • 分组查看:查看自己所在的评分分组
  • 评分功能:对分组内的成员进行打分
  • 评分进度:实时显示评分进度

部署指南

1. 服务器环境准备

# 更新系统
sudo apt update
sudo apt upgrade -y# 安装必要的系统包
sudo apt install -y python3-pip python3-venv nginx mysql-server mysql-client libmysqlclient-dev# 安装SSL所需的包
sudo apt install -y certbot python3-certbot-nginx

2. 创建项目目录和虚拟环境

# 创建项目目录
sudo mkdir -p /var/www/rating_system
cd /var/www/rating_system# 创建并激活Python虚拟环境
python3 -m venv venv
source venv/bin/activate# 创建项目所需目录
#这里直接上传项目整个目录压缩文件

3. 项目文件部署

项目文件压缩之前导出所用模块,可参考

# 这里注意项目打包时,导出完整的模块: 激活本地项目的虚拟环境,在项目目录下导出模块, 虽然这样有时程序运行好似还缺模块,根据错误提示再pip一下
E:\rating_system\.venv\Scripts>activate.bat
pip freeze > requirements.txt

将项目压缩

# 上传项目文件压缩包,将项目文件压缩文件解压到指定目录
sudo apt-get install p7zip-full
7z x rating_system.7z
# 安装项目依赖
pip install -r requirements.txt
pip install gunicorn

4. 配置MySQL数据库

# 启动 MySQL
sudo systemctl start mysql
sudo systemctl enable mysql# 设置 root 密码
sudo mysql_secure_installation# 登录 MySQL
sudo mysql -u root -p# 在 MySQL 中执行以下命令
CREATE DATABASE rating_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'rating_user'@'localhost' IDENTIFIED BY '你设置的密码';
GRANT ALL PRIVILEGES ON rating_system.* TO 'rating_user'@'localhost';
FLUSH PRIVILEGES;
exit;# 数据库进行初始化在mysql shell下运行项目目录下的create_database.sql
# 切换到项目目录
cd /var/www/rating_system# 使用MySQL命令执行SQL文件
sudo mysql -u root -p rating_system < create_database.sql
# 验证数据库是否创建成功
# 登录MySQL
mysql -u rating_user -p# 在MySQL中执行以下命令
use rating_system;
show tables;  # 查看是否创建了所有表
select * from user;  # 检查管理员用户是否创建成功
exit;

5. 配置环境变量

# 项目根目录下创建.env文件
cd /var/www/rating_system
vim .env# 添加以下内容
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=rating_user
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=rating_system
JWT_SECRET=your_jwt_secret_key
SECRET_KEY=your_flask_secret_key# 设置文件权限
chmod 600 .env

6. 配置Gunicorn

创建Gunicorn服务文件:

sudo vim /etc/systemd/system/rating_system.service

服务文件内容:

[Unit]
Description=Rating System Gunicorn Service
After=network.target[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/var/www/rating_system
Environment="PATH=/var/www/rating_system/venv/bin"
ExecStart=/var/www/rating_system/venv/bin/gunicorn -w 4 -b 0.0.0.0:4262 app:app
Restart=always[Install]
WantedBy=multi-user.target

启动服务:

# 重新加载 systemd 配置
sudo systemctl daemon-reload
sudo systemctl start rating_system
sudo systemctl enable rating_system

7. 配置Nginx

创建Nginx配置文件:

sudo vim /etc/nginx/sites-available/rating_system

配置文件内容:

# HTTP - 重定向到HTTPS
server {listen 80;                                    # 监听80端口(HTTP)server_name www.aibobo.tech aibobo.tech;     # 指定域名,支持带www和不带www的访问return 301 https://$server_name$request_uri;  # 301永久重定向到HTTPS
}# HTTPS
server {listen 443 ssl;                              # 监听443端口,启用SSLserver_name www.aibobo.tech aibobo.tech;     # 指定域名# SSL证书配置ssl_certificate /etc/letsencrypt/live/www.aibobo.tech/fullchain.pem;      # SSL证书文件ssl_certificate_key /etc/letsencrypt/live/www.aibobo.tech/privkey.pem;    # SSL私钥文件# SSL安全参数ssl_protocols TLSv1.2 TLSv1.3;               # 只允许TLS 1.2和1.3ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;  # 加密算法ssl_prefer_server_ciphers on;                # 优先使用服务器的加密算法ssl_session_cache shared:SSL:10m;            # SSL会话缓存ssl_session_timeout 10m;                     # SSL会话超时时间# API 路由location / {# 反向代理设置proxy_pass http://127.0.0.1:4262;        # 转发到Flask应用proxy_http_version 1.1;                  # 使用HTTP 1.1proxy_set_header Upgrade $http_upgrade;  # WebSocket支持proxy_set_header Connection 'upgrade';   # WebSocket支持# 请求头设置proxy_set_header Host $host;             # 传递原始主机名proxy_set_header X-Real-IP $remote_addr; # 传递真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链路proxy_set_header X-Forwarded-Proto $scheme;  # 传递协议类型# CORS头部设置add_header 'Access-Control-Allow-Origin' '*' always;          # 允许所有来源add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;  # 允许的HTTP方法add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always;  # 允许的请求头# OPTIONS请求特殊处理if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';add_header 'Access-Control-Max-Age' 1728000;  # 预检请求缓存时间add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;  # 返回无内容状态码}}
}                                                                                                                                                                                              

创建符号链接:

sudo ln -s /etc/nginx/sites-available/rating_system /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

8. 配置SSL证书

# 安装SSL证书
sudo certbot --nginx -d your_domain.com# 自动续期证书
sudo certbot renew --dry-run

9. 文件权限设置

# 设置目录权限
sudo chown -R www-data:www-data /var/www/rating_system
sudo chmod -R 755 /var/www/rating_system

10、访问测试

  • 在浏览器访问 http://服务器IP:4262 应该能看到管理后台登录界面
  • 默认管理员账号:
    • 用户名:admin
    • 密码:admin123

11、小程序配置

  • 在微信开发者工具中:

    • 点击右上角【详情】
    • 在【本地设置】中勾选【不校验合法域名…】选项
    • 这样可以在开发阶段使用 IP 地址

常用的操作命令

以下是我在项目部署过程中使用的一些命令

# 赋予权限
sudo chmod -R 777 /var/www/rating_system/*
# 删除
rm /var/www/rating_system/rating_system.tar
# 更改路径写的权限 为所有者添加写权限
chmod u+w /var/www/rating_system
# 为所有者、组用户和其他用户添加写权限
chmod a+w /var/www/rating_system
# 打包/var/www/rating_system 将此目录下的venv目录除外
tar --exclude=venv -cvf rating_system.tar /var/www/rating_system
# 强制删除目录
rm -rf /var/www/rating_system
# 将压缩文件解压到指定目录
sudo apt-get install p7zip-full
7z x rating_system.7z

维护建议

  1. 定期备份数据库
# 创建备份脚本
#!/bin/bash
backup_dir="/var/backups/rating_system"
date_format=$(date +%Y%m%d_%H%M%S)
mysqldump -u rating_user -p rating_system > "$backup_dir/backup_$date_format.sql"
  1. 监控系统日志
# 检查应用日志
tail -f /var/www/rating_system/logs/flask_app.log# 检查Nginx日志
tail -f /var/log/nginx/error.log
  1. 定期更新依赖包
pip install --upgrade -r requirements.txt

技术栈

  • 后端:Python Flask

  • 数据库:MySQL

  • 前端:微信小程序

  • Web端:Bootstrap + jQuery

  • 服务器:Nginx + Gunicorn

重置Cursor试用

解决Cursor在免费订阅期间出现以下提示的问题: Too many free trial accounts used on this machine. Please upgrade to pro. We have this limit in place to prevent abuse. Please let us know if you believe this is a mistake.

1、https://github.com/yuaotian/go-cursor-help

相关文章:

AI 编程的世界:用Cursor编写评分项目

AI 编程的世界&#xff1a;用Cursor编写评分项目 今天是2024年的最后一天&#xff0c;祝大家在新的一年&#xff0c;健康开心快乐&#xff01; 岁末之际&#xff0c;星辰为伴&#xff0c;灯火长明&#xff0c;我终于在 2024 年的最后一天成功上线了 AI 编程项目。回首这一年&am…...

Cesium教程(二十三):Cesium实现下雨场景

文章目录 实现效果代码引入js文件创建容器创建视图定义下雨场景完整代码下载实现效果 代码 在 Cesium 中利用PostProcessStageLibrary实现下雪场景,你可以按照以下步骤进行: 创建一个 PostProcessStage:首先,你需要创建一个PostProcessStage对象,它将用于定义下雪效果的渲…...

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关&#xff0c;干啥的&#xff1f;用通俗易懂的话来说&#xff0c;微服务架构下Higress 就像是一个智能的“交通警察”&#xff0c;它站在你的网络世界里&#xff0c;负责指挥和调度所有进出的“车辆”&#xff08;也就是数据流量&#xff09;。它的…...

uniapp 微信小程序开发使用高德地图、腾讯地图

一、高德地图 1.注册高德地图开放平台账号 &#xff08;1&#xff09;创建应用 这个key 第3步骤&#xff0c;配置到项目中locationGps.js 2.下载高德地图微信小程序插件 &#xff08;1&#xff09;下载地址 高德地图API | 微信小程序插件 &#xff08;2&#xff09;引入项目…...

Springboot:后端接收数组形式参数

1、接收端写法 PermissionAnnotation(permissionName "",isCheckToken true)PostMapping("/batchDeleteByIds")public ReturnBean webPageSelf( NotNull(message "请选择要删除的单据&#xff01;") Long[] ids) {for (Long string : ids) {l…...

Postman[2] 入门——界面介绍

可参考官方 文档 Postman 导航 | Postman 官方帮助文档中文版Postman 拥有各种工具、视图和控件&#xff0c;帮助你管理 API 项目。本指南是对 Postman 主要界面区域的高级概述&#xff1a;https://postman.xiniushu.com/docs/getting-started/navigating-postman 1. Header&a…...

1月第四讲:Java Web学生自习管理系统

一、项目背景与需求分析 随着网络技术的不断发展和学校规模的扩大&#xff0c;学生自习管理系统的需求日益增加。传统的自习管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;开发一个智能化的学生自习管理系统显得尤为重要。该系统旨在提高自习室的利用率和…...

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…...

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…...

ROS2+OpenCV综合应用--10. AprilTag标签码追踪

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车摄像头云台运动的功能&#xff0c;摄像头会保持标签码在视觉中间而运动&#xff0c;根据这一特性&#xff0c;从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…...

python Celery 是一个基于分布式消息传递的异步任务队列系统

Celery 是一个基于分布式消息传递的异步任务队列系统&#xff0c;主要用于处理耗时任务、定时任务和周期性任务。它能够将任务分配到多个工作节点&#xff08;Worker&#xff09;上执行&#xff0c;从而提高应用程序的性能和可扩展性。Celery 是 Python 生态中最流行的任务队列…...

嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别

引言&#xff1a;在现代嵌入式硬件设计中&#xff0c;开关元件作为电路中的重要组成部分&#xff0c;起着至关重要的作用。三种主要的开关元件——IGBT&#xff08;绝缘栅双极型晶体管&#xff09;、MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;和三极管&#…...

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日&#xff0c;2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者&#xff0c;共同探讨云计算产业发展方向和未来机遇&#xff0c;展示云计算标准化工作重要成果。 会上&#xff0c;云建设与应用领航计划&#xff08;2024&#xff09;建云用…...

好用的随机生成图片的网站

官网&#xff1a; Lorem Picsum 获取自定义大小的随机图像 https://picsum.photos/200/300 获取正方形图像 https://picsum.photos/200 获取特定类型的图像 通过添加到 /id/{image} url 的开头来获取特定图像。 https://picsum.photos/id/237/200/300 获取静态随机图像…...

添加 env 配置,解决import路径问题

添加 env 配置&#xff0c;解决import路径问题 { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387 “version”: “0.2.0”, “configurations”: [ {"name&q…...

Go work stealing 机制

Go语言的Work Stealing&#xff08;工作窃取&#xff09;机制是一种用于调度Goroutines&#xff08;协程&#xff09;的策略&#xff0c;其核心目的是最大化CPU使用率&#xff0c;减少任务调度的开销&#xff0c;并提高并发性能和吞吐量。以下是Go Work Stealing机制的详细解释…...

基础数据结构--二叉树

一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合&#xff0c;这个集合要么是空集&#xff08;当 n 等于 0 时&#xff09;&#xff0c;要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…...

《C++设计模式》策略模式

文章目录 1、引言1.1 什么是策略模式1.2 策略模式的应用场景1.3 本文结构概览 2、策略模式的基本概念2.1 定义与结构2.2 核心角色解析2.2.1 策略接口&#xff08;Strategy&#xff09;2.2.2 具体策略实现&#xff08;ConcreteStrategy&#xff09;2.2.3 上下文&#xff08;Cont…...

JavaScript学习记录6

第一节 算数运算符 1. 概述 JavaScript 共提供10个算术运算符&#xff0c;用来完成基本的算术运算。 加法运算符x y减法运算符 x - y乘法运算符 x * y除法运算符x / y指数运算符x ** y余数运算符x % y自增运算符x 、x自减运算符--x 、x--数值运算符 x负数值运算符-x 减法、…...

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况&#xff0c;尤其是当您获得新的 iPhone 15/14 时&#xff0c;您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点&#xff0c;但它的缺点也不容忽视&#xff0c;阻碍了你选择它。例如&#xff0c;您需要…...

Doris安装部署

Doris 概述 Apache Doris由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过200个产品线在使用&#xff0c;部署机器超过1000台&#xff0c;单一业务最大可…...

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…...

io多路复用, select, poll, epoll

系列文章目录 异步I/O操作函数aio_xxx函数 https://blog.csdn.net/surfaceyan/article/details/134710393 文章目录 系列文章目录前言一、5种IO模型二、IO多路复用APIselectpollepoll 三、两种高效的事件处理模式Reactor模式Proactor模式模拟 Proactor 模式基于事件驱动的非阻…...

k8s-1.28.2 部署prometheus

一、prometheus helm仓库 ## 网站地址 # https://artifacthub.io/## prometheus 地址 # https://artifacthub.io/packages/helm/prometheus-community/prometheus. # helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # helm repo …...

记录第一次跑YOLOV8做目标检测

今天是24年的最后一天&#xff0c;终于要向新世界开始破门了&#xff0c;开始深度学习&#xff0c;YOLO来敲门~ 最近做了一些皮肤检测的功能&#xff0c;在传统的处理中经历了反复挣扎&#xff0c;终于要上YOLO了。听过、看过&#xff0c;不如上手体会过~ 1、YOLO是什么&#x…...

使用Python爬取BOSS直聘职位数据并保存到Excel

使用Python爬取BOSS直聘职位数据并保存到Excel 在数据分析和挖掘中&#xff0c;爬取招聘网站数据是一项常见的任务。本文将详细介绍如何使用Python爬取BOSS直聘上与“测试工程师”相关的职位数据&#xff0c;并将其保存到Excel文件中。通过逐步分解代码和添加详细注释&#xf…...

node.js之---集群(Cluster)模块

为什么会有集群&#xff08;Cluster&#xff09;模块&#xff1f; 集群&#xff08;Cluster&#xff09;模块的作用 如何使用集群&#xff08;Cluster&#xff09;模块&#xff1f; 为什么会有集群&#xff08;Cluster&#xff09;模块 Node.js 是基于 单线程事件驱动 模型的…...

SSM-Spring-IOC/DI对应的配置开发

目录 一、IOC 控制反转 1.什么是控制反转呢 2. Spring和IOC之间的关系是什么呢? 3.IOC容器的作用以及内部存放的是什么? 4.当IOC容器中创建好service和dao对象后&#xff0c;程序能正确执行么? 5.Spring 容器管理什么内容&#xff1f; 6.如何将需要管理的对象交给 …...

一文大白话讲清楚CSS元素的水平居中和垂直居中

文章目录 一文大白话讲清楚CSS元素的水平居中和垂直居中1.已知元素宽高的居中方案1.1 利用定位margin:auto1.2 利用定位margin负值1.3 table布局 2.未知元素宽高的居中方案2.1利用定位transform2.2 flex弹性布局2.3 grid网格布局 3. 内联元素的居中布局 一文大白话讲清楚CSS元素…...

航顺芯片推出HK32A040方案,赋能汽车矩阵大灯安全与智能化升级

汽车安全行驶对整车照明系统的要求正在向智能化方向发展。车灯位于汽车两侧&#xff0c;前期有各种各样的实现包括氙气灯、LED灯等等光源技术。矩阵大灯对汽车照明系统朝着安全性和智能化兼具的方向发展起到了重要推动作用。矩阵大灯可以精细控制到每一个小灯珠&#xff0c;从而…...