普通视图

发现新文章,点击刷新页面。
昨天以前hiDandelion's Space

双极型晶体管BJT的掺杂方式、少子分布与理想直流特性

作者 hiDandelion
2024年8月14日 20:25

在研究过程中,我们忽略产生、复合电流,并且只研究小注入情况。

扩散型晶体管

掺杂方式

扩散型晶体管采用均匀基区的掺杂方式。

少子分布

扩散方程:

$$ \frac{\partial u}{\partial t}=D\nabla^2 u-\frac{u-u_0}{\tau} $$

由扩散方程和稳态条件即可得到少子浓度方程:

$$ \frac{d^2 u}{dx^2}-\frac{u-u_0}{L^2}=0 $$

$$ L^2=D\tau $$

为了表达上的简便,在上面的公式中,少子浓度统一用\(u\)表示,平衡少子浓度浓度统一用\(u_0\)表示。

解少子浓度方程,即可计算出在不同的\(x\)处少子的浓度。

直流特性

饱和电流公式:

$$ J_s=\frac{q D_p p_{n0}}{L_p}+\frac{q D_n n_{p0}}{L_n}=\frac{q D_p n_i^2}{L_p N_D}+\frac{q D_n n_i^2}{L_n N_A} $$

理想二极管方程:

$$ J=J_s[\exp(\frac{qV}{kT})-1] $$

漂移型晶体管

掺杂方式

扩散型晶体管采用非均匀基区的掺杂方式。

在研究过程中我们将假设\(N_b(x)\)为指数分布:

$$ N_b(x)=N_b(0)\exp(\frac{-\eta x}{W_b}) $$

由于非均匀的掺杂会导致基区的内建电场,用基区电场因子\(\eta\)来表征掺杂方式与内建电场强弱。

少子分布

由于计算上的复杂性,这里实际上是无法得到基区少子分布\(n(x)\)的,只能通过\(J_{nb}\)来表示。

$$ J_{nb}(x)N_b(x)\,dx=qD_{nb}\,d[N_b(x)n_{pb}(x)] $$

$$ n_{pb}(x)=-\frac{J_{nb}}{qD_{nb}}(\frac{W_b}{\eta})\{1-\exp[-\frac{\eta}{W_b}(W_b-x)]\} $$

直流特性

这里首要关注基区电流\(J_{nb}\),由于不考虑势垒区复合电流,因此有\(J_{nb}=J_{ne}\)。

在漂移型晶体管中,\(J_{nb}\)不仅由扩散电流组成,还包括漂移电流。

$$ J_{nb}=J_{d_{nb}}+J_{D_{nb}}=q\mu_{nb}n_{pb}(x)E_b(x)+qD_{nb}\frac{dn_{pb}}{dx} $$

值得注意的是,引起漂移电流的电场强度为一个常数。

$$ E_b(x)=-\frac{kT}{q\lambda} $$

$$ \lambda=\frac{W_b}{\eta} $$

计算扩散电流时,由于直接使用浓度梯度计算已经不再现实。这里需要利用\(J_{nb}=J_{ne}\),计算时用Gummel数\(Q_b\)代替\(L_n N_A\)。

$$ J_{ne}=-\frac{qD_{nb}n_i^2}{Q_b}[\exp(\frac{qV_e}{kT})-1] $$

$$ Q_b=\int_0^{W_b}N_b(x)\,dx $$

扩散型晶体管与漂移型晶体管的区别

在扩散型晶体管中,电子在基区主要通过扩散运动,而在漂移型晶体管中,电子主要通过漂移运动。由于在漂移型晶体管中内建电场加速电子向集电极移动,电子在基区的停留时间更短,响应速度更快。

双极型晶体管BJT的掺杂方式、少子分布与理想直流特性最先出现在hiDandelion的小屋

DigitalOcean入门机型Basic Regular $6评测

作者 hiDandelion
2024年8月9日 21:20

DigitalOcean在海外论坛中一直是很热门的存在,因为相比于大厂的天价垃圾服务器和天价流量费,DigitalOcean则只需较低的价格即可买到入门机型的服务器而且还自带一定的流量包。那么DigitalOcean的服务器究竟性价比如何呢?今天就拿DigitalOcean的入门级DigitalOcean入门机型Basic Regular机型进行评测吧!

配置

机型配置

由于512MB的机型在4202年实在是有点显得寒酸了,这次就选择一个1CPU+1GB的机型,这样也好和其他厂商的入门机型进行对比。上一次评测的GCP记得是2vCPU(12.5%)+1GB的配置,还没看过的话不要错过!

这里DigitalOcean没有明确说明1CPU究竟是指一个线程还是一个物理核心,不过我猜这大概率是一个线程,也就是1vCPU,0.5个物理核心。不过纠结这个也没太大必要,等一下给CPU跑个分就是了。

由于套餐里面已经搭配好了CPU、内存、磁盘和流量,所以后面其实没什么特别需要配置的东西了。

备份配置

DigitalOcean还有一个独特的备份选项可供选择。支付20%的机型费用就可以每周备份1次,留存4个备份;支付30%的机型费用就可以每天备份1次,留存7个备份。

单纯从存储量来说,日备份看上去要划算一些。从整体上来看这个备份还是相对来说便宜,可以考虑的(当然你要跟云存储比,不能跟网盘比),不过这回就没必要了。

网络配置

DigitalOcean可以一键启用IPv6,这一点还是相当方便的,要给个好评。大厂都是不默认启用IPv6的,如果要打开的话还得进行一系列繁琐的配置。

