GORM 入门笔记(三)基本表操作
ORM 是把结构和数据库表创建一个映射,所以我们先建一个结构体(也就是模型,这个后面详细讲)
1234//一个只有一个字段的结构体type User struct { Name string}
使用 AutoMigrate 自动迁移/建表
尝试使用 db.AutoMigrate() 方法自动创建表
1err = db.AutoMigrate(&User{})
再次观察,发现多了个叫 t_user 的表
为什么会多前缀呢?这是在创建连接的时候,在 gorm.Config 中预设的
类似地还可以有单复数后缀
1234NamingStrategy: schema.NamingStrategy{ TablePrefix: "t_", // 表名前缀,`User` 的表名应该是 `t_users` SingularTable: true, // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`}
将其设置为 false 再次执行,新建表的命名格式是复数
使用 Migrator 接口
GORM 提供了 Migrator 接口,我们可以直接使用这个接口来操作
1234567891011121314151617181920212223242526272829303132333435type Migrator interface { // AutoMigrate AutoMigrate(dst ...interface{}) error ...
GORM 入门笔记(二)创建数据库连接
官方文档:https://gorm.io/zh_CN/docs/connecting_to_the_database.html
最简单的连接方法
通过一行 DSN 连接
12dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
示例
12345678910111213package mainimport ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm")func main() { dsn := "root:1234@tcp(127.0.0.1:3306)/gorm_learning?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) fmt.Println(db, err)}
可见没有返回错误
配置连接参数
gorm.Open() 方法有两个参数,分别可以对数据库和 GORM 进行更高级的配置
mysql.Config
这样可以设置一些高级配置
12345678db ...
GORM 入门笔记(一)前言与介绍
前言
什么是 ORM
教科书上的废话:
ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与数据库相互映射
人话:
ORM 让你的数据库里面的表结果变成你代码定义的数据结构(go 中的结构体的结构)
从而做到代码结构即为数据库结构,代码行为即为数据库行为
为什么选择 GORM
作者中国人(张金柱哇,我听过他的课)
中文文档
功能全面,符合新开发习惯
稳定
…
如何安装
见官方文档
12go get -u gorm.io/gormgo get -u gorm.io/driver/mysql # 或其他数据库驱动
在本地准备学习环境
这里以 MySQL 示例,准备一个练习用的数据库
可见已经创建完毕
『总结』2022 国庆前阶段性总结
嗯,明天早八,要早点睡,也不分标题了吧,想到哪就写到哪
首先就是这学期的规划,我在开学初的时候计划在大二把 408 四门学完
有些大佬劝我不用那么着急,我现在感觉也是
抛开一堆有意义或没有意义的课不谈,现在发现其实有一些更重要的事情需要去做
例如我目前正在负责的面试系统项目
然后需要学一堆框架以及相关知识,go-zero、Gorm、JWT 等等等
然后这个肯定是重点哇,属于 紧急且重要 的事情,而 408 只能被归类为 不紧急但重要
我原本计划是上学期把数据结构和计网搞定,现在只能尽量按下面的计划了
本学期:
通过面试系统积累项目经验,并学习几个框架
把 Go 的系列更完,完整地系统地过一遍
搞定数据结构
然后计网安排给寒假
然后是,日更!日更哇!
我现在这个样还怎么跟别人说自己是个日更博主捏
一定要日更哇!不要想着某一天能爆发更个几篇,日更就完了!
最近的面试招新工作,以及新项目,有点打乱我的节奏
这个国庆赶紧调养,一定要日更
前几天看了看 go-zero ,本来是想搞一个系列的
但是又发现官方文档挺抽象的,很多东西都没交待清楚
我都没有学懂,还写个der
(这东西挺强大的,但是没有什么好的系统性的教程
接下来准备把 GORM 整一系列出来,接着是 Golang 的
就这样吧,赶紧睡觉
『Linux』如何添加路径到 PATH
使用以下命令即可
1export PATH="$PATH:<你的路径>"
例
1export PATH="$PATH:/home/nx/go/bin"
一定要使用完整的绝对路径
如果要持久化的话,可以编辑 ~/.bashrc 文件,并添加到末尾
『hduhelp』如何使用助手鉴权/使用助手的开放服务
官方文档:https://open.hduhelp.com/docs/develop/
因为官方文档写得有些抽象,鄙人搞懂之后特作此文以记录
PS:全程使用 https
申请票据
首先,作为第三方软件,在助手许可后你是可以调用助手的api的
助手方面会提供给你一对字符串密钥
名称
票据
client_id
用于识别服务提供方的 id
client_secret
用于证明服务方身份的密钥
获取 access_token
这个要一来二去搞两回,有点麻烦
首先,你要构造一个发起请求的 URL ,然后让用户在浏览器中访问
1https://api.hduhelp.com/oauth/authorize?response_type=code&client_id=[提供的clientID]&redirect_uri=[callback对应的url]&state=[您自己生成的state]
自己替换成实际的字符串就行,不用带括号
redirect_Url 指的是在助手那边鉴权成功后跳转的路由,下面以 http://localhost 为例
state 是你自己生成的,据说是用来防 CSRF 的,但我好像没看出来是怎么防的
什么老王八蛋哇,@eson
之后就跳转到统一身份认证平台
最后重定向到你的后台 URL ,并且可以看见还附带了 code 和 state 两个参数
现在你才能去请求 access_token
构造一个 GET 请求,内容如下
1https://api.hduhelp.com/oauth/token? ...
关于 go-zero 的简单上手笔记
前几天简单上手了一下 go-zero 框架,去官网看了下文档,然后网上的博客,还有 B 站的视频,还有助手的项目,有了一些了解
这东西其实就是一个全自动的 web 和 RPC 框架,你只需要关注于设计,还有你的业务代码就好了,其他的 go-zero 都能帮你搞定
这东西你首先需要定义私有格式的 api 文件,这东西能很好的定义你的服务,即使直接交给前端,前端都能看懂
1234567891011121314151617181920type ( LoginReq { Username string `json:"username"` Password string `json:"password"` } LoginReply { Id int64 `json:"id"` Name string `json:"name"` Gender string `json:"gender"` AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` ...
『Linux』Ubuntu 编辑开始菜单
事情的起因是这样的,我在 Ubuntu 22.04 上装了 Apifox,但是我没法正常启动
然后搜了一下,并且和客服确认了,只需要需要加上一个 --no-sandbox 参数
然后就可以正常启动
但是开始菜单里面的是不带这个参数的,我不可能每次都手动从命令行启动吧
然后自然就是想修改开始菜单
然后你去百度的话,都会让你使用一个加做 alacarte 的东西
不得不说,中文互联网环境真的是糟透了
但是这东西,实际上我用的时候会报错,根本没法用
后来谷歌到了一个类似的软件叫 menulibre ,这个是可以用的
直接用 apt 下载
1sudo apt install menulibre
开箱即用
然后就可以了
『随笔』面试官竟是我自己 —— 2022 杭助秋招面试工作感想
虎头蛇尾地写完了,哪里写的不好请速速敲打我
前情提要
来杭助一年了,从来没觉得自己有多大能耐
鄙人平时也没做多少事,也就是改改配置文件,天天水群,然后业务代码也没怎么动过,Golang 也还没系统地学完(事情有点小多),项目经验大头是参加的两次字节跳动青训营
但就是我这个菜鸡,今年居然去当面试官了
哈?我可以去当面试官了???
嗯?就挺突然的,一年时间居然过得这么快,我甚至都有些恍惚
我能面吗?面不了!没这个能力知道吗??我奉劝自己,务↑实↓一点!先把自己后端八股,面试的这个理念先搞懂((
但是我想,这必定是一种很新奇的体验吧,应该能收获许多,为何不去?
(事实也证明我收获颇丰,不然我也不会在写这篇博客了)
进上课啦看一眼课表,行,没毛病,干就完了!
没想到,面试官竟是我自己
大致经过
面试前一晚,群内的公告
因为考虑到大一晚自习的因素,周日又增加了下午场
9月18日:人生第一次
9月18日,星期天,上午按照安排我去参加了百团大战的摆摊,然后因为下午批的时间很赶,中午随便整了点零食吃,带上笔记本电脑就赶往 7 教了(记得去年鄙人也是在 7 教面试的)
推开教室的门,看见一堆人都已经到了,毕竟 iyear 部长说有空都可以来围观
但是我记得上一届不是这样的,我面的时候只有几位面试官
我在前排的边边坐了下来,面试即将开始,我打开我的笔记本电脑,做好面试准备
现在请允许鄙人介绍一下杭助技术部面试的大致流程,也就是你在参与本次面试的时候,你的面试官都在干什么
首先是面对面坐下,由一位面试官主持,做开场白,然后请各位依次自我介绍
随后,我们会进行提问,有对全体的提 ...
『算法拾遗』常见的位运算操作
功能
示例
位运算
去掉最后一位
1011101->10110
x >> 1
在最后加一个0
1011101->1011010
x << 1
在最后加一个1
1011101->1011011
x << 1+1
把最后一位变成1
101100->101101
x | 1
把最后一位变成0
101101->101100
x | 1-1
最后一位取反
101101->101100
x ^ 1
把从右数第k位变成1
101001->101101,k=3
x | (1 << (k-1))
把从右数第k位变成0
101101->101001,k=3
x &~ (1 << (k-1))
右边第k位取反
101001->101101,k=3
x ^ (1 << (k-1))
取末三位
1101101->101
x & 7
取末k位
1101101->1101,k=5
x & (1 << k-1)
取从右数第k位
1101101->1,k=4
x >> (k - 1) & 1
把末k位变成1
101001->101111,k=4
x | (1 << k-1)
末k位取反
101110->100110,k=4
x ^ (1 << k-1)
把右边连续的1变成0
100101111->1001 ...
『算法拾遗』深度优先搜索(3):IDA*(启发式迭代加深搜索)
IDA* ,也就是在 ID (迭代加深搜索)上使用 A* 的思想,引入一个估值函数 h(x)h(x)h(x) ,来及时剪枝,减少不必要的搜索
但其实吧,我感觉这个也没什么好讲的,这东西感觉也没什么新意,就是一个简单的剪枝,并不是像 A* 一样让更有潜力状态的更先搜索
附上一道例题
UVA1343 旋转游戏 The Rotation Game ,或者是 HDU1667
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include <bits/stdc++.h>using namespace std;// 1 2// 3 4// 5 6 7 8 9 10 11// 12 13// 14 15 16 17 18 19 20// 21 22// 23 24int board[32];int centerId[8] = {7, 8, 9, 13, 18, 17, 16, 12};int movePath[8][7] = {{1, 3, 7, 12, 16, 21, 23}, {2 ...
『算法拾遗』深度优先搜索(2):IDDFS(迭代加深搜索)
有这样一些题目,它们的搜索树很特别:不仅很深,而且很宽,深度可能到无穷,宽度也可能极广
如果直接朴素 DFS ,会陷入递归无法返回,如果直接朴素 BFS,队列空间会爆炸
鄙人想了一个简单的例子,来说明为什么需要迭代加深搜索
Why use IDDFS
假设你需要使用枚举的方式暴力破解一个用户的密码,密码只由 26 个小写字母组成,但是密码的位数未知
假设你的内存同时能存储 100 个字符,你该如何枚举?
先试试 BFS?首先把 26 个字母加入队列,目前队列中的状态是这样的
1{"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}
现在,拿出第一个状态 "a" ,枚举它能到达的状态,并且扔到队列后面
1{"b","c",&q ...
『算法拾遗』舞蹈链(Dancing Links X)与精确覆盖问题
关于精确覆盖问题
模板题目:P4929 【模板】舞蹈链(DLX)
精确覆盖问题描述起来十分简洁:
给定一个全集 UUU 和若干集合 S1,S2,S3,…,SnS_{1},S_{2},S_{3},\ldots ,S_{n}S1,S2,S3,…,Sn ,现需从中选取某些集合,不重不漏地覆盖全集 UUU
或者可以用 0-1 矩阵来表示:
UUU
1
2
3
4
5
6
7
S1S_{1}S1
0
1
0
0
0
1
0
S2S_{2}S2
0
0
0
1
1
1
0
S3S_{3}S3
0
1
1
0
0
0
1
S4S_{4}S4
1
0
0
1
0
0
1
S5S_{5}S5
1
0
0
1
0
0
0
S6S_{6}S6
0
0
1
0
1
0
1
答案是 S1S_{1}S1、S5S_{5}S5 和 S6S_{6}S6 ,你看看是不是
这种问题的通用解法是 X 算法,我稍微简化了一下过程:
首先按大小顺序依次选取每一行,目前来说也就是第一行 S1S_{1}S1
(有个剪枝优化是依次选元素最少列上的非零行,搜索会更快)
UUU
1
2
3
4
5
6
7
S1
0
1
0
0
0
1
0
S2S_{2}S2
0
0
0
1
1
1
0
S3S_{3}S3
0
1
1
0
0
0
1
S4S_{4}S4
1
0
0
1
0
0
1
S5S_{5}S5
1
0
0
1
0
0
0
S6S_{6}S6
0
0
1
0
1
0
1
然后找到非空元素的 ...
『算法拾遗』深度优先搜索(1):初尝 DFS
还是从走迷宫开始
与 BFS 不同,DFS 非常简单:每当进入一个状态,生产出第一个子状态后,直接函数递归进去,直到走到头,然后回溯回来,再尝试第二个状态
其实就是队列和栈的区别,BFS 是产生一个状态就扔到队列里,DFS 是产生一批状态,先把它们压入栈,然后取一个出来处理
而函数递归就是一种栈,所以 DFS 实际上并不需要专门声明一个栈出来
还是拿最简单的 hdu 1312 Red and Black 来说事
点击查看题目
Problem Description
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can’t move on red tiles, he can move only on black tiles.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
The input consists of multiple data sets. A data set starts with a line containing two posit ...
『算法拾遗』广度优先搜索(4):广搜的优化技巧
双端队列
简介
普通的 BFS 每一步的代价都是相同的,而双端队列是专门用来处理代价可以为 1 和 0 两种的这种特殊情况:遇到无代价的直接插队到队首,有代价的插到队尾
当然,你也可以使用优先队列,甚至是各种图遍历算法,但是我感觉解决这种问题还是使用双端队列比较简单
例题
最经典的还是 Acwing175 电路维修
点击查看题目
题目描述
达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障,导致无法启动。电路板的整体结构是一个 RRR 行 CCC 列的网格,如下图所示。
每个格点都是电线的接点,每个格子都包含一个电子元件。电子元件的主要部分是一个可旋转的、连接一条对角线上的两个接点的短电缆。在旋转之后,它就可以连接另一条对角线的两个接点。电路板左上角的接点接入直流电源,右下角的接点接入飞行车的发动装置。达达发现因为某些元件的方向不小心发生了改变,电路板可能处于断路的状态。她准备通过计算,旋转最少数量的元件,使电源与发动装置通过若干条短缆相连。不过,电路的规模实在是太大了,达达并不擅长编程,希望你能够帮她解决这个问题。
注意:只能走斜向的线段,水平和竖直线段不能走。
输入格式
输入文件包含多组测试数据。
第一行包含一个整数 TTT,表示测试数据的数目。
对于每组测试数据,第一行包含正整数 RRR 和 CCC,表示电路板的行数和列数。
之后 RRR 行,每行 CCC 个字符,字符是 / 和 \ 中的一个,表示标准件的方向。
输出格式
对于每组测试数据,在单独的一行输出 ...
『Twikoo』解决 Vercel.app 在国内被墙导致无法使用的问题
正文
最近,我发现我的评论系统加载不出来,观察了一下,发现是域名被墙了
但是解决方法也很简单——准备一个新域名,然后把这个域名指过去
首先先来到 vercel 控制台,点进去你的实例
然后找到 Setting -> Domain
之后手动添加你的域名进去
然后他会给出解析配置,你就去改你的域名解析就好了
搞定之后,访问看看
(我的这个域名本来是备用的)
最后去主题配置文件里更新这个新地址就行
2022年09月12日更
发现子域名也可以,如果你已经有一个域名的话,就没必要另外搞一个域名了(