『大学物理2』期中复习:波动光学
光的相干性与双缝干涉
光程和光程差
光强
杨氏双缝干涉
光的干涉
薄膜干涉
折射率大的是光疏介质
透射光没损失
牛顿环
光的衍射
单缝衍射
翻译
无质量弹簧
a spring of negligible mass
吸收
absorb
加速度
acceleration
振幅
amplitude
圆频率
angular frequency
波腹
antinode
静止的
at rest/stationary
平均寿命
average lifetime
亮条纹间距
bright stripe space
亮条纹
bright stripe/bright fringe
中央亮条纹
central bight fringe
相干源
coherent source
康普顿散射
Compton scattering
匀速
constant speed
干涉相长
constructive
坐标
coordinate
曲率半径
curvature radius
暗条纹
dark fring/dark stripe
干涉相消
destructive
对角线
diagonal
直径
diameter
传播方向
direction of propagation
电子
electron
发射光子
emission photon
发射
emit
能级结构
energy-level scheme
简谐运动方程
equation of motion
平衡位置
equil ...
『大学物理2』期中复习:振动与波
简谐振动
知识点
运动方程
弹簧振子
弹簧的频率是其固有属性
旋转矢量表示法
振动中的圆频率:圆周运动的角速度
相位:矢量的辐角
速度方程
已知位置和速度求振幅
加速度方程
动能势能机械能
例题
求振动方程
简谐振动特征量
这个加速度貌似少了个负号
机械波
知识点
各种名词
机械波就是无数个质点接连做简谐振动,每一个时刻,下一个质点复制上一个质点的运动状态
什么波面波线平面波球波平面间谐波自己看课件
波动方程(波函数)
波形方程
波动方程把 ttt 确定就是那一时刻的波形方程(各个位置的 x−yx-yx−y 关系)
波动方程把 xxx 确定就是那一点的振动方程(那一点上的 t−yt-yt−y 关系)
例题
多普勒效应和波的叠加
多普勒效应
干涉
驻波
半波损失
半波损失:蓝色为入射波,你可能认为反射回来的是虚线,但实际上是红色,也就是貌似是向前半个波长再反射一样,然后混合起来是黑色,反射处正好是波节
半波损失在波疏介质到波密介质发生
『Ubuntu』记录两款服务/自启管理工具
chkservice
这东西是专门管理服务的
sysv-rc-conf
你可以很清晰地看见各个运行级的启动项
这两个就是直接 APT 就能下载,你可能会找不到然后需要添加
1deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
然后很可能又有报错,但是一路查解决方法折腾下去就行了
『Go』初识 Flamego 框架的一些感受
昨天被拉去做苦力惹(
被拉去做苦力的一天,自己负责的项目一点没动,项目群里讨论得热闹非凡,负责人却被骗去其他项目帮忙了
一下午初识 Flamego ,之前感觉go-zero有点太死板了,现在又感觉 Flamego 有点过于灵活
Flamego 的话,感觉还是有点意思的,特别是那个依赖注入的方法,之前都没见过,有点意思
简单地说就是直接在初始化的时候使用 Map 直接传入,然后在需要的时候取出
最后看见这东西在 GitHub 上居然只有 400+ star,感觉有点不可思议
一问才知道性能不好,也确实
最后就是头一次见措辞这么奔放的的文档(乐
『hduhelp』如何在项目中接入助手 OAuth
书接上文,本篇记录一下如何在项目中使用助手鉴权
例子是我正在开发的面试系统,框架是 go-zero
示例地址: https://github.com/hduhelp/interview_backend/tree/9c05efb6a8614f79871876c0376a8d2cc123ceed
(后面重构了,结构可能有变化)
(私有仓库,需杭助内部身份)
先来看 API 文件
1234567891011121314151617181920212223syntax = "v1"// 目前仅测试杭助登录service user { @handler loginJump get /login/jump (loginJumpRequest) // 直接跳到杭助登录 @handler LoginCallback get /login/callback (LoginCallbackRequest) // 杭助登录回调}// 杭助登录回调type ( loginJumpRequest { From string `form:"from,optional"` } LoginCallbackRequest { Code string `form:"code"` // 杭助登录返回的code State string `form:"state"` // 杭助登录返回的state })
可以看见,有两个路由:
/login/jump
构造 ...
GORM 入门笔记(十二)事务的使用与坑
普通事务
使用 Transaction() 可以开启事务,在其中传入一个签名为 func(tx *gorm.DB) error 的函数,在函数内操作,如果返回的 error 不为空,则这些操作都作废
1234567GLOBAL_DB.Transaction( func(tx *gorm.DB) error { // 在这里做些事情 // tx.Create(...) return nil})
事务可以嵌套,如果内部事务出错,只会回滚内部语句
手动事务
另外一种形式是手动事务
1234567tx := GLOBAL_DB.Begin() // 开启事务// 在这里做些事情// tx.Create(...)tx.Rollback() // 回滚事务(直接回到初始点,上面的都作废)// 在这里做些事情// tx.Create(...)tx.Commit() // 提交事务
进阶一点的操作是设置存档点,还有手动回档
1234567tx := GLOBAL_DB.Begin() // 开启事务// ...tx.SavePoint("savepoint1") // 创建保存点// ...tx.RollbackTo("savepoint1") // 回滚到保存点// ...tx.Commit() // 提交事务
坑
GORM 的事务在多协程场景下貌似手动上锁,请见gorm的坑
GORM 入门笔记(十一)关联标签
在官网的实体关联底部有一个表格,讲的是关联标签
标签
描述
foreignKey
指定当前模型的列作为连接表的外键
references
指定引用表的列名,其将被映射为连接表外键
polymorphic
指定多态类型,比如模型名
polymorphicValue
指定多态值、默认表名
many2many
指定连接表表名
joinForeignKey
指定连接表的外键列名,其将被映射到当前表
joinReferences
指定连接表的外键列名,其将被映射到引用表
constraint
关系约束,例如:OnUpdate、OnDelete
关联标签可以自定义创建关联的时候,使用哪些列作为外键之类的(
其中有几个已经讲过了,然后最后一个一般不用,剩下的 4 个再挑出来讲一讲
foreignKey 与 references
还是用老师学生举例
12345678910111213141516171819202122232425262728293031323334353637383940414243package maintype Info struct { Id int Score int StudentID int}type Student struct { Id int Name string Info Info TeacherID int}type Teacher struct { Id int Name string // has many Student []Stud ...
GORM 入门笔记(十)自引用
自引用的话比较简单 ,这一篇就是用来水的
书接上文,现在需要实现评论的评论,怎么办?
很简单,只需这样
12345678910111213type Comment struct { Id int Body string Comments []Comment `gorm:"polymorphic:Owner;"` OwnerID int // 拥有者ID OwnerType string // 拥有者类型}// 添加评论func AddComment(Body string, OwnerID int, OwnerType string) { GLOBAL_DB.Create(&Comment{Body: Body, OwnerID: OwnerID, OwnerType: OwnerType})}
GORM 入门笔记(九)多态的概念与使用
概念
多态只存在于 Has One 和 Has Mang 中,这东西有些难以表述,我尽力讲得比较清晰
假如你正在开发一个类 B 站平台,平台上可以上传视频,也可以发布文章
现在需要加入评论功能,你将如何设计评论表?
众所周知,视频是可以评论的,文章也是可以评论的 (暂时不考虑评论的评论)
最简单的方式就是以视频表的主键为外键,建一个视频评论表,再另外以文章表的主键为外键,建一个文章评论表
也就是说,视频 has many 视频评论,文章 has many 文章评论,两种评论互不相干
但是,这就搞出来两张表,搞出来两种评论类型,有没有一种关联模式,能在一张表中存储所有评论呢?
或者在某些场景下,不止 A 和 B 要拥有某一类的东西,而有 ABCDEF… 那怎么办?
那自然是有的,在这里只需这样设计评论表
字段1:自增主键
字段2:评论内容
字段3:拥有者的 ID (这个拥有者可以是指视频,也可以是指文章)
字段4:拥有者类型(视频/文章)(A/B/C/D/E/F…)
这就是多态,感觉就像是可以同时以多个表作为外键,但每一条数据都只被一个拥有者拥有
(多说一句,多态仅仅是 GORM 完成的,数据库中并没有外键索引约束)
使用方法
还是接上面的视频与文章的例子,假设它们的原始模型如下
1234567891011type Video struct { Id int Title string URL string}type Post struct { Id int Title string Body string}
假设评论 ...
『Linux』一个多月来将 Ubuntu 22.04 作为主力系统的感想
嗯,如你所见,我现在已经把 Linux 当做主力系统一个多月了
先说结论:我感觉还不错!
事情的起因
啊,是这样的,就是因为我受不了 Windows 了
详情可以看 『随笔』写在新学年伊始
折腾过程
安装
首先就是决定用哪个发行版,我把主流的都试了一遍,然后发现
很明显,我除了 Debain 系,没有其他的选择
因为我真的 apt 用惯了
Debian 太简陋了,Deepin 一股国产味道,我最后选择了 Ubuntu
至于安装的过程嘛,先去官网找镜像,然后用 rufus 写到 U 盘里面,或者用 ventoy 也可以
Linux 现在在安装的时候都很贴心地给出了与 Windows 共存的选项
软件
对于 Linux ,过去一个很重要的问题就是日常软件的适配
但是现在已经 2022 年了,这种情况已经得到了很大的改观
我大概总结了一下我目前的应用
能原生运行的有:
edge、钉钉、飞书、网易云音乐、WPS、VSCode、JB 全家桶、Apifox、Typero、PicGo、Clash、VLC、搜狗输入法、OBS等
需要转译的有:
QQ/TIM、微信
可以看见,大多数应用都支持了 Linux ,但是就是憨憨腾讯,点名批评哇~~(2020年出的那个垃圾 QQ Linux 版就憋说了~~
对于 QQ/TIM 的话,crossover 可以勉强用,deepin-wine 也可以勉强用,平时可以用 lcalingua++ 代替
对于微信的话,crossover 和 deepin-wine 表现都可以
美化
美化的话,用的是仿 mac 的 WhiteSur-gtk-the ...
GORM 入门笔记(八)多对多关联(Many To Many)
Many To Many(多对多)
如果你一对多关系搞懂了的话,多对多其实也很容易
123456789101112131415type Student struct { Id int Name string // many2many Teachers []Teacher `gorm:"many2many:student_teachers;"`}type Teacher struct { Id int Name string // many2many Students []Student `gorm:"many2many:student_teachers"`}
就是互相放对方的切片嘛,但是这个关系交给一个第三方表来记录,所以需要加一个 tag
然后建表,可以看见建了三个表
1GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{})
创建
这个应该很简单了
1234567teacher1 := Teacher{Name: "teacher1"}teacher2 := Teacher{Name: "teacher2"}student1 := Student{ Name: "student1", Teachers: []Teacher{teac ...
『JWT』在 go-zero 框架中使用 JWT 鉴权
今天刚搞懂了这东西,睡前一定要记下来
首先一定要对 go-zero 和 JWT 有些基础,不然你大概不知道我在 BB 什么
建议把官网上的 demo 都跑一下
我以一个单体服务开始讲,以下是 api 文件
12345678910111213141516171819202122232425262728293031323334syntax = "v1"service user { @handler login get /login(LoginRequest) returns (LoginReply)}@server( jwt: Auth)service user { @handler userInfo get /user_info(UserInfoRequest) returns (UserInfoReply)}// 目前仅测试 JWT 功能,能否从 token 中获取 user_typetype ( // 登录服务 LoginRequest { UserType uint8 `form:"user_type"` } LoginReply { Token string `json:"token"` } // 用户信息 UserInfoRequest { } UserInfoReply { UserType uint8 `json:"user_type"` })
为了简洁,我抛开 ...
GORM 入门笔记(七)一对多关联(Has Many)与进阶预加载
Has Many(一对多)
官网地址:https://gorm.io/zh_CN/docs/has_many.html
先回忆一下 Has One 的表达
123456789101112131415type Student struct { Id int Name string // has one TeacherID int}type Teacher struct { Id int Name string // has one Student Student}
然后现在是 Has Many 嘛,一个 teacher 必定不止有一个 student
所以 Student 应该是一个切片
1234567891011121314type Student struct { Id int Name string TeacherID int}type Teacher struct { Id int Name string // has many Student []Student}
然后创建表
1GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{})
可以看见,数据库中的结构与 Has One 的是一样的
也不难理解,Has Many 只是能让多个学生指向同一个老师而已
创建
现在尝试一下使用 Has Many 的创建
123456789101112student ...
GORM 入门笔记(六)一对一关联(Belongs To 与 Has One)、初识预加载与关系操作
首先准备两个结构体:学生和老师
123456789type Student struct { Id int Name string}type Teacher struct { Id int Name string}
然后自动建表
123func One2one() { GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{})}
你会发现两张表都能被建出来,但是相互没有关联
下面来创建一对一关联
PS:Belongs To 和 Has One 在数据库是一样的,只是本地的代码结构不同
Belongs To(属于)
要说明某个学生属于某个老师,可以在 Student 中加上一个老师的 Id 和一个实例
12345678910111213type Student struct { Id int Name string // belongs to TeacherId int Teacher Teacher}type Teacher struct { Id int Name string}
这时就只需要用 Student 来建表了,清空数据库并重新建表
123func One2one() { GLOBAL_DB.AutoMigrate(&Student{})}
你可以看见, GORM 自动将学生和老师都建好了,并且学生有一个 t ...
GORM 入门笔记(五)简单的增删改查
本篇使用以下示例用表
1234567type User struct { gorm.Model Name string Age uint8}GLOBAL_DB.AutoMigrate(&User{})
创建
官方文档:https://gorm.io/zh_CN/docs/create.html
单独创建
使用 Create() 方法即可
1GLOBAL_DB.Create(&User{Name: "张三", Age: 18})
而如何知道有没有创建成功呢?
观察可以发现,这个方法会返回 DB 对象
12345678// DB GORM DB definitiontype DB struct { *Config Error error RowsAffected int64 Statement *Statement clone int}
而 DB 有 Error 和 RowsAffected 这两个属性,就可以很方便地得到结果
1234func CreateUser() { dbres := GLOBAL_DB.Create(&User{Name: "张三", Age: 18}) fmt.Println(dbres.Error, dbres.RowsAffected)}
可以看见并没有报错
那么如果报错是怎样的呢?可以添加一个 NOT NULL ...
GORM 入门笔记(四)模型创建与关键标签
什么是模型
来自官方文档:
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
1234567891011type User struct { ID uint Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime CreatedAt time.Time UpdatedAt time.Time}
关于模型内的指针类型,简单地说就是有指针应当对应可以为 NULL ,请看这篇
模型有什么用
是 gorm 进行各种操作的基础
一个书写良好的模型会让你对数据库的操作事半功倍
模型定义的关键点
约定
GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
使用上面的模型建表,id 自动成为主键
gorm.Model
这是 GORM 预定义的一个模型,方便使用的
1234567// gorm.Model 的定义type Model struct { ID uint `gorm:"primaryKey" ...