价格

不超出规定的套餐流量的话,就只要支付$6每月的固定套餐费用就可以了。超出套餐流量后是每$0.01/GB,价格也不算贵,大厂流量一般是这个的十倍还多。

评测

流媒体

流媒体中规中矩,正常机房水平。不过竟然还可以不被Reddit封锁,这一点是上一次评测的GCP做不到的。

性能

这个CPU性能其实没有很强,1000分也是较低的水平了,不过达到上一次评测的GCP的2倍还是轻轻松松。内存的读写中规中矩,磁盘1.22GB/s的512k速度就是让人满意的SSD速度了。

网络

网络是2Gbps的上行和10Gbps的下行,速度还算是令人满意的,尽管2Gbps的上行可能会不敌大厂。

总结

DigitalOcean的入门机型Basic Regular $6评测算是一个甜点的套餐吧,尽管CPU的表现稍微有些不足,整体来说没有明显短板的地方,1TB的流量也是相当够用,$6也算是一个比较实惠的价格。

良好易用的控制面板和实惠的套餐都能带来不错的用户体验,可能不足的话就是灵活性不高,没法特别选择CPU强劲或是内存容量大的方案。

让我给这款DigitalOcean的机型打分的话可能会给75分吧(至少跟上次评测的GCP比可谓是完完全全的碾压)。

DigitalOcean入门机型Basic Regular $6评测最先出现在hiDandelion的小屋

双极型晶体管BJT的直流电流关系

作者 hiDandelion
2024年7月28日 15:26

在本文讨论双极型晶体管BJT的直流电流关系时,默认讨论NPN型晶体管。

电流关系图

电流组成关系

$$I_e = I_{ne} + I_{pe}$$

$$I_b = I_{pe} + I_{vb} - I_{cbo}$$

$$I_c = I_{nc} + I_{cbo}$$

电流放大关系

$$I_e = I_b + I_c$$

$$\alpha = \frac{I_c}{I_e}$$

$$\beta = \frac{I_c}{I_b}$$

$$\gamma = \frac{I_{ne}}{I_e}$$

$$\beta^* = \frac{I_{nc}}{I_{ne}}$$

Ebers-Moll方程

Ebers-Moll方程对载流子的扩散电流做了抽象,将电流分为了Forward和Reverse两个方向,并指出了连接它们的桥梁。

$$I_e = - I_{F0} [\exp(\frac{qV_{be}}{kT}) - 1] + \alpha_R I_{R0} [\exp(\frac{qV_{bc}}{kT}) - 1]$$

$$I_e = - I_{F} + \alpha_R I_{R}$$

$$I_c = \alpha_F I_{F0} [\exp(\frac{qV_{be}}{kT}) - 1] - I_{R0} [\exp(\frac{qV_{bc}}{kT}) - 1]$$

$$I_c = - I_{R} + \alpha_F I_{F}$$

\(\alpha_F\):Forward电流增益,表征从发射极注入到基极的电子中,有多大比例能够到达集电极。

\(\alpha_R\):Reverse电流增益,表征从集电极注入到基极的电子中,有多大比例能够到达发射极。

当忽略Reverse电流时,\(\alpha_F\)几乎可以近似为\(\alpha\)。

双极型晶体管BJT的直流电流关系最先出现在hiDandelion的小屋

如何删除GCP Logging中的日志 – 一次被GCP Ops Agent坑惨的经历

作者 hiDandelion
2024年7月27日 14:20

上一次评测GCP飘了,以为已经将GCP的如意算盘谙熟于心,结果发现还是自己太年轻,不懂得社会的险恶。

GCP你能不能别那么坑啊!

起因

VM Instances的instance详情页有个Observability(太擅长观察了故取Google特色名Observability),用来监控机器状态的。硕大的两个Install可太有诱惑力了,我以为Ops Agent就是一个简单的监控,监控一下memory和disk的,就开心地点了一下。

不寻常的账单

第二天起来一看,账单里居然有$0.3待付金额,一开始我还以为是Free Tier的Credit还没来得及Apply,就没管。下午一看居然变成了$0.5。这样一算一个月我得花费$30,就算正价机器也没那么贵啊(按照上一篇文章应该在$10之内)!

必须再吐槽一下Billing页面的Report,翻遍了所有页面都看不出是什么产生的问题。就这报表,只要有那么一点点关系的全给我分类到Compute Engine,还没有子分类。

端倪

后来我手动搜索Log来到了Monitoring页面,终于发现了一些端倪。

妙啊,Fluent Bit for logs和high-throughput logging是吧,你是一点都不提价格啊。一看Logs Explorer,一千多条带有"opsagent"字样的Log,全是INFO级别的System Log,没什么信息含量(还那么贵!)。一千多条在计算机角度也不算很多,但是对GCP可是一大块肥肉呢!

解决方法

好吧,那接下来怎么办==看了一下文档,改Ops Agent的Config可以禁用Log(GCP你为什么要默认开启Log!我可没同意!),但是这太危险了,万一改了不生效或者还自带有其他收费项那可太麻烦了,干脆销毁了重开这台机器好了。

为了防止已经生成的Log产生费用,并且满足一下我的小小强迫症,我还是想着删掉这些Log。于是再一次翻遍了Log相关的页面,硬是没找着删除的地方。你猜怎么着?根本就没有删除的地方,只能通过命令行删除!真有你的GCP,欺负我文化水平低是吧!下面我就详细说一下怎么删除。

