0%

很早前买的Macbook Pro mid 2014, 15” Retina,硬盘只有256G,装几个大的软件,或者虚拟机装几个Linux操作系统做大数据集群实验,空间就不够了。

今天来升级一下系统,由最初的256G升级到1T。

在升级之前,我至少准备了一周的时间,做足了功课。一是因为文件都挺重要,要是弄丢了就麻烦了。还有就是把系统搞崩了,又要花大量时间去做恢复,很耽误时间。

这里面有非常多的坑,哪怕版本不正确,都会带来各种各样的问题。

我目前的系统是macOS High Sierra 10.13.6。

Boot ROM版本是162.0.0.0

老硬盘接口是PCI 2代,通道也只有2个。

准备材料

三星980硬盘

我的电脑型号是Mac Pro mid 2014, 15” Retina,硬盘接口是PCI 2代,所以比较后买的硬盘是三星980,这个是PCI 3代。有些人买三星980 Pro,PCI
4代的硬盘,其实完全是浪费了,因为主板的限制,发挥不出硬盘的性能,哪怕只是多个小几百块钱,也是没必要的浪费,再用两三年,可以换个新的整机了。

ssd连接卡

苹果使用的接口,是不能直接插入三星的ssd的。需要使用这个转接口。

其他工具

两种螺丝刀,一个是用于开盖的,一个是用于拧固定硬盘的螺丝刀的。还有一个散热器,在苹果里面应该是用不到了,如果加上的话,太厚了。

备份

使用苹果自带的Time Machine机制来备份。

首先准备一个移动硬盘。

如果移动硬盘的系统类型和苹果的不同,还要抹掉硬盘上面所有内容才可以备份。

选择备份文件的磁盘。

然后点击立即备份。

备份时间蛮长的,256G花了好几个小时。建议周五晚上开始备份,或者把一些不需要备份内容排除掉。

升级固件

我Macbook Pro的固件版本,由上面可知是162.0.0.0,必须要升级到427.0.0.0,大于427,比如429,也会出现睡眠问题,不过更新的版本,也没有尝试,所以也不知道会不会遇到其他问题。

让固定升级到427.0.0.0,我现在了解的,已经被实验成功的,必须是苹果原装硬盘,系统得是Big Sur 11.01版本。但现在官方网站上,Big Sur已经到11.6版本了。

所以不能通过App Store安装了,只能下载Big Sur 11.01的镜像来安装了。找不到这个版本镜像的可以给我留言。

等我们把固件升级好了以后,换上新硬盘,再用上面通过Time Machine备份的内容,恢复到我现在正常的High Sierra就行了。

在升级系统之前,我们可以把一些大文件先删除掉,因为已经备份过了,这样可以让升级操作系统时有足够的空间。

安装Big Sur 11.01版本,版本不要错了,因为我们只需要把固件升级到427.0.0.0。

经过大约一个小时的安装,Big Sur 11.01就安装好了。

查看固件版本,顺利升级到427.0.0.0。

换硬盘

带上手套操作,特别是夏天的时候,一定要防止手上的汗水滴污染主板。

拧螺丝的时候,一定要用力往下压,不然弄花掉了螺丝就松不开了。螺丝的位置摆放好,有两种长度的螺丝。

正常情况下,打开后盖后可以看到机器里面很多灰尘,特别是出风口附近。找来吹风和刷子,把灰尘清理干净。

然后断电,让主板和电池的接接线断开。

换一个螺丝刀,把硬盘拆下来。

拆开新硬盘,接上NVME转接口。

再插入SSD插槽。

硬盘的标签不用撕掉。

恢复

开机,同时按住 Command + Option + R,一定要有Option,之前没按Option,结果进去没找到新硬盘。

选择硬盘工具,然后选中三星980硬盘,格式化,AFPS格式,建议不选择加密,抹掉所有内容。

重新启动,按刚才的方法,选择通过时间机器恢复。把最初备份的High Sierra的系统恢复到新硬盘中。大约几个小时就搞定了。

这里我就不测试硬盘的速度了。

查看硬件信息,可以使用4条通道了。

查看了一下硬件温度,还行。

使用 Python re 模块运用正则表达式。

re.match 是从字符串的第一个字符开始比较,返回truefalse

1
2
3
4
5
6
import re
text = input('请输入你的邮箱:')
if re.match(r'[0-9a-zA-Z_]{1,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}', text):
print('这是一个邮箱')
else:
print('这不是一个邮箱')

re.search 是查找这个字符中是否包含被查找的字符串,如果有,则输出这个字条串。

1
2
3
4
5
6
7
import re
text = input('请输入你的邮箱:')
email = re.search(r'[0-9a-zA-Z_]{1,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}', text)
if email != None:
print(email.group())
else:
print('这不是一个邮箱')

当要复用某个正则表达式时,可以使用re.compile把这个正则保存下来。

1
2
3
4
5
6
import re
# 在[]集合模式中,^字符出现在第一个字符时,表示取反
pattern = re.compile(r'[a-zA-Z]*://[^\s]*')
string = '测试http://www.baidu.com 空白'
url = re.findall(pattern, string)
print(url)

之前也写过一些关于使用 Python matplotlib 画图的文章,写得都比较初级,内容繁多,有些可能根本就用不到。

根据工作中画图的经验,总结了一些最佳实践,主要涉及到一些设置方面的,商业逻辑不包含在内。此文章会一直更新。

设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 导入画图工具
import matplotlib.pyplot as plt

# 让图表直接在juypter notebook中展示出来,高版本貌似已经不需要这条语句了
# %matplotlib inline

# 解决中文乱码问题,高版本貌似不需要这条语句了
# plt.rcParams['font.sans-serif'] = 'SimHei'

# 解决负号无法显示的问题
# plt.rcParams['axes.unicode_minus'] = False

# 设置图片格式为svg矢量图,更加清晰
%config InlineBackend.figure_format = 'svg'

画布

创建画布

创建一个画布,分为两行两列。

1
fig, axes = plt.subplots(2, 2)

展示画布的时候,只需要输出fig就行了,貌似也不需要设置%matplotlib inline

1
fig

删除子图

当某个子图不需要展现时,可以使用如下语句:

删除某子图

1
2
ax = axes[0, 1]
fig.delaxes(ax)

隐藏某子图

1
ax.set_axis_off()

不遮挡布局

设置了x轴标签后,可能被下方的子图遮挡,使用如下语句可以让遮挡部分显示出来。

1
fig.tight_layout()

画图

在第0行,第0列画图。

1
axes[0, 0].plot(x, y)

设置x, y轴标签

1
2
ax.set_xlabel('时间')
ax.set_ylabel('销量')