准备工作
在飞牛nas的官网下载系统镜像
mac下的烧录工具balenaEtcher
mac电脑烧录如图

二,给N100盒子装系统
N100插上以下东西
1,u盘
2,键盘
3,鼠标(不是必须)
4,网线
5,电源线
盒子通电后,立刻按住F11进入BIOS(不同的系统按的键不一样,自己提前查好)
然后选择自己的u盘启动











acme.sh --issue --dns -d api.caiqianhua.com --yes-I-know-dns-manual-mode-enough-go-ahead-please --keylength 2048
返回如下
[Tue Nov 12 08:25:38 UTC 2024] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Tue Nov 12 08:25:38 UTC 2024] Creating domain key
[Tue Nov 12 08:25:38 UTC 2024] The domain key is here: /root/.acme.sh/api.caiqianhua.com_ecc/api.caiqianhua.com.key
[Tue Nov 12 08:25:38 UTC 2024] Single domain='api.caiqianhua.com'
[Tue Nov 12 08:25:39 UTC 2024] Getting webroot for domain='api.caiqianhua.com'
[Tue Nov 12 08:25:39 UTC 2024] Add the following TXT record:
[Tue Nov 12 08:25:39 UTC 2024] Domain: '_acme-challenge.api.caiqianhua.com'
[Tue Nov 12 08:25:39 UTC 2024] TXT value: 'QTKu-NUQBYj6EGMvF0_OYA69rjIS6au4gyaCmxau0vA'
[Tue Nov 12 08:25:39 UTC 2024] Please make sure to prepend '_acme-challenge.' to your domain
[Tue Nov 12 08:25:39 UTC 2024] so that the resulting subdomain is: _acme-challenge.api.caiqianhua.com
[Tue Nov 12 08:25:39 UTC 2024] Please add the TXT records to the domains, and re-run with --renew.
[Tue Nov 12 08:25:39 UTC 2024] Please check log file for more details: /root/.acme.sh/acme.sh.log
返回的代码中会看到如下
Domain: '_acme-challenge.api.caiqianhua.com'
TXT value: 'QTKu-NUQBYj6EGMvF0_OYA69rjIS6au4gyaCmxau0vA'
这里就需要解析域名 注意选择记录类型为txt
下面是笔者在阿里云的域名解析

acme.sh --renew -d api.caiqianhua.com --yes-I-know-dns-manual-mode-enough-go-ahead-please --keylength 2048
这里注意后缀是`–keylength 2048`