打开Web Shell

点击Activate以后等它加载,要一点时间,可以先进行下一步。

找到Project栏

就是搜索栏左边写着你的项目名称的复选框。

记下Project ID

记下右边ID栏的当前Project ID,像我就是"hidandelion"。

Web Shell切换Project

在Web Shell里,需要先切换到目前的Project才能执行命令。

gcloud config set project <Project ID>

成功会提示:

Updated property [core/project].

Web Shell删除Log

运行删除代码删除syslog,然后输入Y确认。

gcloud logging logs delete projects/<Project ID>/logs/syslog

成功会提示:

Deleted [projects/<Project ID>/logs/syslog].

这里删除的只是占大头的syslog,如果要删除其他的,还得进入Logs Explorer,点开Expand this log entry。这里我是随便找了个Network Logging,实际上只需要删除Ops Agent相关的可疑Log就可以了。因为其他的已经全被我删了,就暂时拿这个当例子咯~

找到logName项,复制里面的内容。

再运行相应的指令删除。

gcloud logging logs delete <logName>

删除完成就可以了,虽然Log buckets还是会显示有storage,但是点进去实际上已经没有了(这又是什么奇怪bug啊喂)。

小贴士

遇到Ops Agent千万不要轻易开启,不仅仅是在上面的机器详情页面,开机的时候也千万不要勾选!

总结

今天体验了GCP莫名其妙的收费项目和贴心的用户体验(指的是让你学习一下Shell指令,有助于你的Linux学习)。GCP,我饶不了你,这事可没完!

如何删除GCP Logging中的日志 – 一次被GCP Ops Agent坑惨的经历最先出现在hiDandelion的小屋

货币供应量及影响因素

作者 hiDandelion
2022年11月20日 11:23

货币供应量的层次

由几种不同的观点主导,货币供应量拥有数种定义。同时,整个体系的划分种类数和内容由于各个国家的官方定义不同也会有所不同。

一般定义

\(M_0=\)流通中现金

\(M_0\) 通常也被称为通货(\(C\), Currency)。

\(M_1=M_0+\)商业银行的支票存款

\(M_1\) 一般被称为狭义货币。商业银行的支票存款通常也被称为活期存款(\(D\), Deposit)。

\(M_2=M_1+\)商业银行的定期存款和储蓄存款

\(M_2\) 一般被称为广义货币。

\(M_3=M_2+\)其他金融机构的定期存款和储蓄存款

这里的其他金融机构包括信用合作社、邮政储蓄系统等。这些金融机构不能接受支票存款,但能接受定期存款和储蓄存款。

\(M_4=M_3+\)其他短期流动资产

这里的短期流动资产包括国库券、人寿保险公司保单、承兑票据等。这些短期流动资产在金融市场上贴现和变现的机会很多,具有相当的流动性。

中国大陆的定义

\(M_0=\)流通中现金

\(M_1=M_0+\)商业银行的活期存款

\(M_2=M_1+\)准货币

这里的准货币主要由商业银行定期存款、储蓄存款以及各种短期信用流通工具等构成,包括国库券、储蓄存单、承兑票据等。

基础货币

基础货币(\(B\))=通货(\(C\))+总准备金(\(R\))

基础货币(\(B\), Base Currency)也被称为高能货币(\(H\), High-powered Money)。

总准备金(\(R\))=活期存款法定准备金(\(R_d\))+定期存款法定准备金(\(R_t\))+超额准备金(\(R_e\))

总准备金(\(R\), Reserves)由活期存款法定准备金(\(R_d\), Required Demand Deposit Reserves)、定期存款法定准备金(\(R_t\), Required Time Deposit Reserves)和超额准备金(\(R_e\), Excess Reserves)组成。

货币乘数

货币乘数(\(m\), Money Multiplier)反映了货币供应量与基础货币之间的关系。

\(m=M_1/H\)

假定货币的需求量是无限大的,则可以推导得出货币乘数基于准备金率的表达式。

\(m=\frac{1+k}{r_d+r_t\cdot t+e+k}\)

其中 \(k\) 表示每 $1 活期存款中共中作为现金提取的比例,称为现金漏损或通货存款比例。\(r_d\) 为活期存款法定准备金率(Ratio of Required Demand Deposit Reserves),\(r_t\) 为活期存款法定准备金率(Ratio of Required Demand Deposit Reserves),\(e\) 为超额准备金率(Ratio of Excess Reserves)。

中央银行通常很容易控制 \(r_d\) 和 \(r_t\),但不容易控制 \(e\) 和 \(k\)。这为货币供应外生论和内生论都提供了足够的理论空间。

货币供应量及影响因素最先出现在hiDandelion's Space

数据库系统学习记录

作者 Zeroth
2022年1月18日 16:55

原标题 UC Berkeley cs61A/cs186学习记录

因为学过c语言也用这个写过大作业,猜想cs61A对我来说难度应该不会特别那啥。。并且下学期即将面对计院知名的很顶的课《数据库系统》和大作业MiniSQL,所以寒假需要预习一下,希望不要半途而废。。如果两个应付不过来后面再看着调整吧。。

网课在Youtube和b站上都有,课程作业和资料在EECS Instructional Support Group Home Page (berkeley.edu)可以下载到。另外这里是因为我个人需求选择了这两门课,其他国外大学的网课可以参考cs自学指南自行进行选择,也可以根据mit的cs培养方案选择。

//2022.2.21更新

