后劲

皇后乐队1981蒙特利尔演唱会时隔多年, 重置成了imax版本, 这次终于在中国上映了, 由于错过了亲临演唱会的机会毕竟1981年我妈才刚出生, 只能早早买了票兴冲冲凑凑热闹, 只能说不愧是胶片转imax, 清晰到牙叔话筒上的唾沫都清晰可见

整场演出从牙叔坐下弹响波西米亚狂想曲的前奏开始气氛就没冷下来过, 而后就是一首首大家耳熟能详的世界名曲, 例如we will rock you, annotherone bites the dust, we are the champions, 等等, 可以说, 后半场整个过程高潮迭起, 现场已经有个哥们椅背都晃歪了…

而前半场, 我印象最深的那个点就是Love Of My Life那个女生看向牙叔的那个眼神

对我来说, 我除了那几首世界名曲之外就没有多关注过Queen的动向, 所以前半段一直都有些get不到, 但是这也给了我机会静下心来欣赏四个人在舞台上的表现, 不得不说, 就单单从我这个路人视角来看, 整场下来四个人的舞台张力真的无敌, 从动作到灯光, 烟雾效果的配合, 是能把现场观众的情绪调动起来的, 不过如果细心下来看的话, 会发现不知道什么原因, 现场有些观众会安静一些, 这个我在网上也没有找到具体的答案

造就这场神级现场的因素其实有很多, 其中一个说法看来是比较有意思的, 就是在加拿大, 皇后乐队本有两场演出, 演出前, 本片的导演曾经找过皇后乐队, 希望以电影的形式记录下这整场演唱会, 乐队也同意了, 但在之后准备演出的时候, 导演要求牙叔和乐手们在舞台上的走位, 动作, 演出服装都要精心设计, 符合编排, 但牙叔不乐意, 在舞台上当然要怎么自由怎么来呀, 于是为了跟导演对着干, 牙叔和乐手们故意用夸张的动作, 以及唱几首脱一件衣服, 直到最后只剩一条短裤(也可能只是因为舞台太热了)来表达自己无声的抗议, 而这, 也变相促成了我们看到的蒙特利尔的神级现场

在电影开始之前, 其实出过一个小插曲, 现场两个哥们似乎是因为拥挤推搡的问题吵起来了, 本来高高提起的兴趣瞬间被这事削弱大半, 其中一个哥们被现场观众制止后仍然不依不饶, 而电影马上就快开始了, 没办法只能我开吼叫两人要打出去打, 现场才安静下来. 这下观影兴致彻底泡汤了, 后面的过程中我只能努力让自己提起性子好融入现场气氛, 可惜还是失败了

不过神奇的是, 就在我准备为这次糟糕的观影体验下定论的时候, 在回学校的公车上, 刷着豆瓣回想起影院的一幕幕, 内心不由得激动起来, 似乎这时候的状态才是适合演唱会的状态, 直到回到宿舍, 写这篇文章的时候手仍然在微微抖动, 可能这就是所谓的后劲吧, 可以说这是我许多观影体验中比较新奇的一种了.

使用picgo github搭建个人免费图床

picgo下载安装

Releases · Molunerfinn/PicGo (github.com)

前置需要安装node
找到latest版本进行下载
安装时注意选择仅为我个人安装否则可能会报错

github配置

点开个人主页设置
向下滑

找到developer settings
点击personal access tokens

选择带有classic字样的tokens
点击生成
注意tokens仅在生成的时候显示一次所以最好复制下来以防备用

接下来新建一个public仓库随意命名注意不要添加readme文件可能会报错

接下来转到picgo

picgo配置

打开图床设置github
按照格式填入以下信息

仓库为我们刚才新建的仓库名字
分支填写默认分支
token为我们刚才生成的token
存储路径和自定义域名都随意
为了防止搭建图床后出现图片不显示问题这里建议使用这个链接进行CDN加速

1
https://cdn.jsdelivr.net/gh/github账户名/仓库名

全部设定好后点击确定接下来就可以愉快上传啦

