Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

  • centos 7 安装前置依赖
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sudo yum install git python-devel libffi-devel graphviz-devel elfutils-libelf-devel \
  readline-devel libedit-devel libxml2-devel protobuf-devel gtext-devel doxygen swig
sudo yum install -y centos-release-scl scl-utils-build
sudo yum install -y devtoolset-9 
source /opt/rh/devtoolset-9/enable
export CC=/opt/rh/devtoolset-9/root/bin/gcc
export CXX=/opt/rh/devtoolset-9/root/bin/g++

wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0.tar.gz
tar xzvf cmake-3.20.0.tar.gz
cd cmake-3.20.0
./bootstrap --prefix=/usr/local
make -j8
sudo make install
  • ubuntu 18.04+ 安装前置依赖
1
2
sudo apt install git build-essential cmake python3-dev libncurses5-dev libxml2-dev \
  libedit-dev swig doxygen graphviz xz-utils
  • 下载&编译
1
2
3
4
5
6
git clone [email protected]:llvm/llvm-project.git -b release/11.x
cd llvm-project && mkdir build && cd build
cmake -G "Unix Makefiles" ../llvm -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
  -DLLVM_ENABLE_PROJECTS="clang;" -DLLVM_TARGETS_TO_BUILD="AArch64;X86;"
make -j8
sudo make install

如果只要编译clang,在cmake命令添加定义 -DLLVM_ENABLE_PROJECTS=clang; LLVM_ENABLE_PROJECTS可用的项目有 clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl

linux和windows需要同时启用UTC,或者linux单独禁用UTC

修改Linux时区为UTC

1
2
sudo mv /etc/localtime  /etc/localtime.bak
sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime

使用 ntpdate 更新系统时间

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ubuntu 
sudo apt install ntpdate ntp -y
sudo timedatectl set-timezone UTC
sudo ntpdate -u time.windows.com
sudo hwclock --systohc # 写入硬件
# 启动ntpd服务
sudo systemctl enable ntp # ubuntu
sudo systemctl start ntp

# centos
sudo yum install ntpdate ntp -y # centos
sudo timedatectl set-timezone UTC
sudo ntpdate -u time.windows.com
sudo hwclock --systohc # 写入硬件
# 启动ntpd服务
sudo systemctl enable ntpd # centos
sudo systemctl start ntpd

Linux禁用UTC

1
2
sudo timedatectl set-local-rtc 1
sudo hwclock --localtime --systohc

windows启用UTC

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

linux和windows需要同时启用UTC,或者linux单独禁用UTC

修改Linux时区为UTC

1
2
sudo mv /etc/localtime  /etc/localtime.bak
sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime

使用 ntpdate 更新系统时间

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ubuntu 
sudo apt install ntpdate ntp -y
sudo timedatectl set-timezone UTC
sudo ntpdate -u time.windows.com
sudo hwclock --systohc # 写入硬件
# 启动ntpd服务
sudo systemctl enable ntp # ubuntu
sudo systemctl start ntp

# centos
sudo yum install ntpdate ntp -y # centos
sudo timedatectl set-timezone UTC
sudo ntpdate -u time.windows.com
sudo hwclock --systohc # 写入硬件
# 启动ntpd服务
sudo systemctl enable ntpd # centos
sudo systemctl start ntpd

Linux禁用UTC

1
2
sudo timedatectl set-local-rtc 1
sudo hwclock --localtime --systohc

windows启用UTC

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

对于点击 <a target='_blank'> 标签打开新 tab 页的场景,Puppeteer目前(2019-03,v1.13.0)没有现成的 API 支持。因此需要一些 walkaround 来解决。有几个方案。

提取 href,手动打开新 page 去访问

1
2
3
4
url = await page.evaluate('() => $("a").attr("href")')
detail_page = await browser.newPage()
# goto 带了 waitForNavigation 的作用
await detail_page.goto(detail_page_url)

使用点击,再去轮徇 pages

代码如下。这个方案的问题在于,拿到 detail_page 时并不知道页面是否 load 完成了,在这个时候调用 .waitForNavigation() 可能会超时报错(因为没有 load 事件被 fire)。如果页面有 AJAX 请求,你可能需要写额外的 waitForSelector 来确保你要的数据已经在页面上。

使用VSCode进行查找、替换时,经常需要用到正则表达式,一段时间不用就忘了,每次要用的时候都要耽误很多时间去查找,所以整理了一份很全的放在这里。这个其实是.NET使用的正则表达式,VSCode也是一样的,微软系的产品(比如Visual Studio等)应该都是使用这个标准的。

凡有名者,皆为左值

1. 什么是左值、右值

首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边

英文:Fsf,翻译:Linux中国/robot527 原始地址

• break — 在指定的行或函数处设置断点,缩写为 b
• info breakpoints — 打印未删除的所有断点,观察点和捕获点的列表,缩写为 i b
• disable — 禁用断点,缩写为 dis
• enable — 启用断点
• clear — 清除指定行或函数处的断点
• delete — 删除断点,缩写为 d
• tbreak — 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
• watch — 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行
• step — 单步跟踪,如果有函数调用,会进入该函数,缩写为 s
• reverse-step — 反向单步跟踪,如果有函数调用,会进入该函数
• next — 单步跟踪,如果有函数调用,不会进入该函数,缩写为 n
• reverse-next — 反向单步跟踪,如果有函数调用,不会进入该函数
• return — 使选定的栈帧返回到其调用者
• finish — 执行直到选择的栈帧返回,缩写为 fin
• until — 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用),缩写为 u
• continue — 恢复程序执行,缩写为 c
• print — 打印表达式 EXP 的值,缩写为 p
• x — 查看内存
• display — 每次程序停止时打印表达式 EXP 的值(自动显示)
• info display — 打印早先设置为自动显示的表达式列表
• disable display — 禁用自动显示
• enable display — 启用自动显示
• undisplay — 删除自动显示项
• help — 打印命令列表(带参数时查找命令的帮助),缩写为 h
• attach — 挂接到已在运行的进程来调试
• run — 启动被调试的程序,缩写为 r
• backtrace — 查看程序调用栈的信息,缩写为 bt
• ptype — 打印类型 TYPE 的定义

break

使用 break 命令(缩写 b)来设置断点。

说明

MiniDumper(LPCTSTR DumpFileNamePrefix)

MiniDumper(LPCTSTR DumpFileNamePrefix, LPCTSTR CmdLine, LPCTSTR ExeNameToReboot /* = NULL */)

DumpFileNamePrefix 崩溃文件名前缀

CmdLine 生成崩溃文件后执行命令(包含参数)

ExeNameToReboot 生成崩溃文件后执行指定程序

使用示例

在崩溃时调用指定的程序,下面的示例是调用CrashReport.exe上传到指定的服务器

其实很早就知道两个函数其中有一个在面临内存覆盖时行为有点特别, 但是工作中很少用到此场景, 也就没有深究. 现在居然面试遇到了, 那就把研究清楚吧.

  • memcpy 简单粗暴, 不考虑内存重叠问题. 后果程序员自负
  • memmove 比memcpy多了层检查内存重叠的考虑,如果发现重叠, 则反向拷贝, 性能和memcpy基本一样. 就是多了个检查是否重叠的代码.

综上所述, 以后干脆就用memmove吧. 省的那么多事. 反正性能几乎没有损失.