我鸽了,我忏悔,之前花了两天配作业环境还装了双系统死活运行不起来。。。下学期一定好好学习。。。后面要开始上正经的数据库系统了,用的教材是Database System Concepts by Abraham Silberschatz,跟上学期汇编一样在这里记录进度

———————————————————2022.4.15更新—————————————————————

完成春学期大程之后前来更新。。前几次作业基本上是简单的sql语言运用,下载Mysql之后在命令行中运行,这里就直接把我的前几次实验报告放在这里。分别是Lab1 DBMS的安装和使用,Lab2 SQL数据定义和操作,Lab3 SQL数据完整性,Lab4 SQL 安全性

需要注意的是,在前四次作业中我使用的都是64位的Mysql,但是Lab5中因为我使用的是32位的QT Creator与数据库进行连接,所以重新下载了32位的Mysql,后文中会有安装说明,看需求选择相应的版本。

Lab5作业要求如下:

//闲聊部分

Lab5看起来很复杂,但实际上内核是很简单的,掌握了基本语法之后,写完一个函数其余函数就可以复制粘贴,修改一下逻辑即可。我们助教原话“春学期大程不水 什么时候水”可能比较口语化hhh,但是确实说明这个难度很低。作业原先是在4.15 00:00截止,我从4.12晚上开始做,通了一晚上+一早上干完程序写完实验报告准备美美上传的时候,突然发现作业延期截止了,顿时感觉我就是个被演爆了的小丑。。。有这时间睡觉不香吗。。不过至少至此春学期的任务就告一段落了,后面即将开始MiniSQL的编写。春学期基本上聚焦在数据库的使用上,到夏学期就是重点在数据库的内核上了。

//正式部分

我所使用的是QT Creator5.9.0作为开发平台,连接读取Mysql中储存的数据。即使下载了x64的QT,其中自带的gcc编译器MinGW只有32位的版本,因此必须安装32位的Mysql才能保证位数对应。但是官网上的Mysql虽然标了x86版本(32位),但是在后续安装组件的过程中,只有x64版本可选,因此位数还是不对应的。所以另外找到了32位Mysql的安装包自行编译文件才安装成功。下图中若没有ODBC和图形界面的需求,可以只下载MySQL Server这个组件,我个人比较倾向于使用命令行而不是图形界面运行Mysql。

Mysql安装组件的选择

QT的下载是在https://download.qt.io/archive/qt/,选择5.9.0版本,下载qt-opensource-windows-x86-5.9.0.exe这一文件即可。运行之后,会有设置组件的步骤,这一步中点开qt5.9.0,里面可以看到MinGW32这个组件,安装即可,其余如MSVC类的组件用于连接vscode,依据需求进行下载。在5.12.0版本中似乎可以直接下载到MinGW64,则可以不必重新下载32位的Mysql,直接根据我在Lab1中的步骤进行即可。

下载完成之后,配置系统环境变量,在设置中搜索path,在搜索弹出的链接中选择系统环境变量,点击环境变量,在系统变量中找到path双击,进入编辑页面,新建变量后把安装好的QT的bin文件路径复制到其中,则QT安装全部完成

配置环境变量
配置环境变量

下面安装32位Mysql

将mysql-5.6.39-win32.zip解压到指定目录中,修改my-default.ini的内容如下,并保存

ini文件

修改之后增加环境变量。和QT相同步骤把Mysql的bin文件路径添加到path中。之后,在C盘中找到cmd.exe,并以【管理员权限】打开。分别执行以下指令:

   E: (Mysql装在哪个盘就哪个盘加冒号)

   cd  mysql-5.6\bin (即在【cd 】之后输入mysql的bin文件的所在位置)

  mysqld -initalize -user=mysql -console

  mysqld -install,输入该指令后会打印 Service successfully installed

  net start mysql,输入该指令后会打印MySQL服务已经启动成功。至此MYSQL5.6已经安装成功,并且已运行。

后面进行Mysql的用户密码设置 windows+R,输入cmd之后回车,打开cmd.exe,在命令行中输入【mysql -u root -p】回车后会出现 【Enter password: 】 ,第一次登陆直接回车,进入mysql软件。在mysql>后输入 【set password for root@localhost=password(‘123456’);】,则用户root的密码被设置为123456。输入【exit】可以退出数据库

之后重新登陆,在Enter password: 之后输入密码就可以登录进入数据库。随后的操作根据我的Lab1的测试步骤可以对数据库进行操作。

———————————————————2022.9.29更新—————————————————————

没想到拖了这么久。。因为期中之后minisql实在是非常痛苦,并且考试周之后两门复杂的短学期也非常忙,直到七月底才正式放暑假,就一直搁置了。暑假虽然空了些,但没想到居然沉迷游戏了根本没学习XD。。现在痛定思痛了也正好比较空,就赶紧把这里补上。

将32位Mysql和QT creater配置完毕之后,新建project,并且在main或者mainwindow文件中输入如下代码进行测试查看连接是否成功。(我在写lab5的时候主要代码均在mainwindow.cpp中,main.cpp内只有创建proj时默认生成的代码)这里包含所有甚至多余的我所使用到的库。

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QDebug>
#include <QApplication>
#include <QMessageBox>
#include <QtSql>
#include <QFile>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect_mysql();
}

MainWindow::~MainWindow()
{
    delete ui;
}