常见错误排错流程

上传失败请检查网络和设置必须关闭诸如steam++dogfight360等软件
检查安装时是否选择仅为个人用户安装
是否安装node是否配置正确
重新安装picgo

hexo github报错spawn failed 解决办法

今天hexo d的时候报错spawn failed
好好好又可以水一篇博客了

办法1重置ssh密钥

在博客根目录git bash

1
ssh-keygen -C "你在github注册的邮箱地址"

在c:/user/你的用户名/.ssh/

打开id_rsa.pub里面就是密钥全部复制下来

打开github设置

点开ssh and gpg keys删除原来的key新建一个把你复制的key输入进去确认

在博客根目录git bash here

1
ssh -T [email protected]

出现successful字样就完事了

办法2删除本地.deploy_git文件夹

如题
删除之后hexo三件套就完事了

办法3好好检查自己的代理并重启电脑

pyinstaller的使用

安装

1
pip install pyinstaller

使用

1
pyinstaller -F lalala.py # 将lalala.py 打包成单一可执行文件在当前目录下

常用的参数如下

  • -F 将所有运行库等打包为单一可执行文件
  • -D 将所有文件打包为单一目录
  • –distpath 指定打包后程序存放目录
  • -n 自定义打包后程序的名字
  • –workpath 指定临时文件存放目录

selenium简单实现刷课

项目地址

Elevenlong1101/script-for-yuketang: selenium 简单实现雨课堂刷课无需配置浏览器驱动一键启用 (github.com)

登陆过程实现

由于作者太懒了直接time.sleep()手动扫码

准备工作

1
2
3
4
5
6
7
8
9
10
11
12
13
print("本脚本仅支持雨课堂平台\n")

print("牛魔雨课堂不得好死\n")

name = input("请输入您想刷的课程名称:\n")

time.sleep(2)

print("接下来请在弹出的浏览器页面中扫码登陆,登陆后等待一段时间程序会自动开始运行\n")

print("想要退出刷课只要退出浏览器窗口即可\n")

time.sleep(2)

各种输入输出方便他人进行使用

隐藏selenium特征

1
2
3
4
5
6
7
8
9
10
11
12
option = webdriver.EdgeOptions()
# 创建浏览器设置实例
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁止显示浏览器上方chrome正受自动测试软件控制字样
prefs = {'credentials_enable_service': False, 'profile.password_manager_enabled': False}
option.add_experimental_option('prefs', prefs)
option.add_argument('--disable-blink-features=AutomationControlled')
# 隐藏windows.navigator.driver参数通常为undefined 使用selenium则为true
option.add_argument('--mute-audio')
# 可选 静音启动浏览器
option.binary_location = 'selenium\edge117\msedge.exe'
# 可选 配置浏览器启动位置

创建浏览器实例

1
2
3
4
5
6
7
s = Service("selenium\msedgedriver117.exe")
driver = webdriver.Edge(service= s,options= option)
# 创建浏览器实例以及配置一下浏览器驱动位置
driver.get("https://xxxxx.yuketang.cn/web")

# 接下来开始登陆
time.sleep(10)# 给时间扫码

要注意的是以上配置浏览器启动位置和浏览器驱动位置都应该注意一下相对路径最好直接在vscode里面直接右键复制相对路径不要像我一样看了一下午如何配置浏览器驱动发现其实是相对位置写错了md我花了五个小时

找到需要刷的课程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tab_student = driver.find_element(By.ID, 'tab-student')
# 找到所有课程按钮的元素
tab_student.click()
# 点击跳转到所有课程
time.sleep(1)
# 等待加载
class_btn = driver.find_element(By.XPATH, f'//*[@id="pane-student"]//h1[contains(text(),{name})]')
# 根据开头输入的名字找到要刷的课程
class_btn.click()
# 点击进入
grade = driver.find_element(By.XPATH, '//div[@id="tab-student_school_report"]/span')
grade.click()
time.sleep(1)
# 进入课程成绩单页面

