『杂文』在迷茫中前进
现在时间是晚上22点36分,每日一篇的技术文肯定是写不完了,就写一篇近期的个人感想吧
很烦,很累
这几天我感觉很累,真的
从周五早上开始放假,再到现在周日晚上,我想了想,我基本就没做什么正事
玩也没有好好玩,学习也没有好好学习,属于一种不在状态的样子,做什么事情都没有劲
为什么呢?我不知道,我想找回曾经的状态——有着明确的目标,且精力充沛
但是不行,即使玩游戏也没法让自己放松
周五,周六,周日,我基本都在找我感兴趣的游戏,能让我打起精神来,寻找一个目标,然后奋力前进
但是我发现,好像所有的游戏我都玩腻了
csgo,WT,缺氧,泰坦陨落2,RA3…我在我的 steam 库里寻找哪怕能让我解闷一点的游戏,但是我找不到——我感觉我都玩腻了,没意思
周五晚,我连续打了将近8个小时的文明6,玩的是老秦,从酋邦,到商人共和国,到君主制,都法西斯政体,再到后来的联合专家统治…我沉醉其中,但这个档玩到快科技胜利的时候,我又感觉玩腻了,眼睛还贼痛
然后干什么?我不知道,我知道我给自己定的规则:不管每天有多忙,不管有多少阻碍,每天至少要写一篇博客,记录下今天都学了些什么
于是,前两天水了一篇python的,一篇gin框架的,但今天,我真的提不起劲了——就是没这个劲
我知道我在空耗时间,但我就是没劲做任何事,我讨厌虚度光阴,浪费宝贵的时间,我想摆脱这种状态,但是找不出办法
重复、重复
一年中,你是真的过了365天,还是过了一天,然后重复了365次?
如果是之前,我绝对会说是365天,但是我现在真的感觉是在重复
每一天,我基本都是相同的轨迹:早上7,8点去买个包子加豆奶,中午去买份9块钱的烤冷面 ...
Python 入门笔记(七)字典(Dictionary)
初识字典
字典(Dictionary) 类似于 C++ 中的 Map ,内部都是键值对,用于创建一类对象对另一类对象的映射
但不同的是,字典中的映射类型是不固定的(键与键之间,值与值之间的类型可以不相同)
值可以取任何数据类型(甚至可以嵌套字典),但键必须是不可变的,如字符串,数字
创建字典
使用大括号 {} 创建
12personInfo = {'name': 'Tom', 'age': 18, 'hobby': ['reading', 'running', 'swimming']}print(personInfo) # {'name': 'Tom', 'age': 18, 'hobby': ['reading', 'running', 'swimming']}
技巧:写成多行
在某些场景下,写成多行能让内容更加清晰明了,例如这里统计几个人最喜欢的编程语言
123456favoriteLanguages = { 'jen': 'python', 'sarch': 'c', 'edward': 'ruby ...
Gin 入门笔记(十)Cookie 与 Session
初识 Cookie
HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie 或者 Session 实现
cookie 存储于访问者计算机的浏览器中,可以让我们用同一个浏览器访问同一个域名的时候共享数据
Cookie 能实现的简单功能:
保持用户登录状态
保存用户浏览记录
使用 Cookie
设置 Cookie
1con.SetCookie(name string, value string, maxAge int, path string, domain string, secure bool, httpOnly bool)
maxAge:过期时间
大于0,设置过期时间,单位为秒
小于0,删除本Cookie
等于0,设置为当关闭浏览器时过期
path:Cookie的路径
domain:作用域,若要在多个二级域名中使用,如a.example.com和b.example.com,则要写成.example.com
secure:为True时,仅在HTTPS中生效
httpOnly:用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改
读取 Cookie
1cookie, err := con.Cookie("name")
样例
defaultRouters.go
1234 ...
Gin 入门笔记(九)文件上传
单文件上传
定义模板
12345678<body> <h2>文件上传</h2> <form action="/admin/doUpload" method="post" enctype="multipart/form-data"> 用户名: <input type="text" name="username" placeholder="用户名"> <br> <br> 文 件:<input type="file" name="file"><br> <br> <input type="submit" value="提交"> </form></body>
注意:enctype="multipart/form-data"不能漏
添加控制器
12345678910111213141516171819func (c AdminController) DoUpload(con *gin.Context) { username := con.PostForm("username") file, err := con.FormFile( ...
『C/C++』main 函数的参数
也许你在某些地方会见到这种写法的main函数:
1234int main(int argc, char *argv[]){ ...}
其中的int argc, char *argv[]的含义是接收从命令行调用时附加的参数
其中,int argc用于统计参数的总个数,char *argv[]则依次保存这些参数
argc的值至少为1,即使你没有附加任何参数,因为arge[0]会保存着当前程序的名称或完整路径
为什么是或呢?arge[]其实保存的是这一行中的所有参数,如果当前程序是在PATH中的(或当前文件夹,Windows环境下),就可以仅凭名称调用
下面的程序能依次打印接收的参数,你可以借此学习如何使用这一机制
123456789101112#include <iostream>using namespace std;int main(int argc, char *argv[]){ int i; for (i = 0; i < argc; i++) { cout << "argument" << i << ": " << argv[i] << endl; } cout << "total argument:" << argc; return 0;}
Python 入门笔记(六)元组(Tuple)
元组(Tuple)与列表及其相似,只是元组的内容不能更改,可以认为是列表的常量版本
创建元组
使用小括号 () 将各个元素括起来即可
12tup1 = ('Google', 'Runoob', 1997, 2000)tup2 = (1, 2, 3, 4, 5 )
实际上,小括号不是必须的,最初的元组定义就是使用逗号分隔元素即可,小括号只是为了美观
1tup3 = "a", "b", "c", "d" # 不需要括号也可以
所以当元组中只包含一个元素时,必须 在元素后面添加逗号,否则括号会被当作运算符使用
1234567>>> tup1 = (50)>>> type(tup1) # 不加逗号,类型为整型<class 'int'>>>> tup1 = (50,)>>> type(tup1) # 加上逗号,类型为元组<class 'tuple'>
创建只包含一个元素的元组通常没有意义,但自动生成的元组可能只有一个元素
另外,你还可以通过 tuple() 将其他结构转换为元组
修改元组
虽然元组的内容不能更改,但是可以给元组整体重新赋值
12345dimensions = (200, 50)print(dimensions) # (200, 50)dimensions = (400, 100)print(di ...
『C/C++』关键字 inline:内联函数
之前参加竞赛时,总是会看见一些大佬的函数前面加上个inline,比如下面的快读:
12345678inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;}
问之,则曰:
“这样会运行快一点”
但是我一直都没搞懂,为什么说这样运行就会快一点
今天特地查了一下,这个inline是内联函数的标识符,那内联函数又是什么?
如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方
这样一来,优点就显而易见了:普通函数都是单独保存的,当你调用函数时,要先通过指针跳到函数的位置再运行,而内联函数直接就嵌在调用该函数的地方(类似于宏替换),省去了寻址步骤,自然更快
也许你可能会问,一个寻址要耗多少时间呢?但其实对于非常简单的函数来说(如两个int求较大值),寻址的时间占比就很大,而这种简单的函数往往又是比较常用的,一来二去,寻址时间就又被放大了
但缺点也是显而易见的:增加内存消耗,并且内联函数中不能递归调用自己
所以,只有短小简单,调用又十分频繁的函数才适合作为内 ...
Python 入门笔记(五)列表(List)
列表(List) 是 Python 中最基本的数据结构,与 C 中的数组类似
创建列表
使用中括号 [] 将各个元素括起来即可,元素类型可不相同
1234list1 = ['Google', 'Runoob', 1997, 2000]list2 = [1, 2, 3, 4, 5 ]list3 = ["a", "b", "c", "d"]list4 = ['red', 'green', 'blue', 'yellow', 'white']
访问列表中的值
索引
列表的索引和切片与字符串的一样
使用 列表[下标] 来索引单个元素
list
‘red’
‘green’
‘blue’
‘yellow’
‘white’
从前往后数
0
1
2
3
4
从后往前数
-5
-4
-3
-2
-1
1234567list = ['red', 'green', 'blue', 'yellow', 'white']print( list[0] ) # redprint( list[1] ) # greenprint( list[2] ) # blueprint( list[-1] ) # whiteprint( list[-2] ) # yellowprin ...
Gin 入门笔记(八)自定义 Model
关于 Model
如果我们的应用非常简单的话,我们可以在 Controller 里面处理常见的业务逻辑。但是如果我们 有一个功能想在多个控制器、或者多个模板里面复用 的话,那么我们就可以把公共的功能单独抽取出来作为一个模块(Model)
封装一个 Model
新建 models/tools.go,并在里面实现一个Unix时间戳转日期时间的功能
12345678910package modelsimport ( "time")func UnixToDate(timestamp int) string { t := time.Unix(int64(timestamp), 0) return t.Format("2006-01-02 15:04:05")}
调用 Model
在控制器中调用
以\controllers\admin\adminController.go为例
1234func (c AdminController) Index(con *gin.Context) { date := models.UnixToDate(1646554975) con.String(200, "转换后的日期和时间是:"+date)}
在模板文件中调用
注意顺序,注册模板函数需要在加载模板上面
main.go
123456789101112131415161718192021222324252627282930package mainimport ( "html/template&q ...
Python 入门笔记(四)字符串(String)
初识字符串
字符串就是一串字符,有短字符串(单行字符串)和长字符串(多行字符串)两种书写形式
与 C 不同,在 Python 中没有单个字符的类型,单个字符也按字符串处理
短字符串(单行字符串)
简单地使用引号括起来,单引号和双引号均可
12"This is a string"'This is also a string'
这种灵活性运允许你在字符串中包含引号和撇号,只要确保不与首尾两端的引号冲突
123'I told my friend,"Python is my favorite language!"'"The language 'Python' is name after Monty Python, not the snake.""One of Python's strengths is its fiverse and supportive community."
Tip:续行符(反斜杠\)在字符串中也可以使用,故短字符串也可以写成多行
长字符串(多行字符串)
之前介绍 Python 多行注释时提到使用三个引号(单引号、双引号都行)来包含多行注释内容,这其实是长字符串的写法
只是由于在长字符串中可以放置任何内容,如果所定义的长字符串没有赋值给任何变量,那么这个字符串就相当于被解释器忽略了,也就相当于注释掉了
实际上,使用三个引号括起来的长字符串完全可以赋值给变量
1234s = '''& ...
Gin 入门笔记(七)路由中间件
初识中间件
从最简单的模板开始
123456789101112131415package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(200, "测试页面") }) r.Run()}
在这个例子中,只有一个函数处理根目录下的路由
然而其实也可以传递多个函数,它们将被依次执行,最后一个函数前面触发的方法都可以称为中间件
中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、 记录日志、耗时统计等
1234567891011121314151617181920212223package mainimport ( "fmt" "github.com/gin-gonic/gin")func initMiddleware(ctx *gin.Context) { fmt.Println("我是一个中间件")}func main() { r := gin.Default() r.GET("/", initMiddleware, func(c *gin.Context) { c.String(200, "测试页面") }) r.Run()}
...
Python 入门笔记(三)数字(Number)
三种数
Python 支持三种不同的数值类型:
整型( int ) : 通常被称为是整型或整数,是正或负整数,不带小数点
浮点型( float ) : 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示 2.5e2
复数( complex ) : 复数由实数部分和虚数部分构成,可以用 a + bj (注意是 j ),或者 complex(a,b) 表示,a 和 b 都将以浮点型存储
相互转换
int(x) 将x转换为一个整数。
float(x) 将x转换到一个浮点数。
complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0
complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y
PS:
Python3 中的数字是没有限制大小的!
Python3 中没有 Python2 的 long 类型,整型简化成只剩一个int类型
布尔(bool) 是 int 的子类型
数中的下划线
在 Python3.6+ 中书写很大的数时,可以在任意位置加入下划线,使数字更清晰易读
1universe_age= 14_000_000_000
当然,Python 并不会把下划线也存进去
12print(universe_age)14000000000
这种方法对整数和浮点数都适用
七种运算
运算符
含义
例子
运行结果
+
加
3+1
4
-
减
40-2
38
*
乘
3*2
6
/
除
6/3
2.0
//
整除
3//2
1
**
幂
2**3
8
%
求余
7%2
...
Python 入门笔记(二)基础语法
标识符
Python 中的标识符规则与 C 中的类似,但不完全相同
标识符只能由数字、字母和下划线组成,并且开头不能是数字
标识符不能与保留字冲突
标识符对大小写敏感
在 Python3 中,汉字也可以作为标识符,但不建议使用
标识符前后的下划线有特殊含义
以单下划线开头的标识符(如 _width ),表示不能直接访问的类属性,其无法通过 from...import * 的方式导入
以双下划线开头的标识符(如 __add )表示类的私有成员
以双下划线作为开头和结尾的标识符(如 __init__ ),是专用标识符
保留字
保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字
12import keywordprint(keyword.kwlist)
输出为:
1['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except& ...
Python 入门笔记(一)搭建环境
❤️又开新坑了!!!
高中的时候学过一段时间的Python3,但是很快就忘了,究其原因还是光看不练,很快就会忘个精光
这次边学边做笔记,应该能学到很多知识
基本框架源于菜鸟教程
Python 简介
Python 是一门解释性语言,简单易学,上手容易
虽然在我的认知里在正式场合里用到 Python 的情况不多,但作为著名的胶水语言,还是有必要去学一学的
环境搭建
前往官网下载并安装 Python
再在VSCode中安装 Python 的扩展
如果你从未使用过VScode,请安装中文插件和CodeRunner,参考这篇
新建文件,就可以开始 Python 学习了,将下面的代码复制进去,按下Ctrl + Alt + N运行
1print("HelloWorld")
看,你已经成功运行了第一个 Python 程序了!
当然,作为一门解释性语言,除了写完一整个程序然后运行(脚本式),还可以一句话一句话地与编译器对话来运行(交互式)
你也可以直接运行 Python 来在命令行中进行交互式编程
Gin 入门笔记(六)自定义控制器和控制器的继承
自定义控制器
在对路由分组后,我们对控制器也可以进行分组
首先新建controllers文件夹,然后在其中按业务逻辑创建控制器
12345678910111213141516171819TEST│ go.mod│ go.sum│ main.go│├─controllers│ ├─admin│ │ adminController.go│ ││ ├─api│ │ apiController.go│ ││ └─homePage│ homePageController.go //因为default是关键字│└─routers adminRouters.go apiRouters.go defaultRouters.go
以/controllers/admin/adminController.go为例,编辑控制器
123456789101112131415161718package adminimport "github.com/gin-gonic/gin"type AdminController struct {}func (c AdminController) Index(con *gin.Context) { con.String(200, "后台首页")}func (c AdminController) User(con *gin.Context) { con.String(200, &quo ...
Java 版 Minecraft 加模组开服教程
❤️这几天宿舍4个人一起联机玩 MC 打暮色森林 Mod,特记录本次开服记录,
(因为暮色森林的新版本变化不大,最终 Boss 还没有出,还多了一堆 bug,所以决定使用1.12.2版本)
客户端准备
安装 Java 环境
前往Java官网下载并安装,或者点击此链接
客户端统一使用HMCL启动器
首先先将下载源改成官方
在游戏列表中下载安装1.12.2版本和Forge(因为我的 Java 一直没更新,所以就安了个比较旧的 Forge )
下载并安装 Mod
打开mc百科官网寻找 Mod,这里收录了大量 Mod,真的墙裂推荐
打开Mod页面,以暮色森林为例,点击Mod下载,找到需要的版本并下载,同时记一下运行环境里服务器是不是也需要装
点击文件夹图标,打开mod文件夹,复制进去即可
(另外推荐几个辅助性Mod,可以点击此链接下载)
至此,客户端配置完成,你可以点击导出整合包分享给你的小伙伴了
服务端准备
本人环境:Debian 9.9,Java 1.8.0_322
安装 Java 环境
这里图方便,建议直接apt
12sudo apt updatesudo apt install default-jdk
如果后面你发现 java 报错什么的,大概率是版本的问题,那就要去官网下了
下载 Forge
因Java的跨平台性,我选择先在本地配置好,再打包用FileZilla发送到服务器上,本步骤需保持网络通畅
前往Forge官网下载所需的版本,版本应与客户端的版本相同,页面加载不出来请看这篇
下载后,在命令行中运行,选择安装服务端,并指定安装路径(如果你 ...