首先创建文件夹,用来存放证书
mkdir -p ~/cert/api.caiqianhua.com
acme.sh --install-cert -d api.caiqianhua.com --key-file ~/cert/api.caiqianhua.com/key.pem --fullchain-file ~/cert/api.caiqianhua.com/cert.pem --keylength 2048
这样你就可以在~/cert/api.caiqianhua.com目录中看到你的证书了
正则表达式(Regular Expression, 简称 RegEx)是一种用于匹配和处理文本的强大工具。它通过使用特殊字符和符号定义的模式,可以灵活地搜索、提取、替换和验证文本内容。以下是正则表达式的基础知识:
普通字符代表它们自身的含义,用于匹配文本中相同的字符。例如:
"hello" 匹配字符串中的 “hello”。元字符是正则表达式中的特殊字符,用于构建复杂的匹配模式。
| 元字符 | 含义 |
|---|---|
. | 匹配任意单个字符(换行符除外) |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
* | 匹配前面的字符 0 次或多次 |
+ | 匹配前面的字符 1 次或多次 |
? | 匹配前面的字符 0 次或 1 次 |
[] | 匹配括号内的任意字符(字符类) |
| | 逻辑“或”,匹配 | 左右任意一个表达式 |
() | 用于分组,提取匹配的子字符串 |
字符类用于匹配一组字符中的任意一个。字符类是放在方括号 [] 之内的内容。
[abc]:匹配 a、b 或 c 中的任意一个。[a-z]:匹配小写字母 a 到 z 中的任意一个。[0-9]:匹配数字 0 到 9 中的任意一个。[^abc]:匹配除了 a、b、c 以外的任意字符(以 ^ 开头表示非字符类)。预定义字符类是一些简化常用字符集的快捷方式:
| 符号 | 含义 |
|---|---|
\d | 匹配任意一个数字(0-9) |
\D | 匹配任意非数字字符 |
\w | 匹配字母、数字、下划线(等价于 [a-zA-Z0-9_]) |
\W | 匹配任意非字母、数字、下划线的字符 |
\s | 匹配任意空白字符(空格、制表符等) |
\S | 匹配任意非空白字符 |
量词用于指定前面的字符或子表达式应该出现的次数。
| 量词 | 含义 |
|---|---|
* | 匹配 0 次或多次 |
+ | 匹配 1 次或多次 |
? | 匹配 0 次或 1 次 |
{n} | 匹配前面的字符正好出现 n 次 |
{n,} | 匹配前面的字符至少出现 n 次 |
{n,m} | 匹配前面的字符出现 n 到 m 次 |
锚点用于锁定匹配的开始或结束位置。
^:匹配字符串的开头。$:匹配字符串的结尾。\b:匹配单词边界。\B:匹配非单词边界。使用圆括号 () 可以对表达式进行分组,方便提取和重复使用。
(abc):匹配完整的子字符串 abc。\d 匹配任意单个数字。\d{3}-\d{3}-\d{4}。[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}。元字符在需要作为普通字符使用时,可以通过加反斜杠 \ 来转义。例如:
\.:匹配实际的小数点,而不是任意字符。假设你想提取一个文本中的数字并保留两位小数,可以使用正则表达式:\d+\.\d{2}。这个表达式表示:
\d+:匹配一位或多位数字。\.:匹配小数点。\d{2}:匹配两位数字。通过这些基础规则,可以匹配并处理不同的文本模式。
test2
拉取远程文件到本地
rsync -av -e "ssh -p your_port" pi@ip:/mnt/myharddrive/audio/ audio
推送本地文件到服务器
rsync -av -e "ssh -p your_port" audio/ pi@ip:/mnt/myharddrive/audio
git diff
git diff是查看工作区修改的文件和暂存区的区别,经本人观察未追踪的文件(也就是新建还未提交过的文件)不会展示比较。
暂存前后的变化
书中是这样写的
git diff
“此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。
也就是修改之后还没有暂存起来的变化内容。”
git diff --staged
git diff –staged 是查看暂存区和最新一次提交的区别
1、去女友家拜访,到她家附近时不可以再挽着她的手,因为她的邻居会品头论足一番。2、进家后,不要对她太随便、太亲热,她的家人在观察着你的一举一动,以免给人留下不好的印象。3、不可不时看手表,否则她的家人会认为你不愿意呆在她家。4、离去时不可一踏出门就露出松懈姿态,因为背后她的家人们还在观察你。5、还应注意一点,去女友家做正式拜访的前一天,一定要洗澡,更衣,要做到干净、整洁,切不可邋里邋遢,既不尊重对方,又给人留下不好的第一印象。最重要的是全身都散发出干净的清洁感,如肩膀上有头屑最让人恶心。男人通常都是以外表取胜,因为父母的眼睛很容易往细处看:干净、整齐的头发、胡子,衬衣领口和袖口洁净,指甲修理整齐、干净,长裤笔挺,干净的袜子的鞋。初登恋人家门,就像参加一场考试,既要注意服饰仪表,又要为应答交谈作好必要的准备。这可从四个方面进行:一是稳定情绪,自信真诚恳切,落落大方,肯定受欢迎;虚伪做作,扭扭捏捏,必然被嫌弃。有了自信心,紧张的心情便会慢慢平静。二是了解情况。询问恋爱对象,了解其家庭成员,父母的职业,文化,兴趣,经历,性格等,知道越详细越好。情况熟悉,才能先有准备,交谈时也能有的放矢。三是初拟内容。想想对方会提出些什么问题。在这种场合下,未来的岳父母常会问问你的家庭,工作,爱好等,自己可做些准备。四是适当准备礼物,初次去对方家里做客,适当送些礼物给对方的父母,很有必要,这不仅表明你对长辈的尊敬,更表明你的诚意,一般来说,对方父母是会接受的,但应注意,送的礼品不宜太贵重,否则起点太高,以后恐怕你难以为继。初次见面,双方难免感到拘束。寒暄之后,常会冷场。这时就要引出话题。一种方法是就地取材。仔细观察墙壁,窗台,桌子等,墙上的名人字画,窗台上的菊花,桌上的各种小摆设,都可借来入话。因为它们往往体现了主人的情趣爱好,能使主人讲出许多愉快的话来。另一种方法是避生就熟。引出话题要避开对方感到陌生的事,从对方最熟悉的入手,可以谈谈新闻,聊聊天气。对方父母提问时,要会叙述说明,态度要恭敬,声音略低一些,柔和些。把话一句句,一层层说清楚,谈话时一定彬彬有礼。长辈夸奖年轻人时,总爱说:“这孩子很懂事!”一般长辈衡量青年好坏的标准,除了天生的外貌和本人的才能外,就看他是否“懂事”,也就是是否能通晓情理。在与对方父母交谈时,你一定要注意礼貌问题,要做到谦虚恭敬,善解人意。初登恋人家门,应忌讳四个方面:一忌油嘴猾舌。说话要朴实,说心里话,如一池清水,清澈见底;不做作,不油滑。二忌自我吹嘘。要懂得:不表示自己聪明,就是聪明;不夸张自己的美德,就是美德。三忌胆小怯羞。要明白:越怕讲错,就越会讲错话;不怕讲错,反倒会使言谈顺畅。胆小,拘谨,害羞,是初登恋人家门交谈时的大忌。四忌粗言劣语。语言必须文明,不礼貌的口头禅,习惯语等,一定要戒除。对方父母请你家宴,说明他们对你有了初步好感,你切不可得意忘形,露出“野性”。由于来做客赴宴是“醉翁之意不在酒”,切末贪杯,喝个酩酊大醉,美好姻缘可能会因你一醉方休而毁于一旦。拜见家长怎么穿不适宜:不要在未来的岳父岳母面前表现你的小个性了,艺术家那样的披肩长发啦,络腮胡子啦,各种放荡不羁啦,请收敛起来吧,这只能给你减分。夏天的凉拖短裤,冬天挂满泥的球鞋和满是褶皱的裤子,还是早点换了吧。有汗脚的男孩,也要前期做好准备,不要穿不透气的鞋子,换双新袜子,不要让破洞在换鞋后暴露出来。拜见家长怎么送礼物适宜:送礼物是个大学问,现在已经不再是水果点心的年代了。在挑选礼物的时候,要跟女友商量着来,有没有对方父母一直想买但没有机会去买的东西。送这样的礼物,会让长辈觉得这孩子很贴心。像是茶叶、羊毛披肩这样既实用又有面子的礼物,再好不过了。礼物很重要,价格也很关键。我恰恰不赞同送过于贵重的礼物,毕竟是第一次见面,太贵重的礼物会让对方父母觉得你是不是故意在显示有钱呢,又或者不懂得节俭,这样怎么能过日子呢。拜见家长怎么称呼适宜:得体的礼貌,在初次见面中很重要。可以事先问问对方父母的出生年份,决定称呼叔叔阿姨还是伯父伯母,这样比统称叔叔阿姨更得体一些。跟女方父母交流时要带“您”。拜见家长怎么聊适宜:谈话时,语速要适中。长辈问什么就答什么,如果稍微有点冷场,男孩子可以主动引起一些话题,可以从对方父母的爱好展开话题,但态度要谦虚谨慎,大方得体,不要滔滔不绝。拜见家长怎么不适宜:在具体聊天的过程中,请新人注意一些禁忌。1、如果对方父母有身体不好的,请不要聊健康。2、不要涉及对方家里的私事,比如退休工资啦,以前的单位啦。3、不要滔滔不绝,那样会让人觉得特别不稳重,爱显示自己。遇上本身低调的父母,会觉得这个小伙子有点夸夸其谈。4、不要谈及财产之类比较敏感的话题,即使你家里物质条件好,也要低调。男方第一次去女方家相关事项:1、时间——最好是一天之中的上午,千万别晚上去(当然这得看你未来的岳父母的意识)这是一般的礼节,以示尊重,并暗示你是一个勤奋之人。2、送礼——男方第一次去女方家总不能空手而去,总会想买点礼物,这是很多男孩子好面子才这样想,但是究竟要买什么也拿不定主意。这个礼物不要太多,但是一定要买。要买好看的,拿得出手的,不一定要很实用(因为在他们心理,你毕竟还是“外人”,所以一定要体面)。3、礼貌——上一辈的人对这个看得是比较重的,第一次去女方家之前,男方可以先问问你女朋友她们那里有没有什么特殊的礼节,如没有特别的,则和长辈的交往中保持谦虚的态度可谓是最大的礼节吧,进女方家门时,男方嘴口一定要甜,比如微笑的问叔叔阿姨你好,这是初次登门给人的第一印象(很关键的)。4、言谈——在女方家人面前,男孩子要面带微笑,多听少说,认真聆听老人的言谈、并及时应和,说话时大方自然,但不可以得意忘形,保持诚恳、实诚的本色,也许你有些事情还没想好,如大人们问起也许不知怎么回答,那就照实回答,比胡谄强多了,老人往往要的是感觉,也给你的女友一种姿态,你接纳她并会善待她的父母。”多谢””不客气””你们别忙乎.我来”要常挂在嘴边,多说关心的话。5、话题——避开一些双方敏感的话题,多询问一些女友小时候的事,这是每个父母百说不厌的经典话题,尤其是值得夸耀的事,可问一些细节。当他们的思维跟你转的时候,就减轻了对你的注意力,同时他们会认为你关心他们的女儿。6、衣着——男方第一见女方家长,衣服不必刻意讲究有多华丽,只要整洁、干净,就行,但不要太随便,还有就是头发一定要干净。7、神态举止——自然、轻松、愉快。最好用几句简短的话,表明你对将来的打算,并征求他们的意见。对他们的回答哪怕有异议,也点头,微笑,以后再说,不要破坏此次的气氛。做些力所能及的小事吧,也许他们不会让你做,但态度是另外一回事。8、吃饭——注意用餐礼仪。对方父母请你家宴,说明他们对你有了初步好感,你切不可得意忘形,这很有可能是一次非常近距离的接触。因为从饭局能看出一个人的许多品性和性格,孰优孰劣一目了然。切记,当你在席间满口塞满饭菜,还滔滔不绝讲话的时候,你的形象分已经被减去好多。男生,你无论多饿,还是一口口慢慢吃。不要给自己堆好一大碗饭菜,然后埋头猛往嘴巴里面填。这样的行为,会显得你很粗俗。 吃饭过程还要给家长多端茶倒水,男生要给女友夹菜,这些细节,家长都会看在眼里的。小贴士:由于来赴宴是“醉翁之意不在酒”,切莫贪杯,喝个酩酊大醉,美好姻缘可能会因你一醉方休而毁于一旦。小冰有一个老家的表哥就是因为贪杯,经不住女方家人的轮番劝酒,自己的酒量又有限,知道自己酒量有限还充面子海喝,结果喝得自己都不知道怎么回家的。没过两天,女方那边带话过来就把这门亲事给吹了。9、其他——第一次会面的时间最好不要太长,最好不要住在女方家里,有的家庭很忌讳这个,速战速决,见好就撤,以便为下次会面留下良好的期待。多注意观察,比如看见家里长了花草,就装作很感兴趣可以询问饲养花草的方法,要是看见有什么古董之类的陈设,可以赞美一番。总之就是要抓住岳父母的爱好,他会很有兴趣,觉得你是同道中人。
国内服务器厂商墙了github.com
一,获取github.com的服务器ip
我搜索了好久,终于在网上找到了可以查询多地区ping的网站 ping.sx,我们打开网站ping.sx,查询github.com的ping值