这里注意基本上所有涉及到刷新加载等操作的地方都要sleep一下或者直接隐式等待主要取决于使用者的网速如何否则会花费大量时间去排错又是一个小时md

由于在课程主页面直接开刷会出问题~~(纯纯就是垃圾某课堂网页版没写好出的bug吐槽一下上课数量多了之后课程完成状态居然不显示)~~所以多写两行跳转到成绩单页面再开始刷

开始刷课

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def study():

    lessons = driver.find_elements(By.XPATH, '//li[@class="study-unit"]')
# 找到课程列表
    for lesson in lessons:

        statistic = lesson.find_element(By.CSS_SELECTOR, 'div.complete-td span').text
# 读取课程完成状态
        if statistic == "已完成" or statistic == "已发言" or statistic == "未发言" or  statistic == "未开始":

            continue # 判断课程状态

        else:

            lesson_btn = lesson.find_element(By.CSS_SELECTOR, '.name-text')

            driver.execute_script("$(arguments[0]).click()", lesson_btn)# 点击进入课程按钮
            time.sleep(2)

            driver.switch_to.window(driver.window_handles[-1])# 切换到课程窗口

            #volume_btn = driver.find_element(By.XPATH, '//xt-icon')

            #driver.execute_script("$(arguments[0]).click()", volume_btn)# 静音播放

            finish_bar = driver.find_element(By.XPATH, '//span[@class="text"]').text

            while finish_bar != "完成度100%":

                time.sleep(5)

                finish_bar = driver.find_element(By.XPATH, '//span[@class="text"]').text# 每五秒刷新状态值

            driver.close()

            driver.switch_to.window(driver.window_handles[0])# 关闭刷课窗口并回到成绩单窗口
            driver.refresh()# 刷新窗口获得课程完成状态

            time.sleep(1)

            grade = driver.find_element(By.XPATH, '//div[@id="tab-student_school_report"]/span')

            grade.click()

            time.sleep(1)# 点击转换到成绩单窗口



            study()
           
study()

总结

刷课部分倒没什么含金量主要是各种细节很让人难受例如文件的相对路径浏览器的配置等等很让人难受整体写下来虽然磕磕绊绊但也算有了结果第一次写出来的东西也不算完美吧其实主要时间都花在解决乐色某课堂网页版的bug上了

学到了很多

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# 雨课堂刷课脚本2.0 不同思路进行重构

# 学习静音开启浏览器

# 学习切换窗口

# 学习根据文本定位

# 学习文本输入

# 学习要取相对路径不要自己写直接复制就好了驱动和浏览器路径写错selenium不会报错只会找默认路径的驱动和浏览器

# 学习导包的时候要注意路径问题写的是edge还是chrome

# 学习在哪里运行这个文件也很重要这关系到文件中需要读取的文件的相对路径能否被找到



from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.edge.service import Service

import time



# 事先声明



print("本脚本仅支持雨课堂平台\n")

print("牛魔雨课堂不得好死\n")

name = input("请输入您想刷的课程名称:\n")

time.sleep(2)

print("接下来请在弹出的浏览器页面中扫码登陆,登陆后等待一段时间程序会自动开始运行\n")

print("想要退出刷课只要退出浏览器窗口即可\n")

time.sleep(2)



# 隐藏特征



option = webdriver.EdgeOptions()

option.add_experimental_option('excludeSwitches', ['enable-automation'])

prefs = {'credentials_enable_service': False, 'profile.password_manager_enabled': False}

option.add_experimental_option('prefs', prefs)

option.add_argument('--disable-blink-features=AutomationControlled')

option.add_argument('--mute-audio')

option.binary_location = 'selenium\edge117\msedge.exe'



# 浏览器实例



s = Service("selenium\msedgedriver117.exe")

driver = webdriver.Edge(service= s,options= option)

driver.get("https://xxxxx.yuketang.cn/web")



# 开始登陆



time.sleep(10)# 给时间扫码



# 找到课程



tab_student = driver.find_element(By.ID, 'tab-student')