//连接数据库
void MainWindow::connect_mysql()
{
    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("127.0.0.1");      //连接数据库主机名,这里需要注意(若填的为”127.0.0.1“,出现不能连接,则改为localhost)
        db.setPort(3306);                 //连接数据库端口号
        db.setDatabaseName("library");      //连接数据库名
        db.setUserName("root");          //你使用的mysql中的数据库用户名
        db.setPassword("12345678");    //你使用的mysql中的数据库密码
        db.open();
        if(!db.open())
        {
            qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
         //使用命令行输出报错信息
            return ;
        }
        else
        {
             qDebug()<<"连接成功"<<"connect to mysql OK";
        }
}

连接成功后即可开始编写代码。qt可以很方便的绘制ui,即选中项目中Forms文件夹,有一个mainwindow.ui文件,双击后即可打开设计界面,可以拖动组件进行编辑,使用方法类似于VB,即利用组件名称来调用其中的内容(eg.文本框中的输入,按钮的状态),在mainwindow.cpp中利用函数表示对应状态的触发(如按钮被按下即执行该函数中的代码)虽然这里使用的是C++,但是编写过程中基本没有C++特有的一些写法,只有C语言基础也可以很快写完。

我所绘制的界面,在右上方的框内可以改变其属性

这里选中了文本框addbno,配合其他文本框和addbookButton按钮可以实现往数据库中添加书籍信息。后文以该函数为例。函数功能:当图书馆中已经存在要添加的书号时,在原有库存数量上增加对应数量;若不存在,则将书籍信息添加到数据库中。先在头文件mainwindow.h中声明函数。

void on_addbookButton_clicked();

在mainwindow.cpp中编辑函数如下,对应命令的作用以注释形式添加在代码内

void MainWindow::on_addbookButton_clicked()
{
     QSqlQuery query;
     QString bno       = ui->addbno->text();
     QString category  = ui->addcategory->text();
     QString title     = ui->addtitle->text();
     QString press     = ui->addpress->text();
     QString year      = ui->addyear->text();
     QString author    = ui->addauthor->text();
     const double price= ui->addprice->text().toDouble();
     const int total   = ui->addtotal->text().toInt();
     const int stock   = ui->addstock->text().toInt();

//读取对应文本框中输入的信息,并储存在对应字符串中
//text().toInt()类似强制类型转换,若不如此在一些操作中会出错


     if(bno==NULL or category==NULL or title==NULL or press==NULL or year==NULL or author==NULL or price==NULL or total==NULL or stock==NULL
             or total<0 or stock<0 or price<0)
     {
         QMessageBox::information(this,"警告","请完整输入合法内容!");
     }


//合法性判断

     else{
         QString str=QString("select *from book where bno = '%1'").arg(bno);

//利用sql语句在数据库中查询,先将变量bno的内容添加到sql语句中并保存到字符串str
         QSqlQuery query;
         query.exec(str);
//执行sql语句,返回的表格信息会储存在query中
         if(query.first())
         {
             QString cmd = QString("update book set price='%1',total=total+'%2',stock=stock+'%3' where bno = '%4'")
                     .arg(price).arg(total).arg(stock).arg(bno);
             query.exec(cmd);

             qDebug()<<"添加成功";

//命令行返回执行结果
         }
         else {
             QString cmd = QString("insert into book values('%1','%2','%3','%4','%5','%6','%7','%8','%9');")
                     .arg(bno).arg(category).arg(title).arg(press).arg(year).arg(author).arg(price).arg(total).arg(stock);
             if(!query.exec(cmd))
             {
                 qDebug() << "Error to Insert Into Database " << myDatabase.lastError();

                 return;
             }
             else qDebug()<<"添加成功";
        }
     }
         ui->addbno->clear();
         ui->addcategory->clear();
         ui->addtitle->clear();
         ui->addpress->clear();
         ui->addyear->clear();
         ui->addauthor->clear();
         ui->addprice->clear();
         ui->addtotal->clear();
         ui->addstock->clear();

//清空对应文本框
}

头文件内容

在熟悉这里的写法之后其实后续的大多数功能都非常简单了,利用TableView组件和下列代码可以轻松的做到数据可视化。

void MainWindow::on_viewbook_clicked()
{
        QSqlQuery query;
        QString str1=QString("select * from book");
        query.exec(str1);
        QSqlQueryModel *model=new QSqlQueryModel;

        model->setQuery(str1);

        ui->resultView->setModel(model);
        ui->resultView->show();
        qDebug()<<"查找完成";
}

