[置顶] [实践ok]CentOS 7 使用阿里云的yum源
Unix/LinuxC技术 jackxiang 2016-8-29 19:35
[置顶] [实践OK]vim 窗口分割技巧,vnew打开实践提高速度。
Unix/LinuxC技术 jackxiang 2008-4-2 13:43
[实践OK] GO语言中Goroutine 泄露的学习,以及在Go语言中,整个 main 函数中的代码都是在主 goroutine 中执行的。主 goroutine 负责启动程序的执行,并处理后续的逻辑,所以需要用var wg sync.WaitGroup // 创建 WaitGroup,不能提前退出而确保主 goroutine 等待所有子 goroutine 完成。如果不使用这种方式,主 goroutine 可能在子 goroutine 执行之前就结束,导致某些任务未能完成。
Php/Js/Shell/Go jackxiang 2024-10-8 11:50
加密日志
FreeBSD from 14.0 Upgrading to 14.1
Unix/LinuxC技术 jackxiang 2024-8-16 09:40
1. Made sure everything was updated and did; freebsd-update fetch & freebsd-update install (nothing to do becuase I was up to date).
2. freebsd-update -r 14.1-RELEASE upgrade
3. freebsd-update install
4. shutdown -r now
5. freebsd-update install
6. shutdown -r now (maybe overkill)
7. pkg-static upgrade -f
8. freebsd-update install (nothing to do)
9. shutdown -r now
freebsd-version -kru gave me;
14.1-RELEASE
14.0-RELEASE
14.1-RELEASE
Then I did freebsd-update fetch & freebsd-update install and the system reverted back to 14.0
来自:https://forums.freebsd.org/threads/upgrading-to-14-1.93700/
实践如下:
freebsd-update fetch & freebsd-update install
[root@core ~]# sudo freebsd-update install
No updates are available to install.
Run '/usr/sbin/freebsd-update fetch' first.
[root@core ~]# uname -rasp
FreeBSD core.hatch.l.lw4.cn 14.0-RELEASE-p9 FreeBSD 14.0-RELEASE-p9 #0: Tue Aug 6 19:52:06 UTC 2024 root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64 amd64
[root@core ~]# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 14.0-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.
No updates needed to update system to 14.0-RELEASE-p9.
You have new mail in /var/mail/root
[root@core ~]# freebsd-update -r 14.1-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 14.0-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/generic kernel/generic-dbg src/src world/base world/lib32
The following components of FreeBSD do not seem to be installed:
world/base-dbg world/lib32-dbg
Does this look reasonable (y/n)? y
Fetching metadata signature for 14.1-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files...
6490....6500....6510....6520....6530....6540....6550....6560....6570....6580....6590....6600....6610....6620....6630....6640....6650....6660....6670....6680....6690....6700....6710....6720....6730....6740....6750....6760....6770....6780....6790....6800....6810....6820....6830....6840....6850....6860....6870....6880....6890....6900....6910....6920....6930....6940....6950.Timeout, server 10.10.0.1 not responding.
Freebsd升级到这一步,不想升级了,清理掉产生的内容,怎么弄?
freebsd-update rollback
rm -rf /var/db/freebsd-update/*
rm -rf /usr/freebsd-update/*
2. freebsd-update -r 14.1-RELEASE upgrade
3. freebsd-update install
4. shutdown -r now
5. freebsd-update install
6. shutdown -r now (maybe overkill)
7. pkg-static upgrade -f
8. freebsd-update install (nothing to do)
9. shutdown -r now
freebsd-version -kru gave me;
14.1-RELEASE
14.0-RELEASE
14.1-RELEASE
Then I did freebsd-update fetch & freebsd-update install and the system reverted back to 14.0
来自:https://forums.freebsd.org/threads/upgrading-to-14-1.93700/
实践如下:
freebsd-update fetch & freebsd-update install
[root@core ~]# sudo freebsd-update install
No updates are available to install.
Run '/usr/sbin/freebsd-update fetch' first.
[root@core ~]# uname -rasp
FreeBSD core.hatch.l.lw4.cn 14.0-RELEASE-p9 FreeBSD 14.0-RELEASE-p9 #0: Tue Aug 6 19:52:06 UTC 2024 root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64 amd64
[root@core ~]# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 14.0-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.
No updates needed to update system to 14.0-RELEASE-p9.
You have new mail in /var/mail/root
[root@core ~]# freebsd-update -r 14.1-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 14.0-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/generic kernel/generic-dbg src/src world/base world/lib32
The following components of FreeBSD do not seem to be installed:
world/base-dbg world/lib32-dbg
Does this look reasonable (y/n)? y
Fetching metadata signature for 14.1-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files...
6490....6500....6510....6520....6530....6540....6550....6560....6570....6580....6590....6600....6610....6620....6630....6640....6650....6660....6670....6680....6690....6700....6710....6720....6730....6740....6750....6760....6770....6780....6790....6800....6810....6820....6830....6840....6850....6860....6870....6880....6890....6900....6910....6920....6930....6940....6950.Timeout, server 10.10.0.1 not responding.
Freebsd升级到这一步,不想升级了,清理掉产生的内容,怎么弄?
freebsd-update rollback
rm -rf /var/db/freebsd-update/*
rm -rf /usr/freebsd-update/*
[实践OK]远程桌面连接linux/centos服务器时,画面突然放大,画面随光标移动
Unix/LinuxC技术 jackxiang 2024-7-4 11:18
远程桌面连接linux服务器时,画面突然放大,且画面随光标移动。
解决方法
Alt + 鼠标滑轮
Alt + 鼠标滑轮可以进行画面的放大、缩小。有的时候不注意按到键盘,可能出现这种情况。特此记录。
摘自:https://blog.csdn.net/ykwjt/article/details/127451351
macbook下面是option+鼠标滑轮(苹果鼠标二手指前后移动=远程屏幕放大缩小)
解决方法
Alt + 鼠标滑轮
Alt + 鼠标滑轮可以进行画面的放大、缩小。有的时候不注意按到键盘,可能出现这种情况。特此记录。
摘自:https://blog.csdn.net/ykwjt/article/details/127451351
macbook下面是option+鼠标滑轮(苹果鼠标二手指前后移动=远程屏幕放大缩小)
1.布局:
切换到 Side By Side Layout,这个布局,更方便操作。
界面主要包括:正则表达式、测试文本、输出结果、历史记录、Create相关面板,见上图。
2.List All:输出结果面板,显示的显示了正则表达式的匹配结果。你可以通过List All切换显示的效果,如下图所示:
可以选中List ALL Group Matches in columns显示的效果,就是上面图中的输出结果面板效果。如果,你选中了Update Automatically,则修改正则或文本内容时候,输出结果面板会实时跟着变化。
3.高亮:
点:Highlight,打开高亮。
4.Debug:
点击 Debug按钮,会自动跳到Debug面板,显示出正则表达式匹配的规则。通过该结果,你可以很直观的分析出正则匹配的过程,如下图所示:
5.一行还是多行匹配:
测试文本面板(Test标签)输入需要测试的文本内容,如:。可以选择Line By Line、Whole File、Page By Page,来指定是每行抽取,还是对整个文档抓取等(如果你的正则匹配信息有包含多行内容,务必要选中Whole File或者Page By Page)。
来自:https://jingyan.baidu.com/article/63acb44a2d9c7761fcc17ebd.html
正则工具:https://regex101.com/
切换到 Side By Side Layout,这个布局,更方便操作。
界面主要包括:正则表达式、测试文本、输出结果、历史记录、Create相关面板,见上图。
2.List All:输出结果面板,显示的显示了正则表达式的匹配结果。你可以通过List All切换显示的效果,如下图所示:
可以选中List ALL Group Matches in columns显示的效果,就是上面图中的输出结果面板效果。如果,你选中了Update Automatically,则修改正则或文本内容时候,输出结果面板会实时跟着变化。
3.高亮:
点:Highlight,打开高亮。
4.Debug:
点击 Debug按钮,会自动跳到Debug面板,显示出正则表达式匹配的规则。通过该结果,你可以很直观的分析出正则匹配的过程,如下图所示:
5.一行还是多行匹配:
测试文本面板(Test标签)输入需要测试的文本内容,如:。可以选择Line By Line、Whole File、Page By Page,来指定是每行抽取,还是对整个文档抓取等(如果你的正则匹配信息有包含多行内容,务必要选中Whole File或者Page By Page)。
来自:https://jingyan.baidu.com/article/63acb44a2d9c7761fcc17ebd.html
正则工具:https://regex101.com/
iOS 系统自带的“相机”应用无法进行删除,也就是说正常情况下不会丢失该功能。如果您无法在 iPhone 桌面上找到“相机”应用,可以从资源库中找到并移回至桌面,或检查“屏幕使用时间”设置。
1.打开资源库查找“相机”:
在 iPhone 桌面上连续向左轻扫,直至看到“应用资源库”,在资源库中找到“相机”图标,长按拖回到桌面,放置到理想的位置即可。
来自:https://g.pconline.com.cn/x/1585/15859231.html
1.打开资源库查找“相机”:
在 iPhone 桌面上连续向左轻扫,直至看到“应用资源库”,在资源库中找到“相机”图标,长按拖回到桌面,放置到理想的位置即可。
来自:https://g.pconline.com.cn/x/1585/15859231.html
[实践OK]PHP正则实现天气预报UL表格及其里面天气信息内容获取。
Php/Js/Shell/Go jackxiang 2024-6-18 15:58
捕获组与非捕获组概念:https://segmentfault.com/a/1190000021043947
文章中的工具用的正则表达式公式: https://regex101.com/
非捕获部分:(?:.*?<span title="(.*?)" .*?<\/span>)?
对天气中的温度和风力有时间只有一个温度和风力的情况的判断算法:
温度部分:
$temperature = '';
if (preg_match('/<span>(.*?)<\/span>\/<i>(.*?)<\/i>/', $matches[4], $temp_matches)) {
$temperature = $temp_matches[1] . '/' . $temp_matches[2];
} else if (preg_match('/<i>(.*?)<\/i>/', $matches[4], $temp_matches)) {
$temperature = $temp_matches[1];
}
风力部分:
问ChatGPT:我只想知道正则如何匹配到下面这段的:
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
对下面这段正则作下解释:
<p class="win">.*?<span title="(.*?)" .*?<\/span>(?:.*?<span title="(.*?)" .*?<\/span>)?
上面第一个.*?是非贪婪匹配它后面的:<span title=。
上在第二个(.*?)是匹配南风。
上在第三个.*?是非贪婪匹配它后面的:<\/span>。
是对的吧?
二、最想知道的是:
(?:.?<span title="(.?)" .?</span>)?
上在这段正则里面的:?:.? 是想干嘛的呢?
它最后的问号是用来匹配0次或1次用的,这个是这么理解吧。
ChatGPT回答如下:
你说得基本是对的。让我逐步解释一下你提到的正则表达式是如何匹配 `<p class="win">` 这段 HTML 代码的,以及 `(?:.*?<span title="(.*?)" .*?<\/span>)?` 这部分正则表达式的具体作用。
### 1. 正则表达式整体
```regex
<p class="win">.*?<span title="(.*?)" .*?<\/span>(?:.*?<span title="(.*?)" .*?<\/span>)?
```
#### 1.1. `<p class="win">.*?<span title="(.*?)" .*?<\/span>`
- `<p class="win">`: 匹配 `<p>` 标签的开头部分,class 属性为 `win`。
- `.*?`: 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- `<span title="(.*?)"`: 匹配第一个 `span` 标签,并捕获 `title` 属性的值。`(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容,这里会匹配到 `南风`。
- ` .*?<\/span>`: 非贪婪模式匹配任意字符,直到遇到 `</span>`。
这一部分的正则表达式解释如下:
- `<p class="win">` 精确匹配标签的开始部分。
- `.*?` 尽量少的匹配任意字符,直到遇到 `<span title=`。
- `<span title="(.*?)"` 匹配 `span` 标签的 `title` 属性,捕获组 `(.*?)` 非贪婪模式匹配 `title` 的内容,即 `南风`。
- ` .*?<\/span>` 匹配从 `title` 属性结束到 `</span>` 标签结束的所有字符。
#### 1.2. `(?:.*?<span title="(.*?)" .*?<\/span>)?`
- `(?: ... )`: 非捕获组,匹配括号内的内容,但不捕获它。
- `.*?`: 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- `<span title="(.*?)"`: 匹配第二个 `span` 标签,并捕获 `title` 属性的值。`(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容,这里会匹配到第二个 `南风`。
- ` .*?<\/span>`: 非贪婪模式匹配任意字符,直到遇到 `</span>`。
- `?`: 匹配前面的非捕获组 0 次或 1 次。即这部分是可选的。
这一部分的正则表达式解释如下:
- `(?: ... )` 表示一个非捕获组,不会保存匹配结果。
- `.*?` 尽量少的匹配任意字符,直到遇到 `<span title=`。
- `<span title="(.*?)"` 匹配 `span` 标签的 `title` 属性,捕获组 `(.*?)` 非贪婪模式匹配 `title` 的内容,即第二个 `南风`。
- ` .*?<\/span>` 匹配从 `title` 属性结束到 `</span>` 标签结束的所有字符。
- `?` 表示这个非捕获组是可选的,可以匹配 0 次或 1 次。
### 2. 匹配示例
以你提供的 HTML 代码为例:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
- `<p class="win">`: 匹配 `<p class="win">`。
- `.*?`: 非贪婪模式匹配任意字符,直到遇到 `<span title=`。匹配到 `\n<em>\n`。
- `<span title="(.*?)"`: 匹配 `<span title="南风"` 并捕获 `title` 属性的值 `南风`。
- ` .*?<\/span>`: 匹配 `class="S"></span>\n`。
接下来是可选部分:
- `(?:.*?<span title="(.*?)" .*?<\/span>)?`:
- `.*?`: 非贪婪模式匹配任意字符,直到遇到 `<span title=`。匹配到 `\n`。
- `<span title="(.*?)"`: 匹配 `<span title="南风"` 并捕获 `title` 属性的值 `南风`。
- ` .*?<\/span>`: 匹配 `class="S"></span>\n`。
- `?`: 表示这个部分是可选的,可以匹配 0 次或 1 次。这次匹配到 1 次。
### 总结
- `<p class="win">.*?<span title="(.*?)" .*?<\/span>`: 匹配 `<p class="win">` 开始标签,直到第一个 `span` 标签的 `title` 属性,并捕获其值。
- `(?:.*?<span title="(.*?)" .*?<\/span>)?`: 匹配从第一个 `span` 标签结束到第二个 `span` 标签结束的内容,并捕获第二个 `span` 标签的 `title` 属性,整个部分是可选的。
- `?` 表示前面的非捕获组是可选的,可以出现 0 次或 1 次。
再对正则知识点细节性问:
(?: ... ) 表示一个非捕获组,不会保存匹配结果。
上面这个是什么意思,请再接合解释下面正则:
(?:.?<span title="(.?)" .*?</span>)?
ChatGPT回答:
好的,让我们详细解释一下 `(?: ... )` 和具体的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?`。
### 非捕获组 `(?: ... )`
- `(?: ... )` 是一个**非捕获组**,它的作用是将括号内的内容进行分组,但不保存这个组的匹配结果。这和普通的捕获组 `(...)` 不同,普通捕获组会保存匹配结果供后续引用,而非捕获组则不会保存。
- 非捕获组主要用于在需要进行分组但不希望保存匹配结果的情况下,这样可以节省内存,并且在使用正则表达式时不需要担心额外的捕获组会影响捕获组编号。
### 具体的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?`
#### 分解解释
1. **`(?: ... )`**:
- 这是一个非捕获组,括号内的内容会被当作一个整体来处理,但不会保存匹配结果。
2. **`.*?`**:
- 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- 这里匹配的是从 `<p class="win">` 到第一个 `<span title="...">` 之间的任意字符,包括换行符等。
3. **`<span title="(.*?)"`**:
- 匹配 `<span title="` 字符串,并捕获 `title` 属性的值。
- `(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容。例如,`南风`。
4. **` .*?<\/span>`**:
- 非贪婪模式匹配任意字符,直到遇到 `</span>`。
- 这里匹配的是从 `title` 属性结束到 `</span>` 标签结束的所有字符。
5. **`(?: ... )?`**:
- 问号 `?` 表示前面的非捕获组是可选的,可以匹配 0 次或 1 次。
- 整个非捕获组 `(?: ... )` 是可选的,意味着可以有一个额外的 `span` 标签,或者没有。
#### 具体示例
以你的 HTML 代码为例:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
匹配过程如下:
1. **第一部分** `<p class="win">.*?<span title="(.*?)" .*?<\/span>`:
- 匹配 `<p class="win">` 开始标签。
- `.*?` 非贪婪模式匹配任意字符,直到遇到第一个 `<span title=`。
- 匹配并捕获第一个 `span` 标签的 `title` 属性值 `南风`。
- 匹配 `</span>` 标签。
2. **第二部分** `(?:.*?<span title="(.*?)" .*?<\/span>)?`:
- `(?: ... )` 非捕获组,将内容作为整体处理。
- `.*?` 非贪婪模式匹配任意字符,直到遇到第二个 `<span title=`。
- 匹配并捕获第二个 `span` 标签的 `title` 属性值 `南风`。
- 匹配 `</span>` 标签。
- `?` 表示非捕获组是可选的,可以匹配 0 次或 1 次。
### 完整正则表达式的匹配过程
完整的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?` 在匹配过程中的作用如下:
1. 从 `<p class="win">` 开始,匹配任意字符直到第一个 `<span title=`。
2. 捕获第一个 `span` 标签的 `title` 属性值。
3. 匹配 `</span>` 标签。
4. 非捕获组 `(?: ... )?` 的内容(可选):
- 匹配任意字符直到第二个 `<span title=`。
- 捕获第二个 `span` 标签的 `title` 属性值。
- 匹配 `</span>` 标签。
这段正则表达式会成功匹配以下内容,并分别捕获两个 `span` 标签的 `title` 属性值:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
结果是捕获两个 `span` 标签的 `title` 属性值 `南风` 和 `南风`。如果只有一个 `span` 标签,那么也能成功匹配,只会捕获第一个 `title` 属性值。
文章中的工具用的正则表达式公式: https://regex101.com/
非捕获部分:(?:.*?<span title="(.*?)" .*?<\/span>)?
对天气中的温度和风力有时间只有一个温度和风力的情况的判断算法:
温度部分:
$temperature = '';
if (preg_match('/<span>(.*?)<\/span>\/<i>(.*?)<\/i>/', $matches[4], $temp_matches)) {
$temperature = $temp_matches[1] . '/' . $temp_matches[2];
} else if (preg_match('/<i>(.*?)<\/i>/', $matches[4], $temp_matches)) {
$temperature = $temp_matches[1];
}
风力部分:
问ChatGPT:我只想知道正则如何匹配到下面这段的:
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
对下面这段正则作下解释:
<p class="win">.*?<span title="(.*?)" .*?<\/span>(?:.*?<span title="(.*?)" .*?<\/span>)?
上面第一个.*?是非贪婪匹配它后面的:<span title=。
上在第二个(.*?)是匹配南风。
上在第三个.*?是非贪婪匹配它后面的:<\/span>。
是对的吧?
二、最想知道的是:
(?:.?<span title="(.?)" .?</span>)?
上在这段正则里面的:?:.? 是想干嘛的呢?
它最后的问号是用来匹配0次或1次用的,这个是这么理解吧。
ChatGPT回答如下:
你说得基本是对的。让我逐步解释一下你提到的正则表达式是如何匹配 `<p class="win">` 这段 HTML 代码的,以及 `(?:.*?<span title="(.*?)" .*?<\/span>)?` 这部分正则表达式的具体作用。
### 1. 正则表达式整体
```regex
<p class="win">.*?<span title="(.*?)" .*?<\/span>(?:.*?<span title="(.*?)" .*?<\/span>)?
```
#### 1.1. `<p class="win">.*?<span title="(.*?)" .*?<\/span>`
- `<p class="win">`: 匹配 `<p>` 标签的开头部分,class 属性为 `win`。
- `.*?`: 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- `<span title="(.*?)"`: 匹配第一个 `span` 标签,并捕获 `title` 属性的值。`(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容,这里会匹配到 `南风`。
- ` .*?<\/span>`: 非贪婪模式匹配任意字符,直到遇到 `</span>`。
这一部分的正则表达式解释如下:
- `<p class="win">` 精确匹配标签的开始部分。
- `.*?` 尽量少的匹配任意字符,直到遇到 `<span title=`。
- `<span title="(.*?)"` 匹配 `span` 标签的 `title` 属性,捕获组 `(.*?)` 非贪婪模式匹配 `title` 的内容,即 `南风`。
- ` .*?<\/span>` 匹配从 `title` 属性结束到 `</span>` 标签结束的所有字符。
#### 1.2. `(?:.*?<span title="(.*?)" .*?<\/span>)?`
- `(?: ... )`: 非捕获组,匹配括号内的内容,但不捕获它。
- `.*?`: 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- `<span title="(.*?)"`: 匹配第二个 `span` 标签,并捕获 `title` 属性的值。`(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容,这里会匹配到第二个 `南风`。
- ` .*?<\/span>`: 非贪婪模式匹配任意字符,直到遇到 `</span>`。
- `?`: 匹配前面的非捕获组 0 次或 1 次。即这部分是可选的。
这一部分的正则表达式解释如下:
- `(?: ... )` 表示一个非捕获组,不会保存匹配结果。
- `.*?` 尽量少的匹配任意字符,直到遇到 `<span title=`。
- `<span title="(.*?)"` 匹配 `span` 标签的 `title` 属性,捕获组 `(.*?)` 非贪婪模式匹配 `title` 的内容,即第二个 `南风`。
- ` .*?<\/span>` 匹配从 `title` 属性结束到 `</span>` 标签结束的所有字符。
- `?` 表示这个非捕获组是可选的,可以匹配 0 次或 1 次。
### 2. 匹配示例
以你提供的 HTML 代码为例:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
- `<p class="win">`: 匹配 `<p class="win">`。
- `.*?`: 非贪婪模式匹配任意字符,直到遇到 `<span title=`。匹配到 `\n<em>\n`。
- `<span title="(.*?)"`: 匹配 `<span title="南风"` 并捕获 `title` 属性的值 `南风`。
- ` .*?<\/span>`: 匹配 `class="S"></span>\n`。
接下来是可选部分:
- `(?:.*?<span title="(.*?)" .*?<\/span>)?`:
- `.*?`: 非贪婪模式匹配任意字符,直到遇到 `<span title=`。匹配到 `\n`。
- `<span title="(.*?)"`: 匹配 `<span title="南风"` 并捕获 `title` 属性的值 `南风`。
- ` .*?<\/span>`: 匹配 `class="S"></span>\n`。
- `?`: 表示这个部分是可选的,可以匹配 0 次或 1 次。这次匹配到 1 次。
### 总结
- `<p class="win">.*?<span title="(.*?)" .*?<\/span>`: 匹配 `<p class="win">` 开始标签,直到第一个 `span` 标签的 `title` 属性,并捕获其值。
- `(?:.*?<span title="(.*?)" .*?<\/span>)?`: 匹配从第一个 `span` 标签结束到第二个 `span` 标签结束的内容,并捕获第二个 `span` 标签的 `title` 属性,整个部分是可选的。
- `?` 表示前面的非捕获组是可选的,可以出现 0 次或 1 次。
再对正则知识点细节性问:
(?: ... ) 表示一个非捕获组,不会保存匹配结果。
上面这个是什么意思,请再接合解释下面正则:
(?:.?<span title="(.?)" .*?</span>)?
ChatGPT回答:
好的,让我们详细解释一下 `(?: ... )` 和具体的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?`。
### 非捕获组 `(?: ... )`
- `(?: ... )` 是一个**非捕获组**,它的作用是将括号内的内容进行分组,但不保存这个组的匹配结果。这和普通的捕获组 `(...)` 不同,普通捕获组会保存匹配结果供后续引用,而非捕获组则不会保存。
- 非捕获组主要用于在需要进行分组但不希望保存匹配结果的情况下,这样可以节省内存,并且在使用正则表达式时不需要担心额外的捕获组会影响捕获组编号。
### 具体的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?`
#### 分解解释
1. **`(?: ... )`**:
- 这是一个非捕获组,括号内的内容会被当作一个整体来处理,但不会保存匹配结果。
2. **`.*?`**:
- 非贪婪模式匹配任意字符,尽量少的字符,直到遇到 `<span title=`。
- 这里匹配的是从 `<p class="win">` 到第一个 `<span title="...">` 之间的任意字符,包括换行符等。
3. **`<span title="(.*?)"`**:
- 匹配 `<span title="` 字符串,并捕获 `title` 属性的值。
- `(.*?)` 是一个非贪婪模式的捕获组,匹配 `title` 属性的内容。例如,`南风`。
4. **` .*?<\/span>`**:
- 非贪婪模式匹配任意字符,直到遇到 `</span>`。
- 这里匹配的是从 `title` 属性结束到 `</span>` 标签结束的所有字符。
5. **`(?: ... )?`**:
- 问号 `?` 表示前面的非捕获组是可选的,可以匹配 0 次或 1 次。
- 整个非捕获组 `(?: ... )` 是可选的,意味着可以有一个额外的 `span` 标签,或者没有。
#### 具体示例
以你的 HTML 代码为例:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
匹配过程如下:
1. **第一部分** `<p class="win">.*?<span title="(.*?)" .*?<\/span>`:
- 匹配 `<p class="win">` 开始标签。
- `.*?` 非贪婪模式匹配任意字符,直到遇到第一个 `<span title=`。
- 匹配并捕获第一个 `span` 标签的 `title` 属性值 `南风`。
- 匹配 `</span>` 标签。
2. **第二部分** `(?:.*?<span title="(.*?)" .*?<\/span>)?`:
- `(?: ... )` 非捕获组,将内容作为整体处理。
- `.*?` 非贪婪模式匹配任意字符,直到遇到第二个 `<span title=`。
- 匹配并捕获第二个 `span` 标签的 `title` 属性值 `南风`。
- 匹配 `</span>` 标签。
- `?` 表示非捕获组是可选的,可以匹配 0 次或 1 次。
### 完整正则表达式的匹配过程
完整的正则表达式 `(?:.*?<span title="(.*?)" .*?<\/span>)?` 在匹配过程中的作用如下:
1. 从 `<p class="win">` 开始,匹配任意字符直到第一个 `<span title=`。
2. 捕获第一个 `span` 标签的 `title` 属性值。
3. 匹配 `</span>` 标签。
4. 非捕获组 `(?: ... )?` 的内容(可选):
- 匹配任意字符直到第二个 `<span title=`。
- 捕获第二个 `span` 标签的 `title` 属性值。
- 匹配 `</span>` 标签。
这段正则表达式会成功匹配以下内容,并分别捕获两个 `span` 标签的 `title` 属性值:
```html
<p class="win">
<em>
<span title="南风" class="S"></span>
<span title="南风" class="S"></span>
</em>
<i><3级</i>
</p>
```
结果是捕获两个 `span` 标签的 `title` 属性值 `南风` 和 `南风`。如果只有一个 `span` 标签,那么也能成功匹配,只会捕获第一个 `title` 属性值。
[实践OK]CentOS7下面screen is very slow when it opens new window。
Unix/LinuxC技术 jackxiang 2024-4-17 17:41
除开strace外还有一款性能分析工具:
sudo yum install perf
perf record -F max -a -g -- screen -ls
perf record -F max -a -g -- screen -ls
info: Using a maximum frequency rate of 11,000 Hz
There is a screen on:
16882.abc (Detached)
1 Socket in /var/run/screen/S-root.
[ perf record: Woken up 14 times to write data ]
[ perf record: Captured and wrote 4.143 MB perf.data (34888 samples) ]
可在不同设备上读取的perf.data 文件. 您可以使用 perf 工具将性能数据记录到 perf.data 文件中,以便在不同的设备上分析。
echo Soft: $(ulimit -Sn)
echo Hard: $(ulimit -Hn)
Soft: 1024000
Hard: 1024000
立即生效的解决办法(重启配置失效):
ulimit -Sn 10000
ulimit -Hn 50000
重启后永久生效实操:
要在 CentOS 7 上永久设置 `ulimit`,您需要修改 `/etc/security/limits.conf` 文件。这个文件允许您设置系统级别的资源限制。您可以按照以下步骤进行修改:
1. 打开终端并以 root 用户身份登录。
2. 使用文本编辑器(如 `vi` 或 `nano`)打开 `/etc/security/limits.conf` 文件:
```bash
sudo vi /etc/security/limits.conf
```
3. 在文件末尾添加以下行:
```
* soft nofile 10000
* hard nofile 50000
```
这里,`soft` 代表软限制,`hard` 代表硬限制。软限制是系统允许的最大值,超过此限制时会发出警告。硬限制是系统允许的绝对最大值,超过此限制时会导致操作失败。通常情况下,软限制和硬限制是相同的。
4. 保存并关闭文件。在 vi 中,您可以按 `Esc` 键输入 `:wq` 然后按 `Enter` 保存并退出。
5. 重新启动系统或重新登录以使更改生效。
现在 `ulimit` 的设置应该在系统重新启动后生效,并且将永久保持。
fix: Normalize RLIMIT_NOFILE (LimitNOFILE) to sensible defaults:
https://github.com/moby/moby/pull/45534
gnu screen run extremely slow when using 'root' user in container since docker 23.0.1 #45380:
https://github.com/moby/moby/issues/45380
=============================================================
火焰图
on-cpu火焰图可以用于分析cpu是被哪些线程、哪些函数占用的,可以方便的找到热点代码便于后续分析优化。下面我们介绍下火焰图的生成和使用方法。
使用方法
准备FlameGraph工具。
git clone https://github.com/brendangregg/FlameGraph.git
用perf record采集CPU信息。
perf record -e cpu-clock -g ./perf_test
Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data。
用perf script工具对perf.data进行解析。
perf script -i perf.data &> perf.unfold
将perf.unfold中的符号进行折叠。
./stackcollapse-perf.pl perf.unfold &> perf.folded
最后生成svg图。
./flamegraph.pl perf.folded > perf.svg
perf.svg 用浏览器就可以打开
来自:https://github.com/moby/moby/pull/45534
sudo yum install perf
perf record -F max -a -g -- screen -ls
perf record -F max -a -g -- screen -ls
info: Using a maximum frequency rate of 11,000 Hz
There is a screen on:
16882.abc (Detached)
1 Socket in /var/run/screen/S-root.
[ perf record: Woken up 14 times to write data ]
[ perf record: Captured and wrote 4.143 MB perf.data (34888 samples) ]
可在不同设备上读取的perf.data 文件. 您可以使用 perf 工具将性能数据记录到 perf.data 文件中,以便在不同的设备上分析。
echo Soft: $(ulimit -Sn)
echo Hard: $(ulimit -Hn)
Soft: 1024000
Hard: 1024000
立即生效的解决办法(重启配置失效):
ulimit -Sn 10000
ulimit -Hn 50000
重启后永久生效实操:
要在 CentOS 7 上永久设置 `ulimit`,您需要修改 `/etc/security/limits.conf` 文件。这个文件允许您设置系统级别的资源限制。您可以按照以下步骤进行修改:
1. 打开终端并以 root 用户身份登录。
2. 使用文本编辑器(如 `vi` 或 `nano`)打开 `/etc/security/limits.conf` 文件:
```bash
sudo vi /etc/security/limits.conf
```
3. 在文件末尾添加以下行:
```
* soft nofile 10000
* hard nofile 50000
```
这里,`soft` 代表软限制,`hard` 代表硬限制。软限制是系统允许的最大值,超过此限制时会发出警告。硬限制是系统允许的绝对最大值,超过此限制时会导致操作失败。通常情况下,软限制和硬限制是相同的。
4. 保存并关闭文件。在 vi 中,您可以按 `Esc` 键输入 `:wq` 然后按 `Enter` 保存并退出。
5. 重新启动系统或重新登录以使更改生效。
现在 `ulimit` 的设置应该在系统重新启动后生效,并且将永久保持。
fix: Normalize RLIMIT_NOFILE (LimitNOFILE) to sensible defaults:
https://github.com/moby/moby/pull/45534
gnu screen run extremely slow when using 'root' user in container since docker 23.0.1 #45380:
https://github.com/moby/moby/issues/45380
=============================================================
火焰图
on-cpu火焰图可以用于分析cpu是被哪些线程、哪些函数占用的,可以方便的找到热点代码便于后续分析优化。下面我们介绍下火焰图的生成和使用方法。
使用方法
准备FlameGraph工具。
git clone https://github.com/brendangregg/FlameGraph.git
用perf record采集CPU信息。
perf record -e cpu-clock -g ./perf_test
Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data。
用perf script工具对perf.data进行解析。
perf script -i perf.data &> perf.unfold
将perf.unfold中的符号进行折叠。
./stackcollapse-perf.pl perf.unfold &> perf.folded
最后生成svg图。
./flamegraph.pl perf.folded > perf.svg
perf.svg 用浏览器就可以打开
来自:https://github.com/moby/moby/pull/45534
[实践OK]php的round函数实现将微秒转换为毫秒
Php/Js/Shell/Go jackxiang 2024-3-9 20:20
$date = microtime(true);// 返回浮点数,小数点前面是当前时间的时间戳,小数点后为当前时间的微秒
var_dump($date);
// 输出:float(1566897763.0927)
PHP的round函数用于四舍五入浮点数。它的作用是返回最接近一个数字的整数,也可以指定小数点后的位数。例如:
$float = 3.14159;
$rounded = round($float, 2); // 返回 3.14
$rounded = round($float); // 返回 3
要求:timestamp 时间戳 :"timestamp": "1709986011923" #13位的毫秒数,时间戳(精确到毫秒),当前时间5分钟内请求有效
实现:
cat sendmsg_2.php
php sendmsg_2.php
1709986816.8926 #获取当前Unix时间戳,包括微秒
1709986816893 #转换为毫秒
[实践OK]在FreeBSD上安装使用unzip
Unix/LinuxC技术 jackxiang 2023-11-16 11:21
Mac下面压缩是zip的,放FreeBSD下面怎么解压呢?
FreeBSD下面安装unzip的方法是:
pkg install -y unzip #注意:-y是安装在unzip的前面才行
二是:Port方式安装:
-->whereis unzip 查找port源
一般是/usr/ports/archivers/unzip
cd /usr/ports/archivers/unzip
make install clean
rehash ---在不重启服务器的条件使安装了的命令生效
就可以用unzip命令了 。。
然后通过ftp上传PHPWind_GBK_5[1].3.zip
用unzip PHPWind_GBK_5[1].3.zip
在服务器上解压。。
===> Options unchanged
/!\ WARNING /!\
You have security/openssl installed but do not have
DEFAULT_VERSIONS+=ssl=openssl set in your make.conf
===> License Info-ZIP accepted by the user
===> unzip-6.0_8 depends on file: /usr/local/sbin/pkg - found
=> unzip60.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://downloads.sourceforge.net/project/infozip/UnZip%206.x%20%28latest%29/UnZip%206.0/unzip60.tar.gz
===> Generating temporary packing list
install -s -m 555 /usr/ports/archivers/unzip/work/unzip60/unzip /usr/ports/archivers/unzip/work/stage/usr/local/bin
cd /usr/ports/archivers/unzip/work/unzip60 && install -s -m 555 funzip unzipsfx /usr/ports/archivers/unzip/work/stage/usr/local/bin
/bin/ln -sf unzip /usr/ports/archivers/unzip/work/stage/usr/local/bin/zipinfo
install -m 555 /usr/ports/archivers/unzip/work/unzip60/unix/zipgrep /usr/ports/archivers/unzip/work/stage/usr/local/bin
install -m 444 /usr/ports/archivers/unzip/work/unzip60/man/unzip.1 /usr/ports/archivers/unzip/work/stage/usr/local/share/man/man1
cd /usr/ports/archivers/unzip/work/unzip60/man && install -m 444 funzip.1 unzipsfx.1 zipgrep.1 zipinfo.1 /usr/ports/archivers/unzip/work/stage/usr/local/share/man/man1
cd /usr/ports/archivers/unzip/work/unzip60 && install -m 0644 README WHERE /usr/ports/archivers/unzip/work/stage/usr/local/share/doc/unzip
====> Compressing man pages (compress-man)
===> Installing for unzip-6.0_8
===> Checking if unzip is already installed
===> Registering installation for unzip-6.0_8
Installing unzip-6.0_8...
===> Cleaning for unzip-6.0_8
来自:https://dude6.com/article/182115.html
FreeBSD下面安装unzip的方法是:
pkg install -y unzip #注意:-y是安装在unzip的前面才行
二是:Port方式安装:
-->whereis unzip 查找port源
一般是/usr/ports/archivers/unzip
cd /usr/ports/archivers/unzip
make install clean
rehash ---在不重启服务器的条件使安装了的命令生效
就可以用unzip命令了 。。
然后通过ftp上传PHPWind_GBK_5[1].3.zip
用unzip PHPWind_GBK_5[1].3.zip
在服务器上解压。。
===> Options unchanged
/!\ WARNING /!\
You have security/openssl installed but do not have
DEFAULT_VERSIONS+=ssl=openssl set in your make.conf
===> License Info-ZIP accepted by the user
===> unzip-6.0_8 depends on file: /usr/local/sbin/pkg - found
=> unzip60.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://downloads.sourceforge.net/project/infozip/UnZip%206.x%20%28latest%29/UnZip%206.0/unzip60.tar.gz
===> Generating temporary packing list
install -s -m 555 /usr/ports/archivers/unzip/work/unzip60/unzip /usr/ports/archivers/unzip/work/stage/usr/local/bin
cd /usr/ports/archivers/unzip/work/unzip60 && install -s -m 555 funzip unzipsfx /usr/ports/archivers/unzip/work/stage/usr/local/bin
/bin/ln -sf unzip /usr/ports/archivers/unzip/work/stage/usr/local/bin/zipinfo
install -m 555 /usr/ports/archivers/unzip/work/unzip60/unix/zipgrep /usr/ports/archivers/unzip/work/stage/usr/local/bin
install -m 444 /usr/ports/archivers/unzip/work/unzip60/man/unzip.1 /usr/ports/archivers/unzip/work/stage/usr/local/share/man/man1
cd /usr/ports/archivers/unzip/work/unzip60/man && install -m 444 funzip.1 unzipsfx.1 zipgrep.1 zipinfo.1 /usr/ports/archivers/unzip/work/stage/usr/local/share/man/man1
cd /usr/ports/archivers/unzip/work/unzip60 && install -m 0644 README WHERE /usr/ports/archivers/unzip/work/stage/usr/local/share/doc/unzip
====> Compressing man pages (compress-man)
===> Installing for unzip-6.0_8
===> Checking if unzip is already installed
===> Registering installation for unzip-6.0_8
Installing unzip-6.0_8...
===> Cleaning for unzip-6.0_8
来自:https://dude6.com/article/182115.html
[实践OK]PHP的CURL支持302/301的跳转的代码写法和Shell下的Curl参数-L实现跳转。
Php/Js/Shell/Go jackxiang 2023-10-29 00:08
问题:
php的这段代码,不支持访问http时redirect到https,如:
访问:http://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html
307 Temporary Redirect导到:https://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html
请将该函数修改成能自动导到https并获取到相应body内容:
//发起https的get请求
function https_get($url,$timeout=120){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 跳过检查
$res = curl_exec($curl);
curl_close($curl);
return $res; //返回json对象
}
回答:
要在PHP中自动将HTTP请求重定向到HTTPS并获取响应内容,您可以使用curl来检测HTTP响应头中的重定向,然后执行相应的HTTPS请求。以下是修改后的函数示例:
function https_get($url, $timeout = 120) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 启用重定向跟随
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($httpCode == 301 || $httpCode == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $response, $matches);
$newUrl = trim(array_pop($matches));
if (!empty($newUrl)) {
curl_setopt($curl, CURLOPT_URL, $newUrl);
$response = curl_exec($curl);
}
}
curl_close($curl);
return $response;
}
$url = "http://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html";
$response = https_get($url);
echo $response;
php -a 测试是OK的。
问题二:那直接在shell下用curl命令实现上面307的Location转向获取到转向后的内容,用什么参数实现呢?我记得好像是有相应参数的。
是的,您可以使用`curl`命令行工具来获取重定向后的内容。要实现HTTP 307重定向的自动跟随,您可以使用`-L`或`--location`参数,这会让`curl`自动跟随重定向并获取最终的内容。下面是示例:
使用`-L`参数,`curl`将自动处理HTTP 307 Temporary Redirect,并获取最终的内容。
3XX response code
-L, --location
(HTTP) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make
curl redo the request on the new place. If used together with -i, --include or -I, --head, headers from all requested pages will be shown. When authentication is used, curl
only sends its credentials to the initial host. If a redirect takes curl to a different host, it will not be able to intercept the user+password. See also --location-
trusted on how to change this. You can limit the amount of redirects to follow by using the --max-redirs option.
php的这段代码,不支持访问http时redirect到https,如:
访问:http://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html
307 Temporary Redirect导到:https://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html
请将该函数修改成能自动导到https并获取到相应body内容:
//发起https的get请求
function https_get($url,$timeout=120){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 跳过检查
$res = curl_exec($curl);
curl_close($curl);
return $res; //返回json对象
}
回答:
要在PHP中自动将HTTP请求重定向到HTTPS并获取响应内容,您可以使用curl来检测HTTP响应头中的重定向,然后执行相应的HTTPS请求。以下是修改后的函数示例:
function https_get($url, $timeout = 120) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 启用重定向跟随
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($httpCode == 301 || $httpCode == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $response, $matches);
$newUrl = trim(array_pop($matches));
if (!empty($newUrl)) {
curl_setopt($curl, CURLOPT_URL, $newUrl);
$response = curl_exec($curl);
}
}
curl_close($curl);
return $response;
}
$url = "http://jtgl.beijing.gov.cn/jgj/lszt/659722/660341/index.html";
$response = https_get($url);
echo $response;
php -a 测试是OK的。
问题二:那直接在shell下用curl命令实现上面307的Location转向获取到转向后的内容,用什么参数实现呢?我记得好像是有相应参数的。
是的,您可以使用`curl`命令行工具来获取重定向后的内容。要实现HTTP 307重定向的自动跟随,您可以使用`-L`或`--location`参数,这会让`curl`自动跟随重定向并获取最终的内容。下面是示例:
使用`-L`参数,`curl`将自动处理HTTP 307 Temporary Redirect,并获取最终的内容。
3XX response code
-L, --location
(HTTP) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make
curl redo the request on the new place. If used together with -i, --include or -I, --head, headers from all requested pages will be shown. When authentication is used, curl
only sends its credentials to the initial host. If a redirect takes curl to a different host, it will not be able to intercept the user+password. See also --location-
trusted on how to change this. You can limit the amount of redirects to follow by using the --max-redirs option.
[实践OK]MacBook下面查看系统日志的步骤。
Unix/LinuxC技术 jackxiang 2023-9-26 11:30
1、命令行直接打开「控制台」应用程序:/System/Applications/Utilities/Console.app
2、手工打开「控制台」应用程序步骤:使用 Spotlight 搜索:点击屏幕右上角的放大镜图标或按下 Command + 空格键,然后在弹出的搜索栏中输入 "控制台"(Console)。
在搜索结果中,你应该会看到 "控制台" 应用程序的图标。点击它以打开应用程序。
一旦打开 "控制台" 应用程序,你将看到左侧的导航栏,其中包含不同类型的日志。你可以选择 "日志报告" 以查看系统日志文件。
==============================================================================================
崩溃报告(Crash Reports):这些报告通常包含有关应用程序或进程崩溃的信息。如果 WindowServer 或其他进程崩溃,相关信息可能会出现在这些报告中。
Spin报告(Spin Reports):Spin 报告包含关于进程的信息,可能会显示进程卡住的情况。这些报告可能提供一些线索,说明哪个进程可能导致了问题。
日志报告(Log Reports):日志报告通常包含系统和应用程序的日志信息。虽然它们不是系统日志,但可能包含有关 WindowServer 或其他进程活动的记录。
诊断报告(Diagnostics Reports):诊断报告通常是系统生成的详细报告,用于识别和解决问题。你可以查看这些报告以获取更多信息。
请打开这些报告,查看是否有与 WindowServer 或其他进程相关的信息,以便更好地了解问题的根本原因。如果你不确定如何解释报告中的信息或需要进一步的帮助,建议联系 Apple 支持或专业人员进行更详细的故障排除。感谢你的耐心和理解。
2、手工打开「控制台」应用程序步骤:使用 Spotlight 搜索:点击屏幕右上角的放大镜图标或按下 Command + 空格键,然后在弹出的搜索栏中输入 "控制台"(Console)。
在搜索结果中,你应该会看到 "控制台" 应用程序的图标。点击它以打开应用程序。
一旦打开 "控制台" 应用程序,你将看到左侧的导航栏,其中包含不同类型的日志。你可以选择 "日志报告" 以查看系统日志文件。
==============================================================================================
崩溃报告(Crash Reports):这些报告通常包含有关应用程序或进程崩溃的信息。如果 WindowServer 或其他进程崩溃,相关信息可能会出现在这些报告中。
Spin报告(Spin Reports):Spin 报告包含关于进程的信息,可能会显示进程卡住的情况。这些报告可能提供一些线索,说明哪个进程可能导致了问题。
日志报告(Log Reports):日志报告通常包含系统和应用程序的日志信息。虽然它们不是系统日志,但可能包含有关 WindowServer 或其他进程活动的记录。
诊断报告(Diagnostics Reports):诊断报告通常是系统生成的详细报告,用于识别和解决问题。你可以查看这些报告以获取更多信息。
请打开这些报告,查看是否有与 WindowServer 或其他进程相关的信息,以便更好地了解问题的根本原因。如果你不确定如何解释报告中的信息或需要进一步的帮助,建议联系 Apple 支持或专业人员进行更详细的故障排除。感谢你的耐心和理解。
系统类型:64 位操作系统, 基于 x64 的处理器
经实践发现得安装:X86的,64位的无效。
下载:vcredist_x86.exe
DownLoadURL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
微软官网下载入口:https://www.microsoft.com/zh-cn/download/details.aspx?id=26999
来自:https://zhuanlan.zhihu.com/p/651888193
经实践发现得安装:X86的,64位的无效。
下载:vcredist_x86.exe
DownLoadURL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
微软官网下载入口:https://www.microsoft.com/zh-cn/download/details.aspx?id=26999
来自:https://zhuanlan.zhihu.com/p/651888193