tab_student.click()

time.sleep(1)

class_btn = driver.find_element(By.XPATH, f'//*[@id="pane-student"]//h1[contains(text(),{name})]')

class_btn.click()



time.sleep(1)

# 点击成绩单页面



grade = driver.find_element(By.XPATH, '//div[@id="tab-student_school_report"]/span')

grade.click()

time.sleep(1)

# 刷课



def study():

    lessons = driver.find_elements(By.XPATH, '//li[@class="study-unit"]')

    for lesson in lessons:

        statistic = lesson.find_element(By.CSS_SELECTOR, 'div.complete-td span').text

        if statistic == "已完成" or statistic == "已发言" or statistic == "未发言" or  statistic == "未开始":

            continue # 判断课程状态

        else:

            lesson_btn = lesson.find_element(By.CSS_SELECTOR, '.name-text')

            driver.execute_script("$(arguments[0]).click()", lesson_btn)# 点击进入课程按钮

            time.sleep(2)



            driver.switch_to.window(driver.window_handles[-1])# 切换到课程窗口



            #volume_btn = driver.find_element(By.XPATH, '//xt-icon')

            #driver.execute_script("$(arguments[0]).click()", volume_btn)# 静音播放



            finish_bar = driver.find_element(By.XPATH, '//span[@class="text"]').text

            while finish_bar != "完成度100%":

                time.sleep(5)

                finish_bar = driver.find_element(By.XPATH, '//span[@class="text"]').text# 每五秒刷新状态值

            driver.close()

            driver.switch_to.window(driver.window_handles[0])# 关闭刷课窗口并回到成绩单窗口



            driver.refresh()# 刷新窗口获得课程完成状态

            time.sleep(1)

            grade = driver.find_element(By.XPATH, '//div[@id="tab-student_school_report"]/span')

            grade.click()

            time.sleep(1)# 点击转换到成绩单窗口



            study()



study()



time.sleep(5)

git的初级食用方法~

介绍

git是一款简单小巧的代码版本管理工具举个例子当你在进行项目开发的时候准备加入一个新的功能但是因为太菜了写出的代码疯狂报错又找不到错误的原因此时你会想如果我能像打游戏一样从上个存档点重新开始那多好啊于是git就这样出现了

git可以保存你每个版本的代码相当于对你的开发进度进行一个存档等到下次卡关的时候git可以十分方便的将你的项目回滚到你上次存档的状态而且你的每次存档都会进行记录这样就不怕代码写废而重新开始了

下载地址

https://git-scm.com/
https://git-lfs.com

基础使用流程

打开想要存放开发文件的文件夹右键git bush here 打开终端

配置用户名和邮箱

1
2
git config --global user.name 用户名
git config --global user.email 邮箱

新建仓库

这个仓库的意思就相当于你在游戏中存放存档的地方

1
git init

之后你会发现文件夹中多出来一个 .git 文件夹这就是你新建的新仓库

备份代码

准备提交命令

1
2
git add .
#将.替换成文件名可以将特定文件存入暂存区并在后续命令中提交

这个命令的意思是将所有代码放入暂存区相当于子弹上膛准备发射

1
git commit -m "备注"

这个命令就是提交全部文件
相当于按下开火键扣下扳机
在命令末尾的引号中需要添加备注表明你本次提交的内容这个备注是写给未来的自己看的所以一定要写清楚

回滚存档

1
git checkout HEAD 文件名

这个命令的意思就是读档
将上一次备份的文件进行回复

查看提交记录

1
git log

这个没什么好说的查看你每一次的提交记录

关于大文件

github上大于100m的大文件都需要使用git lfs来上传下面来介绍使用gitlfs进行上传的流程