唯一有点问题的是bulkadding即批量导入,可以在规定输入格式后使用正则表达式或者line.split(“,”)【其中引号内是你所规定的分隔符】,即可将输入的信息以list的格式保存起来。我将bulkadding的内容保存在一个txt文件中,用file.open打开、QTextStream读取信息之后,再利用split分割成表格信息,分别进行读取。参考代码如下

    bool exist = QFile::exists("E:/qtcode/test06/add.txt");
    if (!exist) {QMessageBox::information(this,"警告","文件不存在");}
    else{
        QFile file("E:/qtcode/test06/add.txt");
        file.open(QIODevice::ReadOnly);
        QTextStream in(&file);
        while(!in.atEnd())
        {
            QString line = in.readLine();
            line.remove("\r\n");
            QStringList list=line.split(",");

            QString bno       = list.at(0);
            QString category  = list.at(1);
            QString title     = list.at(2);
            QString press     = list.at(3);
            QString year      = list.at(4);
            QString author    = list.at(5);
            QString price     = list.at(6);
            QString total     = list.at(7);
            QString stock     = list.at(8);
            QString str=QString("select *from book where bno = '%1'").arg(bno);
            QSqlQuery query;
            query.exec(str);
}

将信息分别存入对应变量后,后续操作与其他函数基本一致。最后运行即可得到对应的exe文件。这里可以看看我当时的实验报告(助教甚至没有要求上传源代码,验收也并不是必须进行的步骤而是一个加分项…所以说真的很水)并且我当时是有一个bug无法解决的,即当某书被全部借出后,若还有同学希望借这本书需要返回最近预定归还的时间,这个涉及到归还日期的比较,又要考虑日期是否合法有点复杂,我就伪造了一个氵过去了。。

【关于minisql的碎碎念】数据库系统的重头就是minisql。因为有一位前辈(cc98@小角龙 )对于计院本科生的课程设计提出了许多意见,并且参与了计算机学院课改的座谈会,我们这一届使用了最新的实验框架。事实上座谈会在21年底才进行,针对于数据库系统这门课的改进可以说是非常匆忙的,我非常幸运的选上了主持这次改进的老师(并且他无论从学术水平、教育热情、教学水平、lab质量上都可以是无可指摘的优秀,课程水平绝对算是计院第一等的老师了),整体框架的代码魔改自cmu15-445,是我们班的助教gg今年刚研一的大佬纯手撸出来的,和原版框架主要在BusTube上区别较大,各处也有不小的改写,因此是没法抄袭github上现有的项目代码的。我们组基本上也是纯肝出来的orz。因为是第一年时间不够(如果我没记错的话lab5验收那天助教gg还在改框架)因此事务transaction相关部分都没有要求(下一届就会有这方面要求了,因此就这来说要求是变高的,不过他们的指导文档之类的也会更加完善,我们这届甚至还要帮助教gg找bug写test),同时test部分也都只有比较基础的部分,没办法涵盖各种情况,很多test需要自己去写。甚至有可能test全过但是最终合起来前面突然冒出来一大堆bug。。当时改得确实非常痛苦。。不过有一说一这大概真的是一个非常锻炼人水平的项目,包括前端和后端和各部分之间的接口设计和我们以前写过的零碎的lab完全不是一个规模的,整体设计也非常有意思,如果有时间的话我推荐所有人都可以试一试写一下这个折磨人的玩意()

由于我是外专业没什么认识的人,因此在分小组的时候我是摆烂让助教gg随机分配的,最后分到了一个19级大佬和一个感觉是水平有限被迫咸鱼的图灵班老哥,图灵老哥熬了两个晚上写了大半的index还是有几个测试过不了就开始摆烂了,完全没有参与最后的debug模块,我属于中规中矩的改完了我负责的部分,其余所有部分包括一个针对buffer_pool优化的bonus和图灵老哥的烂摊子全部是19级老哥改完的,真的感恩orz

本项目是利用WSL在linux环境下编译,语言是C++,我所使用的软件是clion,debug/test都蛮方便的,个人感觉比vscode是更舒服一些的。助教在实验指导文档中有非常详尽的环境配置教程,跟着做就可以。我主要负责的是executor部分所以没有办法涉及很细致的index

实验指导文档

数据库系统学习记录最先出现在hiDandelion's Space

数学物理方法 – 学习笔记

作者 hiDandelion
2021年11月18日 18:03

傅立叶级数

傅立叶级数展开

对于周期为 2l 的函数,可以将其进行傅立叶级数展开。

傅立叶级数展开式
f(x)=a_0+\sum_{k=1}^{\infty}(a_k\cos\frac{k\pi x}{l}+ b_k\sin\frac{k\pi x}{l})
傅立叶系数
\begin{cases}
a_k=\frac{1}{l}\int_{-l}^{l}f(x)\cos\frac{k\pi}{l}x\,dx\\
b_k=\frac{1}{l}\int_{-l}^{l}f(x)\sin\frac{k\pi}{l}x\,dx
\end{cases}

实数形式的傅立叶变换

傅立叶积分
f(x)=\int_{0}^{\infty}A(\omega)\cos\omega x\,d\omega+\int_{0}^{\infty}B(\omega)\sin\omega x\,d\omega
傅立叶变换
\begin{cases}
A(\omega)=\frac{1}{\pi}\int_{-\infty}^{\infty}f(\xi)\cos\omega\xi\,d\xi\\

B(\omega)=\frac{1}{\pi}\int_{-\infty}^{\infty}f(\xi)\sin\omega\xi\,d\xi

\end{cases}

复数形式的傅立叶变换

傅立叶积分
f(x)=\int_{-\infty}^{\infty}F(\omega)e^{i\omega x}\,d\omega
傅立叶变换
F(\omega)=\frac{1}{2\pi}\int_{-\infty}^{\infty}f(x)e^{-i\omega x}\,dx
一些有用的性质
f^{\prime}(x)\to i\omega F(\omega)
F^{\prime}=-ixf(x)
f(x-x_0)\to e^{-i\omega x_0}F(\omega)
e^{-i\omega x_0}f(x)\to F(\omega+\omega_0)
f_1(x)*f_2(x)\to F_1(\omega)F_2(\omega)

δ 函数

\delta(x)=\begin{cases}
0&(x\neq0)\\
\infty&(x=0)
\end{cases}
\int_{a}^{b}\delta(x)\,dx= \begin{cases}
0&(a,b<0&or&a,b>0)\\
1&(a<0< b)
\end{cases}

δ 函数的挑选性

\int_{-\infty}^{\infty}f(x)\delta(x-x_0)\,dx=f(x_0)

拉普拉斯变换

f(t)=\frac{1}{2\pi i}\int_{\sigma-i\infty}^{\sigma+i\infty}F(p)e^{pt}\,dp
F(p)=\int_{0}^{\infty}f(t)e^{-pt}\,dt

微分方程

First-order Linear Non-homogeneous Ordinary Differential Equation

对于方程

y^\prime+p(x)y=f(x)

其通解为

y=e^{-\int p(x)\,dx}(C+\int f(x)e^{\int p(x)\,dx}\,dx)

Second-order Ordinary Differential Equation

形式十分多样,而且很难解。只讲一种,对于方程

y^{\prime\prime}+p(x)y^\prime+qy=f(x)

其通解为

y=(c_1+c_1(x))e^{r_1x}+(c_2+c_2(x))e^{r_2x}=(c_1+c_1(x))y_1+(c_2+c_2(x))y_2

其中

c_1(x)=\int\frac{-y_2}{W}f(x)\,dx
c_2(x)=\int\frac{y_1}{W}f(x)\,dx
W=\left|\begin{array}{cccc}
y_1&y_2\\
y_1^\prime&y_2^\prime\\
\end{array}\right|

Second-order Linear Homogeneous Partial Differential Equation

一维无界弦振动

对于方程

\begin{cases}
u_{tt}-a^2u_{xx}=0,&amp\\
u|_{t=0}=\varphi(x)\\
u_t|_{t=0}=\psi(x)
\end{cases}

根据 D’Alembert 公式得

u=\frac{1}{2}[\varphi(x+at)+\varphi(x-at)]+\frac{1}{2a}\int_{x-at}^{x+at}\psi(\xi)\,d\xi
两端固定的弦微小横振动

对于方程

\begin{cases}
u_{tt}-a^2u_{xx}=0,&0< x< l\\
u|_{x=0}=0&u|_{x=l}=0\\
u|_{t=0}=\varphi(x)& u_t|_{t=0}=\psi(x)
\end{cases}

下面是其解法

u(x,t)=X(x)T(t)
\frac{X^{\prime\prime}}{X}=\frac{T^\prime}{a^2T}=-\lambda
X^{\prime\prime}+\lambda X=0\quad T^\prime+\lambda a^2T=0
(1)若\space\lambda<0,X=c_1e^{\sqrt{-\lambda}x}+c_2e^{-\sqrt{-\lambda}x}
(2)若\space\lambda=0,X=c_1x+c_2
(3)若\space\lambda>0,X=c_1\cos\sqrt{\lambda}x+c_2\sin\sqrt{\lambda}x

数学物理方法 – 学习笔记最先出现在hiDandelion's Space

接受了伟大先知yl老师的谆谆教诲,我的心里只有咸因。Amen。

作者 Zeroth
2021年9月27日 16:20

军训期间与某辅导员的对线实录(不知道能不能把他的奇葩言论发出来0 0毕竟他对于他的卓越吹牛成果享有100%的著作权)。以及本人老阴阳人了0 0

————————————————————————————————————————————

我就直说吧,我对于这次军训的抱怨百分之百是来源于学校搞出来的骚操作,对于军训本身没有任何意见。 我很幸运遇到了非常好的教官、副连、指导员和副指,他们也已经尽力让我们能稍微舒适快乐一些。对于所有的训练合唱和通讯稿的要求,我们连的同学的热情和成果都并不比正向楼lz所展示的差。可以说我们对于目前为止整个军训的过程都是问心无愧的。

但是!但是!学校对于我们的很多方面的做法呢? 我不明白为什么学校要制定这样的时间表。官方的时间表定的是5:30起床,21:30解散,22:00熄灯,但是事实上,我们连通常的情况会比标准解散时间略微延迟几分钟,加上集合列队行走的时间,到达寝室时已经接近了这个熄灯时间了。有些指导员等人在解散前甚至会用这时间“教育”学生,能拖延一小时以上。就算不洗衣服,也要等待寝室四个同学轮流洗澡,在其中又需要忙里偷闲写通讯稿,实际睡眠时间能剩下多少?我很容易低血糖,早上必须更早起床自己泡麦片当早餐,睡得自然更少。据我所知很多同学都是零点左右睡,五点十五左右起床,就算有午睡,这的质量与夜晚的连续睡眠也是有本质区别的。我不相信学校对此一无所知。但这又如何?时间表上给大家预留的睡眠时间是够的,即使做不到也与学校无关。 当然睡眠问题已经是浙大的沉疴痼疾了,我也不多吐槽。 内务问题朝令夕改,有些要求明显脱离生活实际,强求一致性,又不给出一个统一的标准(生活气息的标准十分迷惑)。但是这毕竟是集体主义教育,存在一定合理性,我也不多吐槽。

关于军训服的问题,我们教官直言“完全不符合标准,不知道你们学校是从哪个仓库拉出来的”,虽然价格不算贵,但也绝对说不上是便宜。外套、短袖、裤子、一双军训鞋和一顶帽子90元,用的是最劣质的材料,完全是几块布拼接起来的,穿着这双鞋子去量身高甚至能直接量出我的真实身高。我挺恼火的是,学校一些要求如必须穿黑色长袜等没有提前就说明,在军训见面会的时候才由指导员说明,启真暴利店10元一双可赚了不少。

划分场地的睿智操作让云峰的同学每天往返大西区,让竺院同学每天步行往返西教。我们光到达训练场就要步行半小时大约两公里,可以说最让我痛苦的不是站军姿,而是走的这一段路。 高温预警依然坚持让我们保持训练,为等待领导视察让同学在地面匍匐50分钟,会操让同学暴晒而领导在阴凉处玩手机,这些都暂且不提。军训开始前保证会运送饮水,事实上是从我们在太阳下训练了第二天、等有报名了送水员的同学主动去问了才开始。并且我们连190来号人,半天只送了一桶还没有饮水机桶装水(10L还是15L?)大的热水。 没错,是热水。 这些都不是极其过分的事情,属于稍微忍耐一下也不是不可以的程度,往届学生也都是这样过来的,但是“从来如此,便对吗?”,我本来也没有想着要这样写出来,总体的军训还是很快乐的,但是看到正向楼,感觉lz是搞错了我们愤怒的重点,所以开一个负向楼说明一下。 集合时间快到了,我得先去准备了,中午或许会放些图或许会有所补充。 以上。 ——————————————————————————————————————

这是前几天早上八点多的训练场,我想但凡在那几天出过门的人都知道这种天气是有多阴间,我们训练时是持续在太阳下暴晒,只有休息时间能够蹭一下其他连的场地在阴凉处(说明一下,其他连队也是上午下午至少有一段时间是要被暴晒的,我们连队运气不好,分到的场地四面没有建筑物,全天都比较晒) 即使教官允许我们脱外套,恐怕也没有谁能觉得这段时间能很轻松就熬过去吧。 地面温度是碰一下都烫手的程度,阳光照射的饮水温度亲身体验至少是略高于口腔温度的。

这是在上述天气、绝大多数同学都疯狂喝水疯狂出汗的情况下送来的水。我们连的人数接近190人。

另外,前文说过往返大西区的路程非常痛苦,不仅仅是劳累许久、水泡众多、隐痛持续不断的双脚走的很痛,也是这一段路程必须【不能脱外套】【在阳光下暴晒】【保持一定速度】前进。 这大概也是yl老师没有办法体会到的事情吧。 我有在关注yl老师的正向楼,看到里面有提及了我这里说到的【领导不当人】的部分,对于其他吐槽却顾左右而言他。 正向楼前面几层说明的角度也是从连部同学和他作为辅导员自身的角度,但是参与军训的大部分同学,都是像我一样忍着身上的各处酸痛在高温下站立三小时的同学,都是在训练的间隙挤压出构思通讯稿的时间、认认真真完成任务的同学。

我也再次说明,我们连同学在通讯稿和合唱方面所展现出的热情和获得的成果都不比正向楼所展示出来的差,并且也绝对说不上“卷”。我想,在合唱比赛里没有除了钢琴伴奏以外的乐器和表演,没有任何多余的道具,专注在强弱、轮唱和音准等合唱技巧上,也绝对可以说是一股清流了吧。这就像yl老师自己所说,不过是想把这件事情认真地做好罢了。 我们在训练方面也都是规规矩矩完成教官的要求,没有对此有多余的抱怨。我的不满指向的是学校提供的劣质衣物、低效的管理、被权力异化的部分人和浙江大学的人文关怀。

我觉得从某种意义上yl老师也是一个挺包容的老师,但是他思考的角度仍然在吹着空调的办公室里,在高高在上地审视我们。他表扬的是连部的努力而非每一个同学在军训身体的痛苦中坚持下来的努力。他把所有人的咬牙坚持看作是理所当然,达不到就是“吃不了苦”“意志不够”。 我理解并且赞同军训的意义,但并不意味着我们必须忍受【过度的】【可能会对日后长期的身体健康造成影响的】恶劣条件,并且这其中很多分明是可以改善的。 这几天我看到太多的学长学姐说我们这届“娇气”,接着搬出许多的大道理诸如“前辈的物质条件更差”一类,但是时代已经变了,国家要求的军训要让我们体会的是集体主义和合理程度的坚持,而不是持续忍耐以上所说明的恶劣到不合理的外在条件。 我的对于军训的态度在上面应该也很努力的解释清楚了,作为一个对浙江大学仍然具有一些情怀的普通同学,我真的,真的非常好奇,领导们如果能看到,会怎么回应这些问题。 另外我也很想知道,杨亮老师会怎么回应。 ———————————————————————————————————————

另外关于军训绩点的问题,当绝大部分人都已经付出了90%的努力来认真度过军训的这十五天(对于这种身体痛苦的训练,只要能度过这段时间,理解成90%的基础努力值应该没有不合适吧?),却仍然要强行把学生分配到正态分布里,这合适吗?(疑问句) 对于每一个完整度过军训的同学,决定性的分数差距在于通讯稿和少数加分(合唱、方阵等的加分,这些都是大基数的,参与的同学非常多,影响应该并不大,除此以外就是哨兵、送水员等,跟整体训练时间相比应该占用时间很少)获得不同分数的同学努力的程度真的有分数显现出来的这么大吗?(疑问句)军训的本质是文艺比赛(大头加分在于通讯稿和合唱等上)?

该辅导员发表了一通奇异言论后顾左右而言他,不再回复。。。在军训结束后的一周我才知道他是我留任的组织的新指导老师,并且在见面会时仅仅花了一个小时就以令人惊奇的逻辑引起了我们部长团16人的震惊与愤怒。该说不愧是伟大先知yl老师,给予了我们小小一个学生组织高瞻远瞩的奇妙构想,我的心里只有咸因。Amen。

接受了伟大先知yl老师的谆谆教诲,我的心里只有咸因。Amen。最先出现在hiDandelion's Space

❌
❌