二,我们随便找复制一个ip在本地机器查看能否ping通,比如我们复制一个日本地区ping出的ip 20.27.177.113
ping 20.27.177.113
如果不能ping通,我们就换一个ip,总有能ping通的
三,修改服务器的hosts文件,hosts的目录在/etc/hosts,这里我们就需要刚才能ping通的ip地址
vim /ect/hosts
20.27.177.113 github.com
20.27.177.113 www.github.com
这样我们就设置好了。
现在是2023年8月,我本想使用如下命令安装php7,
brew install php@7.4
但发现brew官方已经不支持

如果你本地没有安装过其他版本的php,命令如下
brew tap shivammathur/php
brew install shivammathur/php/php@7.4
brew link php@7.4
如果你之前安装过其他版本的php,需要先unlink一下,比如我的本地安装了php@8.1
brew unlink php@8.1
brew link php@7.4
brew install brew-php-switcher
安装玩第二步以后基本可以实现了,也可安装这个brew-php-switcher包来切换php的版本
具体用法如下

切换的前提是你已经安装了多个版本的php
brew-php-switcher 7.4 -s
brew-php-switcher 8.1 -s
在微信小程序中,App.onLaunch 和 Page.onLoad 是两个生命周期方法。App.onLaunch 是当小程序启动时触发的方法,而 Page.onLoad 是当页面加载时触发的方法。因为 App.onLaunch 和 Page.onLoad 是异步执行的,有时 Page.onLoad 会在 App.onLaunch 完成之前执行。这可能导致页面在获取用户信息之前就已经加载完成。
this.userInfoReadyCallback 是一种解决方案,用于处理这种情况。它是一个回调函数,用于在全局数据(例如用户信息)准备就绪时通知页面。
原理如下:
App.onLaunch 方法中,你会尝试获取用户信息并将其存储到全局变量 globalData.userInfo 中。wx.getUserInfo 是一个网络请求,它可能在 Page.onLoad 之后才返回。因此,在 App.onLaunch 中,你可以检查是否已经定义了 this.userInfoReadyCallback。如果已经定义了,说明页面已经加载完毕,并且需要在用户信息准备就绪时接收通知。Page.onLoad 方法中,你可以检查全局变量 globalData.userInfo 是否已经存在。如果不存在,说明用户信息还未准备就绪,此时你可以定义 this.userInfoReadyCallback 并将其设置为一个处理用户信息的函数。这样,当用户信息准备就绪时,App.onLaunch 方法会调用 this.userInfoReadyCallback,从而通知页面并处理用户信息。这种方法确保了页面在处理用户信息时,不会因为数据未准备就绪而出现错误。
小程序默认的app.js
// app.js
App({
onLaunch: function () {
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
如果想确保在page页面能获取用户信息,需要判断`app.globalData.userInfo`是否存在,不存在的话调用app.userInfoReadyCallback
// pages/somePage/somePage.js
Page({
data: {
userInfo: null
},
onLoad: function () {
// 获取全局 App 实例
const app = getApp();
// 检查全局数据 globalData.userInfo 是否已经存在
if (app.globalData.userInfo) {
// 用户信息已经存在,可以直接在页面中使用
this.setData({
userInfo: app.globalData.userInfo
});
} else {
// 用户信息不存在,定义一个处理用户信息的函数
app.userInfoReadyCallback = (res) => {
this.setData({
userInfo: res.data.data
});
};
}
},
// 其他页面方法...
});