Hi there! 👋 I’m Ruize Xia (xiaruize0911), a student at Nanjing Foreign Language School in Nanjing, Jiangsu, China. I am passionate about learning and exploring new technologies and ideas. 🌍 Location 📍 Nanjing, Jiangsu, China 📫 Contact Me Email: xiaruize0911@gmail.com QQ: 2188298460 WeChat: xiaruize0911 Thank you for visiting! Feel free to explore my blog and connect with me. 🚀
University Ranking Backend:代码深度解析(第一部分)
本篇将深入 University Ranking Backend 的代码结构。我们探索应用入口和驱动大学搜索过滤系统的核心逻辑。 🏗️ 整体架构 后端遵循标准的 模型-视图-控制器 (MVC) 模式(其中"视图"是 JSON 响应)。 app.py:初始化应用、注册路由的入口点 routes/:处理 HTTP 请求、解析参数、委托给模型 models/:包含业务逻辑和数据库交互 db/:管理 SQLite 数据库连接 1. 入口点:app.py 这个文件是应用的心脏。它设置 Flask 服务器、配置安全,连接所有组件。 函数:全局作用域 / if __name__ == "__main__": 输入:无(脚本启动时执行) 逻辑: 初始化:创建 Flask 应用实例 CORS 配置:应用 CORS(app) 允许跨域请求。这很关键,因为前端单独托管,需要权限与此 API 通信 蓝图注册:注册三个主蓝图。蓝图如同"插件"为应用添加特定路由: universities_bp(在 /universities) dropdown_bp(在 /dropdown) ranking_detail_bp(在 /subject_rankings) 启动:在端口 10000 启动开发服务器 输出:运行中的 HTTP 服务器 from flask import Flask from routes.universities import universities_bp from routes.dropdown import dropdown_bp from routes.ranking_detail import ranking_detail_bp from flask_cors import CORS app = Flask(__name__) CORS(app) # 注册蓝图 app.register_blueprint(universities_bp, url_prefix="/universities") app.register_blueprint(dropdown_bp, url_prefix="/dropdown") app.register_blueprint(ranking_detail_bp, url_prefix="/subject_rankings") if __name__ == "__main__": app.run(host='0.0.0.0', port=10000) 2. 核心逻辑:models/universities.py 这个文件包含搜索功能的"大脑"。处理复杂的搜索、过滤、排序逻辑。 ...
University Ranking Backend:代码深度解析(第二部分)
在 第一部分,我们探讨了核心搜索逻辑和 API 结构。本篇深入 数据层——如何规范化、存储和检索数据。我们还看看驱动后端功能的实用脚本。 1. 数据"胶水":utils/normalize_name.py 从多个来源(QS、US News、Niche)聚合数据的最大挑战是它们命名大学的方式不一。“MIT” 在一个数据集中是"Massachusetts Institute of Technology",在另一个可能是"Mass Inst of Tech"。 这个文件包含标准化名称的逻辑,以便我们能将数据链接在一起。 函数:normalize_name 输入:name(字符串),如"University of California, Berkeley (UCB)" 逻辑: 转小写:全部转小写避免大小写不匹配 清理:删除括号内文本(如缩写)和标点 别名检查:检查已知别名字典(ALIASES)。若输入"mit",自动转换为"massachusetts institute of technology" 输出:清洁、标准化的字符串(如"university of california berkeley") def normalize_name(name: str) -> str: # 转小写 name = name.lower() # 删除括号内文本,如"(MIT)" name = re.sub(r'\(.*?\)', '', name) # 删除标点 name = re.sub(r'[^\w\s]', '', name) # 规范化空格 name = re.sub(r'\s+', ' ', name) if name in ALIASES: # 若名称是别名,替换为全名 name = ALIASES[name] return name.strip() 2. 详细资料逻辑:models/university.py 虽然 models/universities.py(复数)处理列表和搜索,但这个文件处理 单一 大学资料的深度挖掘。 函数:get_university_by_id 这个函数很有趣,因为它必须从 许多 不同表收集数据构建完整资料。 输入:univ_id(整数) 逻辑: 基础信息:从 Universities 表获取主要信息(名称、位置、照片) 翻译:与 University_names_en_to_zh 联接获中文名称 动态排名检索: 查询 sqlite_master 查找数据库中所有以 _Rankings 结尾的表 遍历每张排名表检查该大学是否在其中 这使系统易于扩展——若添加新排名表(如"Mars_University_Rankings"),这函数自动使用它,无需代码改动 统计数据:从 UniversityStats 获取统计信息(学生数等) 输出:包含该大学已知所有信息的大字典 def get_university_by_id(univ_id): conn = get_db_connection() # 第一步:获取大学基础信息 cur = conn.execute(""" SELECT Universities.*, T.chinese_name FROM Universities LEFT JOIN University_names_en_to_zh AS T ON Universities.id = T.id WHERE Universities.id = ? """, (univ_id,)) row = cur.fetchone() if not row: return None university = dict(row) normalized_name = university['normalized_name'] # 第二步:从所有 *_Rankings 表获取排名 cur = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_Rankings'") ranking_tables = [r["name"] for r in cur.fetchall()] rankings = [] for table in ranking_tables: try: cur = conn.execute( f"""SELECT subject, source, rank_value FROM "{table}" WHERE normalized_name = ?""", (normalized_name,) ) rankings += [dict(r) for r in cur.fetchall()] except Exception as e: # 跳过格式错误或不匹配的表 continue # 第三步:从 UniversityStats 获取统计数据 cur = conn.execute( "SELECT type, count, year FROM UniversityStats WHERE normalized_name = ?", (normalized_name,) ) stats = [dict(r) for r in cur.fetchall()] conn.close() rankings = sorted(rankings, key= lambda x: -1 if "global" in x["subject"] or "World" in x["subject"] else x["rank_value"]) # 合并所有信息 university["rankings"] = rankings university["stats"] = stats return university 3. 学科排名:routes/ranking_detail.py 这个路由处理特定学科排名,如"计算机科学"或"医学"。 ...
使用 Vibe Coding 构建大学排名后端
在这篇文章中,我将分享构建 University Ranking Backend 的过程。这是一个 RESTful API,用于聚合和提供来自 QS 和 US News 等权威机构的大学排名数据。我们将探讨 Vibe Coding 策略、技术架构和驱动系统的核心算法。 📚 完整系列阅读 这个项目内容丰富,我将其分为深入系列文章: 第一部分:核心逻辑与 API 架构 探索 app.py 应用入口 解析 models/universities.py 中的"智能表选择"算法 讲解 API 路由的实现 第二部分:数据工程与脚本 介绍 ETL 流程(提取、转换、加载) 展示如何在不同数据集间标准化大学名称 阐述动态排名发现机制 🚀 项目介绍 University Ranking Backend 是一个集中式服务,为全球大学提供详细信息。 核心功能: 数据聚合:整合来自多个来源(QS、US News、Niche)的排名数据 多语言支持:内置英文和中文大学名称支持 智能过滤:支持按名称、国家、城市和排名标准进行搜索 目标是创建一个轻量级、易查询的接口,让前端应用能轻松使用,无需关心合并不同排名数据的复杂逻辑。 💡 Vibe Coding 策略 “Vibe Coding” 是一种 AI 辅助编码方法,开发者与 AI 工具协作加速开发,AI 充当协作伙伴处理重复任务、生成模板代码,并快速探索解决方案。本项目采用 数据驱动、逻辑其次 的策略,并得到 AI 的充分协助。 数据收集与质量检查: 首先在 data/ 目录收集原始数据(CSV、JSON 格式) 通过"质量检查"确保数据统一一致、排名准确、格式规范 脚本化处理流程: 编写独立脚本(scripts/ 目录)处理原始数据和填充 SQLite 数据库 这样做能将混乱的数据清洗与干净的应用逻辑分离 API 作为网关: 数据库就绪后,Flask API 作为简单网关构建 重点是让端点易用直观(/filter、/search),而非过度设计 查看 第一部分 和 第二部分 了解 “Vibe Coding”(AI 辅助开发)如何影响代码结构的具体例子,比如延迟导入和动态表发现。这些模式都通过 AI 协助优化,避免常见陷阱并提升可扩展性。 ...
University Ranking Frontend 深度分析(第二部分):状态管理、React Query 和主题架构
这是我们 University Ranking Frontend 代码深度分析的第二部分。确保你已经阅读了 https://xiaruize.org/zh/post/university-ranking-frontend/ 和 https://xiaruize.org/zh/post/university-ranking-frontend-part-1/。 概述 在第二部分,我们将探索: ThemeContext - 实现带平台特定持久化的主题切换 LanguageContext - 管理国际化和语言偏好 RankingsProvider - 使用 React Query 进行后台数据同步 React Query Hooks - 构建可重用的数据获取模式 平台特定优化 - 不同方式处理 iOS、Android 和 Web ThemeContext:主题管理 ThemeContext 管理整个应用的视觉主题——浅色模式、深色模式或自动(跟随系统偏好)。以下是完整的实现: 主题对象 export const lightTheme = { background: Platform.OS == 'android' ? '#ffffff' : '#f8f9fa', surface: '#ffffff', surfaceSecondary: '#f1f3f5', primary: '#4a90e2', text: '#2c3e50', textSecondary: '#6c757d', border: '#e1e5e9', card: '#ffffff', input: '#ffffff', shadow: '#000', }; export const darkTheme = { background: Platform.OS == 'android' ? '#121212' : '#121212', surface: '#1e1e1e', surfaceSecondary: '#434343ff', primary: '#4a90e2', text: '#ffffff', textSecondary: '#b0b0b0', border: '#333333', card: '#2a2a2a', input: '#2a2a2a', shadow: '#000', }; 注意: background 在 Android 和 iOS 之间不同。这是 Vibe Coding 的实际应用——当 AI 生成平台特定代码时,它经常发现手动编码可能错过的这种细微差别。 ...
University Ranking Frontend 深度分析(第一部分):导航架构与搜索实现
这是我们 University Ranking Frontend 代码深度分析的第一部分。如果你还没有阅读 https://xiaruize.org/zh/post/university-ranking-frontend/ 介绍,我建议从那里开始。 概述 在第一部分,我们将探索: 导航编排 - 如何在 App.js 中编排底部标签和堆栈导航器 SearchScreen 实现 - 用实时过滤构建主搜索界面 DetailPage 构造 - 显示包含动态内容的全面大学资料 API 集成 - 用 axios 获取数据并处理异步操作 架构课程:我们为什么使用这种导航模式 许多开发者会过度思考导航。University Ranking Frontend 使用一个简单但强大的模式: 底部标签 ├── 首页(搜索) │ └── 堆栈导航器 │ ├── SearchScreen │ ├── DetailPage │ └── UniversitySourceRankingsPage ├── 学科排名 │ └── 堆栈导航器 │ ├── SubjectRankingsPage │ ├── RankingDetailPage │ └── DetailPage ├── 收藏 │ └── 堆栈导航器 │ └── FavoritesScreen └── 我的(个人资料) └── 堆栈导航器 └── MeScreen 为什么这样有效: ...
用 Vibe Coding 构建 University Ranking Frontend:架构与设计策略
介绍 University Ranking Frontend 是一个精细的 React Native 应用,展示了如何使用 Vibe Coding 构建生产级移动体验——一种开发哲学,其中 AI 协助指导架构决策、简化状态管理并加速功能实现。 与构建后端服务不同(需要谨慎的数据库设计和算法优化),前端开发通常关乎创建直观的用户体验和管理复杂的应用状态。在本系列中,我们将探索 Vibe Coding 如何将前端开发从劳动密集型过程转变为迭代的、AI 协助的协作,生成干净、可维护的代码。 什么是 Vibe Coding? Vibe Coding 意味着与 AI 协作构建软件,利用机器学习模型来: 生成架构模式,符合问题空间的需求 建议状态管理解决方案,适配你的数据流 加速组件开发,通过智能代码生成 验证设计模式,在实现前识别潜在改进 快速迭代功能,通过 AI 生成的模板代码和脚手架 对于 University Ranking Frontend,Vibe Coding 帮助我们: 选择 React Native + Expo 作为开发框架,基于对跨平台支持的需求(iOS、Android、Web) 设计 Context API 系统,用于主题、语言和排名管理,无需过度工程化 构造 API 集成,使用 React Query 进行高效的数据获取和缓存 构建 UI 组件,无缝适配深色模式和语言切换 实现搜索过滤,提供响应迅速的原生体验 项目概述 University Ranking Frontend 是一个移动优先的应用,允许用户: 搜索大学,按名称、国家或城市实时筛选 查看详细排名,跨多个排名系统(QS、US News 等) 切换主题(浅色/深色模式),带持久化偏好 切换语言(英文/中文),完全本地化 UI 保存收藏,快速访问经常查看的大学 比较排名,跨不同指标和来源 技术栈 核心框架: ...
Gradient Descent
Gradient Descent (梯度下降) 梯度下降(Gradient Descent)是一种用于优化目标函数的迭代算法,广泛应用于机器学习和深度学习中,用于训练模型以最小化损失函数。推荐先阅读 机器学习基础 文章以对梯度下降的背景有大概的了解。 目标函数 目标函数 (Objective Function):有时也称作准则(criterion)、代价函数(cost function)或损失函数(loss function),是我们希望最小化的函数,通常表示为 $J(\theta)$,其中 $\theta$ 是模型的参数。例如,在线性回归中使用的 均方误差 (Mean Squared Error, MSE) 就是一个常见的目标函数。 一般来说,定义 $x^* = \arg\min_{x} J(x)$ 导数 记现在需要优化的函数为 $y = f(x)$,这个函数的导数 $f'(x)$ 表示函数在点 $x$ 处的变化率,或者说是函数图像在该点的切线斜率。 利用导数的定义,发现导数实际指示了函数在该点的变化趋势,我们可以很容易的判断出函数下降的方向 取一个小的正数 $\epsilon$,如果 $f'(x) > 0$,则 $f(x - \epsilon) < f(x)$,否则 $f(x + \epsilon) < f(x)$,也就是说: $$ f(x -\epsilon\cdot \text{sign}(f'(x))) < f(x) $$因此,导数的负方向是函数下降最快的方向。 梯度 下面,将上面所述的过程扩展到多维空间中,假设现在有一个多变量函数 $f: \mathbb{R}^n \to \mathbb{R}$,其输入为一个 $n$ 维向量 $x = [x_1, x_2, \ldots, x_n]^T$,输出为一个标量 $y = f(x)$。我们希望找到使得 $f(x)$ 最小化的 $x$。 ...
机器学习基础
Machine Learning Basics 这篇文章基于Deep Learning [@Goodfellow-et-al-2016] 一书 Chapt5,介绍机器学习的一些基本概念和方法。 Supervised Learning 本文主要讨论监督学习算法。 首先,介绍一些基本概念: 训练集 (Training Set):用于训练模型的数据集,包含输入数据 (sample, $X$)和对应的标签(label,$y$)。 样本 (Sample):训练集中的每一个数据点,通常表示为一个向量 $x^{(i)}$,其中 $i$ 是样本的索引。 测试集 (Test Set):用于评估模型性能的数据集,包含不被用在训练中,未见过的输入数据和对应的标签。 输入 (Input):模型的输入数据,通常表示为一个向量 $x \in \mathbb{R}^n$,其中 $n$ 是输入的维度。 输出 (Output):模型的输出结果,通常表示为一个标量 $y$,可以是连续值(回归问题)或离散值(分类问题)。 特征 (Feature):输入数据的各个维度,表示为 $x_1, x_2, \ldots, x_n$。 标签 (Label):输入数据对应的真实输出值,一般表示为 $y$。 监督学习算法的主要目的是,从一个训练集中学习 $P(y|x)$ ,得到一个模型,来获得近似值 $\hat{P}(y|x)$,使得对于新的输入 $x$,可以预测出对应的输出 $y$。 表示数据集的常用方法是将所有样本的输入和标签分别存储在矩阵和向量中,例如 28*28 的灰度图像可以表示为一个 (1,28,28) 的张量,包含 $m$ 个样本的训练集可以表示为一个 (m,1,28,28) 的张量,标签可以表示为一个 (m,) 的向量。 Example: Linear Regression Model 线性回归是最简单的监督学习算法之一,假设输入 $x$ 和输出 $y$ 之间存在线性关系,可以表示为(这里先不考虑截距项): ...
deep-feedforward-neural-networks
Deep Feedforward Neural Networks 本文是对Deep Learning一书中第6章内容的学习笔记。 Introduction 深度前馈网络 (Deep Feedforward Networks),也称为多层感知机 (Multilayer Perceptrons, MLPs),是最经典的神经网络模型。 从图论角度出发,深度前馈网络是一个有向无环图 (Directed Acyclic Graph, DAG),其中每个节点表示一个neuron(神经元),每条边表示一个连接权重 (weight)。节点之间的连接是有方向的,信息只能沿着边的方向流动。因此,深度前馈网络没有循环 (cycles) 或反馈 (feedback) 连接。 这里简单给出几个概念: 神经元 (Neuron):神经网络中的基本计算单元,接收输入并生成输出。这里可以将每个Neuron看作一个函数,接收输入向量并输出一个标量。 层 (Layer):神经网络中的一组神经元,通常按功能划分为输入层、隐藏层和输出层。 输入层 (Input Layer):网络的第一层,接收外部输入数据。 隐藏层 (Hidden Layers):位于输入层和输出层之间的中间层。隐藏层的数量和每层的神经元数量是网络设计的重要参数。 输出层 (Output Layer):网络的最后一层,生成最终的输出结果。 权重 (Weights):神经元的参数,决定了输入数据对输出的影响程度。权重是通过训练过程学习得到的。 偏置 (Biases):神经元的另一个参数,允许模型更灵活地拟合数据。偏置也是通过训练过程学习得到的。