洛杉矶特产

在现实生活中, 想要看到电影中那种紧张刺激的警匪追车戏码, 在我们这儿似乎只能通过各种纪录片和微综艺节目, 且常常因为各种原因打码而看得不够尽兴, 谁能想到, 大洋彼岸的洛杉矶人民已经能在实时直播中体验真人GTA的快感了.

简单来说就是在洛杉矶电视台, 可能前一秒你还在看着无趣的肥皂剧, 后一秒警匪直播追车就把电视画面掐断了. 对咱来说可能算稀罕, 但对于洛城人民, 只能说喜闻乐见.

我就不说直播画面有多刺激多惊险了, 咱们来看看后面的原因

首先就是在美国, 那里的警用无线电很大一部分都是不加密的, 也就是公众只要有相关设备, 就能得知警方的动向, 电视台也是如此, 而对于那些加密的消息, 电视台自然也在警局内有着一定的人脉. 这也就导致很多时候我们看到的警匪追逐直播戏码里, 电视台直升机总是比真正的警用直升机来得快.

其次是真实感带来的猎奇心理, 影视中的警匪追逐, 各位在荧幕上看多了难免司空见惯, 但如果告诉你屏幕上发生的猫捉老鼠就是在某地说不定就在你家附近发生的真实事件, 我想各位也一定忍不住盯着屏幕细细观察, 毕竟荧幕上播放的不是精心写好的剧本, 而是真正的生活, 没人能预测生活的走向, 因为有时生活远比戏剧更抽象.

最后, 世界上其它地方也不是没有尝试过类似形式的直播, 但带来的画面观感确远远不如洛杉矶本地特产, 原因就在于洛杉矶背靠好莱坞, 有着雄厚的影视工业实力加持, 即使直升机高高在上, 机上的摄影师也能持续稳定地产出高清晰度, 高稳定性的直播画面, 甚至在直播时还能进行简单的剪辑, 帮助观众在各种环境中看清嫌疑人的位置.

后劲

皇后乐队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 git@github.com

出现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语法,因为作者太懒了,指不定什么时候就因为断更太久把语法忘记了。。。。。。