1
2
3
4
5
6
7
8
9
git init #创建本地仓库环境 
git lfs install #安装大文件上传应用
git lfs track * #追踪要上传的大文件*表示路径下的所有文件
git add .gitattributes #添加先上传的属性文件(要先上传属性文件不然有可能失败)
git commit -m "pre" #添加属性文件上传的说明
git remote add origin https://github.com/xx/xxx.git#建立本地和Github仓库的链接
git push origin master #上传属性文件 git add * #添加要上传的大文件*表示路径下的所有文件
git commit -m "Git LFS commit" #添加大文件上传的说明
git push origin master #上传大文件

值得注意的是gitlfs安装目录需要是你安装git目录的bin文件夹

例如

1
C:\Program Files\Git\bin

git 与 github

值得注意的是以上所有的操作都是在本地完成的根本不需要联网

而github我们看看名字就会发现这玩意与git肯定有着千丝万缕的联系

实际上github就是一个代码托管平台来自世界各地的人都可以将自己的代码远程上传到github让平台帮你托管例如本博客就是部署在github上的而这一切都可以依靠git

在github上创建一个仓库后往下看本文章不涉及git与github进行ssh关联的内容

1
git remote add origin 项目地址网址

这个命令就是将本地的代码仓库同github上的仓库进行关联

1
git push -u origin 分支默认为main

这条命令可以将你本地的代码推送到github的仓库中

1
git clone 项目地址http/ssh链接

这个命令可以将github上的项目克隆到本地

Python学习笔记--数据容器

数据容器的种类

  • list 列表

    定义方式

    1
    2
    3
    name = [a ,b ,c ,...]
    空列表
    name = []

    常用操作

    • 返回元素下标索引

      使用index方法

      1
      2
      name.index()
      # 默认返回正序下标索引值
    • 查找列表中的值

      由于列表是有序的故列表中的每个元素都有属于自己的编号称为下标索引一般是正序从0开始依次递增倒序从-1开始依次递减

      例如

      1
      2
      3
      name = [a ,b ,c ,d ,e]
      正序 0 1 2 3 4
      倒序 -5 -4 -3 -2 -1

      要查找列表中的特定值只需在列表名后加上内含特定下标索引的中括号

      例如

      1
      name[number]
    • 修改列表元素

      增加元素

      使用append方法在列表末尾加入新的项
      使用extend方法一次性在列表末尾添加多个项

      1
      2
      3
      4
      5
      6
      7
      name.append()
      # 括号内填入新的元素

      name.extend()
      name.extend([1,2,3,4])
      name.extend(list)
      # 括号内填入多个元素或一个列表

      修改元素

      使用赋值语句直接赋值

      1
      name[下标索引] = 元素

      删除元素

      使用del语句删除特定元素依靠下表索引进行定位
      使用remove方法删除正序查找到的第一个匹配元素依靠元素值进行定位
      使用pop方法弹出列表末尾的元素移除并反馈元素值

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # del语句

      del name[下标索引]

      # remove方法

      name.remove()

      # 括号内填入需要删除的元素如有重复元素只删除顺序查找到的第一个元素

      name.pop()
  • turple 元组

  • set 集合

  • dic 字典

markdown语法的常用写作

标题的创建

在所选文本前添加 #有几个#号就代表这是几级标题级数越高标题越小

示例一级标题

二级标题 ##

三级标题 ###

·····

段落和换行的语法

段落语法

直接空一行就好无需对开头进行缩进~

换行语法

在句子末尾添加两个或者多个空格并回车即可实现换行~

二者区别

段落的行距比换行的行距更大

强调语法

粗体

在需要强调的文本两侧各加两个*_

例如
iloveyou

斜体

在需要强调的文本两侧各加一个*_

如需加粗并使用斜体则在需要强调的文本两侧各加三个星号或下划线

引用语法

创建一个块引用只需在段落前加入一个>

例如

Wish you soft and gental ~

如需嵌套引用可连续加入>

删除线

1
~~哈哈哈哈哈~~

哈哈哈哈哈

以上是使用markdown语法进行写作的常用操作后续操作请参见网址

https://markdown.com.cn/basic-syntax/lists.html

本文的内容旨在帮助作者快速回忆markdown语法因为作者太懒了指不定什么时候就因为断更太久把语法忘记了