软件技巧



提取IOS IPA

需要利用Mac上的App Configurator应用。
USB连接手机,在App Configurator上点“添加”选择App:

然后登录你的apple id,会展示你购买的记录:

选择一个点添加,就会启动下载。
当下载完毕后会进行安装,如果你的设备上已经有该app了,会提示:

注意,保持这个界面不动,因为下载时会先缓存到一个目录里,等安装完毕就会删除。所以我们需要让这个界面保持,然后去下列路径里:

1
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets

就能看到导出后的IPA了:

注意,这个ipa是加壳的版本。

制作VS的offline installer

首先下载vs_setup.exe,可以在VS的官网下载。

然后执行:

1
vs_community.exe --layout OUTPUT_DIR --lang en-US --config vs.vsconfig

就会把-config中指定的所有组件都下载到Output目录里。可以把它压缩后传递到其他的机器上去。

离线安装:
解压后在根目录下启动cmd,执行下列命令:

1
vs_setup.exe --noweb

docx转换为md

可以使用pandoc实现:

1
pandoc test.docx -o test.md

但是它使用的是pandoc的格式,与通用的markdown存在不兼容。
可以通过--write gfm来指定github风格的markdown,但如果docx里对图片有缩方,都会转换为html的img标签。

可以通过与以下python脚本组合使用:

1
2
3
4
5
6
7
8
9
10
import panflute as pf

def change_md_link(elem, doc):
if isinstance(elem, pf.Image):
elem.attributes.pop('width', None)
elem.attributes.pop('height', None)
return elem

if __name__ == "__main__":
pf.run_filter(change_md_link)

使用方法:

1
pandoc test.docx -F remove_img_size.py -o test.md

我的每周技术点总结,批量从docx转换md的命令:

1
find . -name "*docx" | sed -e 's|^\./||' -e 's/\技术点_lipengzha.docx$//' | xargs -I {} pandoc --extract-media=./docx_images/{} {}技术点_lipengzha.docx -F remove_img_size.py -o {}_技术点.md

Chrome开启新的WebUI

访问chrome://flags/,搜索Chrome Refresh,把以下两个选项都改成Enable即可:

Mac安装7z

可以通过homebrew安装:

1
2
brew update
brew install p7zip

Proxifier注册码

L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C(Portable Edition)#免安装版本
5EZ8G-C3WL5-B56YG-SCXM9-6QZAP(Standard Edition)#安装版本
P427L-9Y552-5433E-8DSR3-58Z68(MAC)

获取双反斜杠的路径

把当前路径从\替换为\\,cmd代码:

1
2
set final_path=%~dp0
set final_path=%final_path:\=\\%

cmd添加开机自启

1
2
3
4
5
6
7
8
9
10
11
@echo off
echo Windows Registry Editor Version 5.00 > AutoRun.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] >> AutoRun.reg
set final_path=%~dp0
set final_path=%final_path:\=\\%
set exe_name=SwarmAgent.exe
echo "SwarmAgent"="%final_path%%exe_name%" >> AutoRun.reg

regedit /s %~dp0AutoRun.reg
del /s %~dp0AutoRun.reg

cmd遍历拷贝文件

1
2
3
4
5
6
7
8
9
10
11
12
@echo off

set platform=IOS
set target_path=%WORKSPACE%\Client\Saved\HotPatcher\HPL\%platform%
set copy_target_path=%WORKSPACE%\BuildScript\UploadPakScript\fmgame
set format=*.pak

cd %target_path%
for /f "delims=" %%s in ('dir /b/a-d/s "%target_path%"\"%format%"') do (
echo %%s
copy /y "%%s" %copy_target_path%
)

查看cmd命令的路径

1
where git

Win批量修改文件后缀

1
ren *.txt *.log

android偏移转符号

可以使用NDK中的addr2line命令:addr2line

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Usage: addr2line [option(s)] [addr(s)]
Convert addresses into line number/file name pairs.
If no addresses are specified on the command line, they will be read from stdin
The options are:
@<file> Read options from <file>
-a --addresses Show addresses
-b --target=<bfdname> Set the binary file format
-e --exe=<executable> Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section=<name> Read section-relative offsets instead of addresses
-p --pretty-print Make the output easier to read for humans
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-h --help Display this information
-v --version Display the program's version

addr2line: supported targets: pe-x86-64 pei-x86-64 pe-bigobj-x86-64 elf64-x86-64 elf64-l1om elf64-k1om pe-i386 pei-i386 elf32-i386 elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
Report bugs to <http://www.sourceware.org/bugzilla/>

具体使用案例:

1
2
# addr2line -C -f -e *.so ADDR
addr2line -C -f -e libUE4.so 0x816EF90

参数:

  • -C -f:打印错误行数所在的函数名称
  • -e 打印错误地址对应的路径及行数

转换结果:

keytool乱码

在Win10+执行keytool的时候如果出现乱码,则需要在命令行中执行:

1
chcp 936

然后重新执行keytool命令即可。

Google Translate API

可以用以下形式调用:

1
POST https://translation.googleapis.com/language/translate/v2?key=XXXXXXXXXXXXXXXXXXXXXXXX

传递json数组:

1
2
3
4
5
6
7
8
9
{
"q": [
"测试",
"函数",
"人生"
],
"source": "zh-Hans",
"target": "en"
}

IOS beta更新

以下链接注册:Apple Beta Software Program

ffmpeg

mkv转mp4

1
ffmpeg.exe -i UOD2022.mkv -vcodec copy -acodec copy UOD2022.mp4

时长裁剪

裁剪原视频的00:00:03-00:58:29之间的内容。

1
ffmpeg.exe -i UOD2022.mp4 -vcodec copy -acodec copy -ss 00:00:03 -to 00:58:29 UOD2022_CUT.mp4

mov转换为mp4

1
ffmpeg -i input.mov -q:v 0 output.mp4

拼接mp4

要把mp4转换为ts之后再进行拼接:

1
2
3
4
ffmpeg -i begin.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts begin.ts
ffmpeg -i end.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts end.ts
// now join
ffmpeg -i "concat:begin.ts|end.ts" -c copy -bsf:a aac_adtstoasc output.mp4

从视频中提取声音

1
ffmpeg -i test.mp4 -f mp3 -vn test.mp3

分割声音

  • segment_time: 秒数
1
ffmpeg -i test.mp3 -f segment -segment_time 30 -write_xing 0 -c copy out%03d.mp3

Mac上安装cmake到PATH

  1. One may add CMake to the PATH:(重启失效)

PATH="/Applications/CMake.app/Contents/bin":"$PATH"

  1. Or, to install symlinks to ‘/usr/local/bin’, run:

sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install

  1. Or, to install symlinks to another directory, run:

sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install=/path/to/bin

js不引入库转换时间格式

1
new Date().toISOString().split('.')[0].replace(/[^\d]/gi,'');

得到的是以下格式的时间:20221020021706

Typore+PicGo时间戳重命名

在Typora的验证图片上传选项中,找到PicGo的安装路径。
在exe目录下执行以下命令,安装super-prefix插件:

1
picgo.exe install super-prefix

然后修改PicGo的配置文件,可以指定重命名前缀和文件格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"picBed": {
"current": "tcyun",
"tcyun": {
"appId": "",
"area": "",
"bucket": "",
"customUrl": "",
"path": "",
"secretId": "",
"secretKey": "",
"version": "v5"
}
},
"picgoPlugins": {
"picgo-plugin-super-prefix": true
},
"picgo-plugin-super-prefix": {
"prefixFormat": "YYYY/MM/DD/",
"fileFormat": "YYYYMMDDHHmmss"
}
}

curl触发Github Actions

首先需要在action的yml中添加一个repository_dispatch

1
2
3
on:
repository_dispatch:
branches: [ master ]

curl的触发API:

1
2
3
4
5
6
curl \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer TOUR_GITHUB_TOKEN" \
https://api.github.com/repos/OWNER/REPO/dispatches \
--data-raw '{"event_type":"repository_dispatch","client_payload":{"unit":false,"integration":true}}'

官方文档:Create a repository dispatch event

使用Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests

def RunAction(REPO,TOKEN,PARAMS_PAYLOAD=""):
url = "https://api.github.com/repos/%s/dispatches" % REPO

payload = ""
if PARAMS_PAYLOAD == "":
payload = "{\"event_type\":\"Deploy\"}"
else:
payload = "{\"event_type\":\"Deploy\",%s}" % PARAMS_PAYLOAD
headers = {
'Accept': 'application/vnd.github+json',
'Authorization': 'Bearer %s' % TOKEN,
'Content-Type': 'text/plain'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

RunAction("unrealCommunity/ue5wiki_source","xxxxxxxxxxxxxxxxxxx")

Google Docs函数

获取页面中的og:title属性:

1
IMPORTXML(post_link, "//meta[@property='og:title']/@content")

替换字符串:

1
SUBSTITUTE("xxxx - 博客园","- 博客园",""))

获取页面中的title命名:

1
IMPORTXML(post_link, "//title")

检查值是否是NaN:

1
IFNA(Value,"")

检查值是否是Error,若是用空字符替代:

1
IFERROR(Value,"")

Google翻译:

1
=IFERROR(GOOGLETRANSLATE(G2,"zh-hans","en"),"")

提取链接中的文章标题:

1
=IFERROR(SUBSTITUTE(IFNA(IMPORTXML(post_link, "//meta[@property='og:title']/@content"),IMPORTXML(post_link, "//title")),"- 博客园",""),"")

从Google Docs下载文件

安装并使用Pandaspython -m pip install pandas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd

def build_sheet_url(doc_id, sheet_id):
return f'https://docs.google.com/spreadsheets/d/{doc_id}/export?format=csv&gid={sheet_id}'

def write_df_to_local(df, file_path):
df.to_csv(file_path)

doc_id = 'DOC_ID'
sheet_id = 'SHEET_ID'
sheet_url = build_sheet_url(doc_id, sheet_id)
df = pd.read_csv(sheet_url)
file_path = 'FILE_PATH'
write_df_to_local(df, file_path)

启用ProjFS

1
Enable-WindowsOptionalFeature -Online -FeatureName Client-ProjFS -NoRestart

查看二进制是否支持SSE指令

可以使用dumpbin检查:

1
dumpbin /disasm required.exe > required_disasm.asm

查看输出的汇编指令中是否包含SSE/SSE2指令, 如movss, xmm0 or xmm1

Chrome禁用缓存

  1. F12或右键选择 检查 后打开开发者工具:
  2. 选择更多工具(More tools)->网络限制(Network conditions,
  3. 在界面中勾选“Disable cache”选项:

Win上查看PE的符号信息

在Unix环境中可以使用nm查看二进制文件的符号信息,但在Win上对于查看PE类型的符号不太方便。

不过,MSVC中提供了一个mn等价物dumpbin.exe,可以用来查看PE文件的符号:

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
Microsoft (R) COFF/PE Dumper Version 14.25.28614.0
Copyright (C) Microsoft Corporation. All rights reserved.

usage: DUMPBIN [options] [files]

options:

/ALL
/ARCHIVEMEMBERS
/CLRHEADER
/DEPENDENTS
/DIRECTIVES
/DISASM[:{BYTES|NOBYTES}]
/ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
/EXPORTS
/FPO
/HEADERS
/IMPORTS[:filename]
/LINENUMBERS
/LINKERMEMBER[:{1|2}]
/LOADCONFIG
/NOLOGO
/NOPDB
/OUT:filename
/PDATA
/PDBPATH[:VERBOSE]
/RANGE:vaMin[,vaMax]
/RAWDATA[:{NONE|1|2|4|8}[,#]]
/RELOCATIONS
/SECTION:name
/SUMMARY
/SYMBOLS
/TLS
/UNWINDINFO

查看导入导出符号:

1
2
dumpbin.exe /imports UE4Editor-ZstdExample.dll
dumpbin.exe /exports UE4Editor-ZstdExample.dll

Win10 UTF8编码

开启之后会将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage下的ACPOEMCPMACCP值修改为65001:

通过检测它们的值可以知道是否开启了UTF8编码。

1
2
3
4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"ACP"="65001"
"OEMCP"="65001"
"MACCP"="65001"

BAT检测文件是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
SET PYTHON_EXE=%1\..\..\FEngine\Engine\Binaries\ThirdParty\Python3\Win64\python.exe
SET SCANNER_PY_SCRIPT=%1\ResScanner\PreCommitChecker.py
@REM echo %PYTHON_EXE% %SCANNER_PY_SCRIPT% %2 %3 %4 %5 %6 %7

IF EXIST %PYTHON_EXE% (
IF EXIST %SCANNER_PY_SCRIPT% (
%PYTHON_EXE% %SCANNER_PY_SCRIPT% %2 %3 %4 %5 %6 %7
) ELSE (
ECHO %SCANNER_PY_SCRIPT% NOT FOUND!
)
) ELSE (
ECHO %PYTHON_EXE% NOT FOUND!
)

Win查看虚拟内存的占用情况

通过systeminfo命令即可查看:

Win查看PE文件二进制符号空间分布

需要加载pdb和exe进行分析:




SCP上传/下载文件

  1. 从远程下载文件
1
2
scp username@host:/path/filename /local_path/
# scp lipengzha@192.168.1.111:/root/test.txt /d/folder/
  1. 上传本地文件到远程
1
2
scp /path/filename username@host:/remote_path
# scp /d/folder/test.txt lipengzha@192.168.1.111:/root/home
  1. 从远程下载文件夹
1
2
scp -r username@host:/remote_dir/ /local_dir/
# scp -r lipengzha@192.168.1.111:/root/home/testfolder /d/
  1. 上传文件夹到远程
1
2
scp -r /local_dir/ username@host:/remote_dir/
# scp -r /d/testfolder lipengzhe@192.168.1.111:/root/home/

可以通过scp -P 2222来自定义ssh端口。

Windows查看进程的优先级

可以通过任务管理器查看:

LibChecker

查看Android Apk的so、服务、Activity、权限等。

Windows查看文件被哪个进程占用

通过资源监视器搜文件名,可以查看文件句柄被哪个进程占用:

Adb over Wi-Fi

  1. USB连接设备
  2. 让设备的adbd守护进程监听5555端口,等待PC连接
1
adb tcpip 5555
  1. 查看设备IP,获取wlan0的IP地址
1
adb shell ifconfig

  1. 断开设备的USB连接

  2. 通过Adb远程连接设备

1
2
adb connect DEVICE_IP:5555
# adb connect 192.168.31.172:5555
  1. 通过adb devices即可看到远程连接的设备

wget gist file

And yet there is, look for the raw button (on the top-right of the source code).

The raw URL should look like this:

1
https://gist.githubusercontent.com/{user}/{gist_hash}/raw/{commit_hash}/{file}

Note: it is possible to get the latest version by omitting the {commit_hash} part, as shown below:

1
https://gist.githubusercontent.com/{user}/{gist_hash}/raw/{file}

Python

编码错误

1
SyntaxError: Non-ASCII character '\xe8' in file PreCommitChecker.py on line 10, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

可以在py文件顶部添加编码:

1
#coding=utf-8

获取当前目录

1
2
current_path = os.getcwd()
engine_cmd_exe_path = os.path.abspath(os.path.join(current_path,"../../FEngine/Engine/Binaries/Win64/UE4Editor-cmd.exe"))

import上级目录

1
2
3
4
import sys
sys.path.append("..")
from notice_robot_py import Robot
from Commandlets import DoCommandlets

os.system执行带空格程序

使用subprocess替换:

1
2
3
ps = subprocess.Popen(final_cmdlet)
ps.wait()
exit_code = ps.returncode # os.system(final_cmdlet)

检测UTF8 With BOM

1
2
3
4
5
6
7
8
import codecs

f = open(filepath, 'rb')
s = f.read()
if s[:3] == codecs.BOM_UTF8:
# with BOM
else:
# not with BOM

SSH使用key登录失败

可以修改Mac的SSH配置(/etc/ssh/sshd_config):

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
StrictModes no

然后重载配置:

1
2
$ sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Windows11开启WSA

  1. 启用Hypre-V/Windows虚拟机监控程序平台/虚拟机平台

  1. 在BIOS中开启CPU虚拟化(Intel Visualization Technology)

  1. 下载WSA离线安装包链接,提取码:iogg

解压后使用管理员权限启动powershell,执行以下命令:

1
Add-AppxPackage -Path MicrosoftCorporationII.WindowsSubsystemForAndroid_1.7.32815.0_neutral___8wekyb3d8bbwe.Msixbundle

安装完毕之后,就可以在开始菜单搜索到WSA了:

启动之后打开开发人员模式:

下面可以看到WSA的IP地址。

安装之后可以往WSA安装APK,需要先下载ADB,通过ADB往WSA安装apk文件。

使用adb connect命令,网络连接WSA(IP地址可从WSA中查看):

1
adb connect 127.0.0.1:58526

然后使用adb install命令安装apk即可:

1
adb install base.apk

甚至能装UE打出来的APK包,运行正常:

甚至能正常运行LOLM:

WSA的Linux内核版本为5.10.34.2

Android版本为Android 11:

1
2
3
windows_x86_64:/ $ getprop ro.build.version.sdk
getprop ro.build.version.sdk
30

查看内存:

1
cat /proc/meminfo

KMS激活

管理员权限启动cmd或powershell:

1
2
3
4
5
slmgr.vbs -ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
#slmgr.vbs -s xincehng213618.cn
#kms.srv.crsoo.com 为作者提供。
slmgr.vbs -skms kms.srv.crsoo.com
slmgr.vbs -ato

去除快捷方式Icon小箭头

打开注册表位置(没有Shell Icons则新建):

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons

新建一个字符串值,名称为29,内容为C:\WINDOWS\system32\imageres.dll,197,重启即可。

获取抖音的视频下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
import re
import webbrowser

def douyinurl(url):
ua = {
'user-agent': "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
response = requests.get(url, headers=ua, allow_redirects=False)
url = response.headers['Location']
itemids = re.findall("video/(.*?)/\?", url)[0]
url = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=" + itemids
response = requests.get(url, headers=ua)
videovid = response.json()["item_list"][0]['video']['vid']
url = "https://aweme.snssdk.com/aweme/v1/play/?video_id=" + videovid + "&ratio=720p&line=0"
response = requests.get(url, headers=ua, allow_redirects=False)
url = response.headers['Location']
return url

if __name__ == '__main__':
url = input('请输入抖音分享链接:')
t = douyinurl(url)
webbrowser.open(t)

Python检测文件编码

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
import os
import sys
import chardet

def find_file_by_format(dir,format):
fileArray = []
for root, folders, files in os.walk(dir, topdown=False):
for name in files:
if name.endswith(format):
fileArray.append(os.path.join(root, name))
return fileArray

def code_format_checker(dir,formats):
result_dict = {}
for format in formats:
fileArray = find_file_by_format(dir,format)
for filepath in fileArray:
with open(filepath, 'rb') as f:
s = f.read()
chatest = chardet.detect(s)
result_dict[filepath] = chatest.get('encoding')
# print("%s %s" % (filepath,chatest.get('encoding')) )
f.close()
return result_dict

checkout_encoding = ["ascii","utf-8","utf-8-sig"]

def not_checkout_encoding(dir,formats,checkout_encodings):
invalid_result_dict = {}
for filepath,encoding in code_format_checker(dir,formats).items():
bIsInvalid = True
for checkout_encoding in checkout_encodings:
if encoding is None:
break
if checkout_encoding == encoding.lower():
bIsInvalid = False
break
if bIsInvalid:
invalid_result_dict[filepath] = encoding
return invalid_result_dict

for filepath,encoding in code_format_checker("C:\Users\lipengzha\Documents\UnrealProjects\Client\Config",["ini"]).items():
print("%s %s" % (filepath,encoding))

magic mouse速度

系统默认的跟踪速度:

1
defaults read -g com.apple.mouse.scaling

设置:

1
defaults write -g com.apple.mouse.scaling 7

查看keystore的别名信息

通过keytool命令行查看:

1
keytool -list -v -keystore fmgame.keystore -storepass xxxxxx

JetbrainsIDE过滤Log

需要安装插件:Grep Console

添加过滤设置即可,还可以设置颜色:

Rider for Unreal添加启动参数

  1. 首先要在View-Appearance中开启Toolbar
  2. 在ToolBar右键Customize Menus and Toolbars


3. 在Menus and Toolbars-Main Toolbar-Toolbar Run Actions-Run/Debug下添加Edit Configurations

4. 启动之后添加参数即可。

VS启动调试报错

无法启动调试。请通过打开项目属性并导航配置属性”->“调试”来检查调试器设置。

应该是项目的工作目录没设置对:

VS项目右键属性,把Debuger里的工作目录改成$(ProjectDir)即可。

MSBUILD16.10使用Rider错误

使用Rider编译UE4的错误信息:

1
UnrealBuildTool.csproj: [MSB4057] 该项目中不存在目标"Engine\UE4"

这是VS2019 MSBUILD 16.10的一个bug,官方说要在16.10.1中解决这个问题:

部署trojan

首先需要把域名解析至VPS IP地址,然后依次执行以下命令:

1
2
3
4
5
# 安装BBR
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

# 安装trojan
curl -O https://raw.githubusercontent.com/atrandys/trojan/master/trojan_mult.sh && chmod +x trojan_mult.sh && ./trojan_mult.sh

查看、修改trojan的密码:

1
nano /usr/src/trojan/server.conf

重启服务:

1
sudo systemctl restart trojan

日期格式匹配正则

1
\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}

这个规则可以匹配以下内容:

1
2
3
2021-01-06
2021/01/06
2021.01.06

批量删除微博脚本

粘贴以下代码到微博页面的console中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'use strict';
var s = document.createElement('script');
s.setAttribute(
'src',
'https://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.min.js'
);
s.onload = function() {
setInterval(function() {
if (!$('a[action-type="feed_list_delete"]')) {
$('a.next').click();
} else {
$('a[action-type="feed_list_delete"]')[0].click();
$('a[action-type="ok"]')[0].click();
}

// scroll bottom let auto load
$('html, body').animate({ scrollTop: $(document).height() }, 'slow');
}, 800);
};

document.head.appendChild(s);

Apple软件使用的TCP/UDP端口

cmd添加防火墙规则

如SwarmCoordinator需要开放ping以及TCP的8008/8099端口:

1
2
3
netsh advfirewall firewall add rule name="Unreal Swarm ICMPv4 In" dir=in action=allow enable=yes remoteip=Any protocol=icmpv4
netsh advfirewall firewall add rule name="allowSwarmAgent" protocol=TCP dir=out localport=8008-8009 action=allow
netsh advfirewall firewall add rule name="allowSwarmAgent" protocol=TCP dir=in localport=8008-8009 action=allow

netsh命令行用法:

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
C:\windows\system32>netsh advfirewall firewall add rule

提供的许多参数无效。请查看帮助获取正确语法。

用法: add rule name=<string>
dir=in|out
action=allow|block|bypass
[program=<program path>]
[service=<service short name>|any]
[description=<string>]
[enable=yes|no (default=yes)]
[profile=public|private|domain|any[,...]]
[localip=any|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
[remoteip=any|localsubnet|dns|dhcp|wins|defaultgateway|
<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
[localport=0-65535|<port range>[,...]|RPC|RPC-EPMap|IPHTTPS|any (default=any)]
[remoteport=0-65535|<port range>[,...]|any (default=any)]
[protocol=0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|
tcp|udp|any (default=any)]
[interfacetype=wireless|lan|ras|any]
[rmtcomputergrp=<SDDL string>]
[rmtusrgrp=<SDDL string>]
[edge=yes|deferapp|deferuser|no (default=no)]
[security=authenticate|authenc|authdynenc|authnoencap|notrequired
(default=notrequired)]

备注:

- 将新的入站或出站规则添加到防火墙策略。
- 规则名称应该是唯一的,且不能为 "all"
- 如果已指定远程计算机或用户组,则 security 必须为
authenticate、authenc、authdynenc 或 authnoencap。
- 为 authdynenc 设置安全性可允许系统动态协商为匹配
给定 Windows Defender 防火墙规则的通信使用加密。
根据现有连接安全规则属性协商加密。
选择此选项后,只要入站 IPsec 连接已设置安全保护,
但未使用 IPsec 进行加密,计算机就能够接收该入站连接的第一个 TCP 或
UDP 包。
一旦处理了第一个数据包,服务器将重新协商连接并对其进行升级,以便所
有后续通信都完全加密。
- 如果 action=bypass,则 dir=in 时必须指定远程计算机组。
- 如果 service=any,则规则仅应用到服务。
- ICMP 类型或代码可以为 "any"
- Edge 只能为入站规则指定。
- AuthEnc 和 authnoencap 不能同时使用。
- Authdynenc 仅当 dir=in 时有效。
- 设置 authnoencap 后,security=authenticate 选项就变成可选参数。

示例:

为不具有封装的 messenger.exe 添加入站规则:
netsh advfirewall firewall add rule name="allow messenger"
dir=in program="c:\programfiles\messenger\msmsgs.exe"
security=authnoencap action=allow

为端口 80 添加出站规则:
netsh advfirewall firewall add rule name="allow80"
protocol=TCP dir=out localport=80 action=block

为 TCP 端口 80 通信添加需要安全和加密的入站规则:
netsh advfirewall firewall add rule
name="Require Encryption for Inbound TCP/80"
protocol=TCP dir=in localport=80 security=authdynenc
action=allow

为 messenger.exe 添加需要安全的入站规则:
netsh advfirewall firewall add rule name="allow messenger"
dir=in program="c:\program files\messenger\msmsgs.exe"
security=authenticate action=allow

为 SDDL 字符串标识的组 acmedomain\scanners 添加
经过身份验证的防火墙跳过规则:
netsh advfirewall firewall add rule name="allow scanners"
dir=in rmtcomputergrp=<SDDL string> action=bypass
security=authenticate

为 udp- 的本地端口 5000-5010 添加出站允许规则
Add rule name="Allow port range" dir=out protocol=udp localport=5000-5010 action=allow

Win检测进程是否存在

如果存在,杀掉进程,不存在就不执行taskkill任务:

1
2
tasklist | find /i "swarmagent.exe"
if "%errorlevel%"=="1" (echo "not found swarmagent process") else (taskkill /f /t /im swarmagent*)

使用tcping检测端口是否开放

可以使用tcping这个工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ tcping 127.0.0.1 10086
# 端口联通的情况
Probing 127.0.0.1:10086/tcp - Port is open - time=10.775ms
Probing 127.0.0.1:10086/tcp - Port is open - time=0.428ms
Probing 127.0.0.1:10086/tcp - Port is open - time=0.344ms
Probing 127.0.0.1:10086/tcp - Port is open - time=0.317ms

Ping statistics for 127.0.0.1:10086
4 probes sent.
4 successful, 0 failed. (0.00% fail)
Approximate trip times in milli-seconds:
Minimum = 0.317ms, Maximum = 10.775ms, Average = 2.966ms

# 未开放端口的情况
Probing 127.0.0.1:10086/tcp - No response - time=2002.595ms
Probing 127.0.0.1:10086/tcp - No response - time=2000.168ms
Probing 127.0.0.1:10086/tcp - No response - time=2000.202ms
Probing 127.0.0.1:10086/tcp - No response - time=2001.308ms

Ping statistics for 127.0.0.1:10086
4 probes sent.
0 successful, 4 failed. (100.00% fail)
Was unable to connect, cannot provide trip statistics

Windows通过bat存储环境变量

设置用户环境变量:

1
setx ENV_NAME env_value

设置系统环境变量:

1
setx ENV_NAME env_value /m

Windows挂载网络路径

使用net use命令:

1
net use * \\YourCompanyComputer "password" /user:"username" /persistent:yes

如:

1
net use * \\192.168.1.111\Game  "password" /user:"imzlp" /persistent:yes

也可以根据条件进行检测,如果已有挂载就不重新执行:

1
2
3
if not exist "T:\" (
net use T: \\192.168.1.111\Game /user:"imzlp" "password"
)

AndroidP HTTP请求错误

在Android P上使用HTTP请求上传数据会有以下错误提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2018-10-10 16:39:21.312 31611-31646/com.xfhy.tinkerfirmdemo W/CrashReport: java.io.IOException: Cleartext HTTP traffic to android.bugly.qq.com not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:258)
at com.tencent.bugly.proguard.ai.a(BUGLY:265)
at com.tencent.bugly.proguard.ai.a(BUGLY:114)
at com.tencent.bugly.proguard.al.run(BUGLY:355)
at com.tencent.bugly.proguard.ak$1.run(BUGLY:723)
at java.lang.Thread.run(Thread.java:764)
2018-10-10 16:39:21.312 31611-31646/com.xfhy.tinkerfirmdemo E/CrashReport: Failed to upload, please check your network.
2018-10-10 16:39:21.312 31611-31646/com.xfhy.tinkerfirmdemo D/CrashReport: Failed to execute post.
2018-10-10 16:39:21.312 31611-31646/com.xfhy.tinkerfirmdemo E/CrashReport: [Upload] Failed to upload(1): Failed to upload for no response!
2018-10-10 16:39:21.313 31611-31646/com.xfhy.tinkerfirmdemo E/CrashReport: [Upload] Failed to upload(1) userinfo: failed after many attempts

这需要我们在打包时把指定的域名给配置成白名单。

方法如下:

res/xml下创建network_security_config.xml文件

填入以下内容(网址自行修改):

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">android.bugly.qq.com</domain>
</domain-config>
</network-security-config>

然后在AndroifManifest.xml中引用该文件:

1
<application android:networkSecurityConfig="@xml/network_security_config"/>

重新打包即可,在运行时会有以下Log:

1
02-25 21:09:15.831 27760 27791 D NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true

黑苹果指南

查看某个进程的端口占用

使用netstat命令:

1
2
3
4
5
6
7
8
9
C:\Users\lipengzha>netstat -ano | findstr "231096"
TCP 0.0.0.0:1985 0.0.0.0:0 LISTENING 231096
TCP 0.0.0.0:3961 0.0.0.0:0 LISTENING 231096
TCP 0.0.0.0:3963 0.0.0.0:0 LISTENING 231096
TCP 127.0.0.1:4014 127.0.0.1:12639 ESTABLISHED 231096
TCP 127.0.0.1:4199 127.0.0.1:12639 ESTABLISHED 231096
UDP 0.0.0.0:6666 *:* 231096
UDP 0.0.0.0:24024 *:* 231096
UDP 0.0.0.0:58101 *:* 231096

outguess图片隐写

把一些文本信息写入到图片中:outguess

查看jar中的类和符号信息

可以使用JD-GUI来查看:JD-GUI

Win10开启长路径支持

打开组策略编辑器(gpedit.msc),依次找到”本地计算机策略 - 计算机配置 - 管理模板 - 系统 - 文件系统”,找到“启用 Win32 长路径”设置为“已启用”。

CMD添加系统环境变量

如果要添加至用户的环境变量:

1
2
rem setx JAVA_HOME "%current_dir_name%\jdk18077"
setx VAR_NAME TARGET_PATH

如果要添加至系统的环境变量,则在setx之后加上/M参数即可。

镜像文件超4G的启动盘制作

之前都是使用软碟通来进行启动盘的制作,但是软碟通使用的是FAT32,不能存储超过4G的文件,但是现在Win10都已经超过4G了,会导致超过4G的文件不会被写入到优盘中,导致启动盘制作失败。
解决这个问题可以使用一个新的工具:rufus

Xcode与clang版本对照

Git文件变动时间

当使用git clone或者更新文件时,本地文件的修改时间为变为当前机器的执行时间,那么如何把文件的修改之间保持为这些文件被提交时的时间呢?

Git有个方法可以获取文件在当前仓库中的最近提交时间:

1
$ git log -1 --format="%ct" FILE_PATH

得到的是一串数字,Unix时间戳,如1601541165,表示的是当前文件最近一次提交的时间。

得到这个时间后,可以通过touch -d来修改文件的修改时间:

1
$ touch -d "@1601541165" FILE_PATH

注意:在Unix时间戳之前需要添加@,这是touch接收的时间格式。

那么如何批量地对整个仓库进行处理呢?可以使用下面的这行脚本:

1
$ git ls-files -z | while read -d '' path; do touch -d "$(git log -1 --format="@%ct" "$path")" "$path"; done

它会把仓库中的文件的修改时间改为文件在当前仓库中最近的提交时间。

注意:如果本地仓库深度为1,则所有的文件都是最近这次深度的commit时间。

Git LFS的规则问题

在使用git lfs时一定要注意.gitattributes的规则,如果想要使用lfs追踪所有的文件:

1
*.* filter=lfs diff=lfs merge=lfs -text

这个规则是有问题的,它会导致所有的文件都被lfs追踪,包括.gitignore.gitattributes,在使用lfs拉取时会变动这两个文件,导致所有的文件都被git检测出变动状态。
那么合理的规则是,包含所有文件的同时要把.gitignore.gitattributes给排除掉:

1
2
3
*.* filter=lfs diff=lfs merge=lfs -text
.* !filter
.gitattributes !filter

LaTex插入符号

空格

含义 指令 效果 解释
两个quad空格 a \qquad b $a \qquad b$ 两个m的宽度
quad空格 a \quad b $a \quad b$ 一个m的宽度
大空格 a\ b $a\ b$ 1/3m宽度
中等空格 a;b $a;b$ 2/7m宽度
小空格 a,b $a,b$ 1/6m宽度
没有空格 ab $ab$ none
紧贴 a!b $a!b$ 缩进1/6m宽度

\quad1ememm代表当前字体下接近字符‘M’的宽度(approximately the width of an “M” in the current font).

分隔符

使用\textrm{-}插入分隔符-不会使其被识别为减号。

1
declaration\textrm{-}specifiers_{opt}

效果如下:

$declaration\textrm{-}specifiers_{opt}$

重置Bitnami Gitlab管理员权限账户密码

安装的bitnami后gitlab的管理员账号密码默认为:

1
2
3
4
# account
user: Administrator
email: admin@example.com
default password: 5iveL!fe

登录bitnami gitlab镜像的账户密码:

1
2
user: bitnami
password: bitnami

修改gitlab的默认管理员权限的账号密码可以在安装的bitnami镜像的环境中执行下列命令:

1
2
3
4
5
6
7
8
$ sudo gitlab-rails console production
irb(main):001:0> u = User.where(id:1).first
=> #<(User) id:1 @root>
irb(main):001:1> u.password = 'newpassword'
=> "newpassword"
irb(main):001:2> u.password_confirmation = 'newpassword'
=> "newpassword"
irb(main):001:2> u.save!

这样就修改完成了。

Adb命令

首先先要下载Adb

Adb安装Apk

1
$ adb install APK_FILE_NAME.apk

Adb关闭app

1
adb shell am force-stop PACKAGE_NAME

Adb启动App

安装的renderdoccmd是没有桌面图标的,想要自己启动的话只能使用下列adb命令:

1
adb shell am start org.renderdoc.renderdoccmd.arm64/.Loader -e renderdoccmd "remoteserver"

adb启动App的shell命令模板:

1
adb shell am start PACKAGE_NAME/.ActivityName

这个方法需要知道App的包名和Activity名,包名很容易知道,但是Activity如果不知道可以通过下列操作获取:

首先使用一个反编译工具将apk解包(可以使用之前的apktools):

1
apktool.bat d -o ./renderdoccmd_arm64 org.renderdoc.renderdoccmd.arm64.apk

然后打开org.renderdoc.renderdoccmd.arm64目录下的AndroidManifest.xml文件,找到其中的Application项:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.renderdoc.renderdoccmd.arm64" platformBuildVersionCode="26" platformBuildVersionName="8.0.0">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-feature android:glEsVersion="0x00030000" android:required="true"/>
<application android:debuggable="true" android:hasCode="true" android:icon="@drawable/icon" android:label="RenderDocCmd">
<activity android:configChanges="keyboardHidden|orientation" android:exported="true" android:label="RenderDoc" android:name=".Loader" android:screenOrientation="landscape">
<meta-data android:name="android.app.lib_name" android:value="renderdoccmd"/>
</activity>
</application>
</manifest>

其中有所有注册的Activity,没有有界面的apk只有一个Activity,所以上面的renderdoccmd的主Activity就是.Loader

如果说有界面的app,则会有多个,则可以从AndroidManifest.xml查找Category或者根据命名(名字带main的Activity)来判断哪个是主Activity。一般都是从lanucher开始,到main,或者有的进登陆界面。

PS:使用UE打包出游戏的主Activity是com.epicgames.ue4.SplashActivity,可以通过下列命令启动。

1
adb shell am start com.imzlp.GWorld/com.epicgames.ue4.SplashActivity

Adb传输文件

使用adb往手机传文件:

1
2
# adb push 1.0_Android_ETC2_P.pak /sdcard/Android/data/com.imzlp.TEST/files/UE4GameData/Mobile422/Mobile422/Saved/Paks
$ adb push FILE_NAME REMOATE_PATH

从手机传递到电脑:

1
2
# adb pull /sdcard/Android/data/com.imzlp.TEST/files/UE4GameData/Mobile422/Mobile422/Saved/Paks/1.0_Android_ETC2_P.pak A.Pak
$ adb pull REMOATE_FILE_PATH LOCAL_PATH

Adb:Logcat

使用logcast可以看到Android的设备Log信息。

1
$ adb logcat

会打印出当前设备的所有信息,但是我们调试App时不需要看到这么多,可以使用find进行筛选(注意大小写严格区分):

1
2
# adb logcat | find "GWorld"
$ adb logcat | find "KEY_WORD"

查看UE打包的APP所有的log可以筛选:

1
$ adb logcat | find "UE4"

如果运行的次数过多积累了大量的Log,可以使用清理:

1
adb logcat -c

Adb:从设备中提取已安装的APK

注意:执行下列命令时需要检查手机是否开放开发者权限,手机上提示的验证指纹信息要允许。

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
# 查看链接设备
$ adb devices
List of devices attached
b2fcxxxx unauthorized
# 列出手机中安装的所有app
$ adb shell pm list package
# 如果提示下问题,则需要执行adb kill-server
error: device unauthorized.
This adb servers $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.
# 正常情况下会列出一堆这样的列表
C:\Users\imzlp>adb shell pm list package
package:com.miui.screenrecorder
package:com.amazon.mShop.android.shopping
package:com.mobisystems.office
package:com.weico.international
package:com.github.shadowsocks
package:com.android.cts.priv.ctsshim
package:com.sorcerer.sorcery.iconpack
package:com.google.android.youtube

# 找到指定app的的apk位置
$ adb shell pm path com.github.shadowsocks
package:/data/app/com.github.shadowsocks-iBtqbmLo8rYcq2BqFhJtsA==/base.apk
# 然后将该文件拉取到本地来即可
$ adb pull /data/app/com.github.shadowsocks-iBtqbmLo8rYcq2BqFhJtsA==/base.apk
/data/app/com.github.shadowsocks-iBtqbmLo8rYcq2BqFhJtsA==/...se.apk: 1 file pulled. 21.5 MB/s (4843324 bytes in 0.215s)

Adb刷入Recovery

下载Adb,然后根据具体情况使用下列命令(如果当前已经在bootloader就不需要执行第一条了)。

1
2
3
4
5
6
adb reboot bootloader
# 写入img到设备
fastboot flash recovery recovery.img
fastboot flash boot boot.img
# 引导img
fastboot boot recovery.img

adb端口转发

可以通过adb命令来指定:

1
2
3
4
# PC to Device
adb reverse tcp:1985 tcp:1985
# Device to PC
adb forward tcp:1985 tcp:1985

adb:根据包名查看apk位置

可以使用以下adb命令:

1
2
$ adb shell pm list package -f com.tencent.tmgp.fm
package:/data/app/com.tencent.tmgp.fm-a_cOsX8G3VClXwiI-RD9wQ==/base.apk=com.tencent.tmgp.fm

最后一个参数是包名,输出的则是apk的路径。

adb:查看当前窗口的app的包名

使用以下adb命令:

1
2
3
4
5
6
7
8
$ adb shell dumpsys window w | findstr \/ | findstr name=
mSurface=Surface(name=SideSlideGestureBar-Bottom)/@0xa618588
mSurface=Surface(name=SideSlideGestureBar-Right)/@0x619b646
mSurface=Surface(name=SideSlideGestureBar-Left)/@0xea02007
mSurface=Surface(name=StatusBar)/@0x7e4962d
mAnimationIsEntrance=true mSurface=Surface(name=com.tencent.tmgp.fm/com.epicgames.ue4.GameActivity)/@0x43b30a0
mSurface=Surface(name=com.tencent.tmgp.fm/com.epicgames.ue4.GameActivity)/@0xa3481e
mAnimationIsEntrance=true mSurface=Surface(name=com.vivo.livewallpaper.monster.bmw.MonsterWallpaperService)/@0x53e44ae

其中的mAnimationIsEntrance=true mSurface=Surface(name=之后,到/之前的字符串就是我们的app包名。

npm换源

把npm从官方换到淘宝源:

1
$ npm config set registry https://registry.npm.taobao.org

国内速度会快很多。

Chome79在Win10中崩溃

Chrome自动更新之后所有的页面都变成了这个样子:

解决办法是在chrome的快捷方式中添加 -no-sandbox参数,但会提示_您使用的是不受支持的命令行标记:-no-sandbox。稳定性和安全性会有所下降。_,暂时我还没找到根本解决的办法,暂时先这样。

三大运营商个人轨迹证明方法

一、电信手机用户证明方法

编辑短信“CXMYD#身份证号码后四位”到10001,授权回复Y后,实现“漫游地查询”,可查询手机号近15日内的途径地信息。

二、联通手机用户证明方法

手机发送:“CXMYD#身份证后四位”至10010,查询近30天的全国漫游地信息,便于返工辅助排查。

三、移动用户证明方法

编写CXMYD,发送到10086,再依据回复短信输入身份证后四位,可查询过去一个月内去过的省和直辖市(无地市)。

每人免费一天查询10次。

npm install报错

在npm安装时遇到下列错误:

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
root@VISIONSMILE-PC:/mnt/c/Users/Administrator/Desktop/hexo# npm install hexo-cli -g
npm http GET https://registry.npmjs.org/hexo-cli
npm http GET https://registry.npmjs.org/hexo-cli
npm http GET https://registry.npmjs.org/hexo-cli
npm ERR! Error: CERT_UNTRUSTED
npm ERR! at SecurePair.<anonymous> (tls.js:1370:32)
npm ERR! at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR! at SecurePair.maybeInitFinished (tls.js:982:10)
npm ERR! at CleartextStream.read [as _read] (tls.js:469:13)
npm ERR! at CleartextStream.Readable.read (_stream_readable.js:320:10)
npm ERR! at EncryptedStream.write [as _write] (tls.js:366:25)
npm ERR! at doWrite (_stream_writable.js:223:10)
npm ERR! at writeOrBuffer (_stream_writable.js:213:5)
npm ERR! at EncryptedStream.Writable.write (_stream_writable.js:180:11)
npm ERR! at write (_stream_readable.js:583:24)
npm ERR! If you need help, you may report this log at:
npm ERR! <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR! <npm-@googlegroups.com>

npm ERR! System Linux 3.4.0+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "hexo-cli" "-g"
npm ERR! cwd /mnt/c/Users/Administrator/Desktop/hexo
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /mnt/c/Users/Administrator/Desktop/hexo/npm-debug.log
npm ERR! not ok code 0

解决办法,在bash执行下列命令:

1
$ npm config set strict-ssl false

之后重新执行安装即可。

Install 7z on Linux

1
2
3
4
5
6
7
8
$ sudo apt-get update
$ sudo apt-get install p7zip-full
# 压缩
$ 7z a data.7z data.txt
# 显示7z文件中的文件列表
$ 7z l data.7z
# 解压
$ 7z e data.7z

7z命令行

解压使用如下命令(-y是碰到提示一律yes):

1
$ 7z.exe x xxxx.7z -oD:\Extract -y

也可以指定要解压的格式:

1
$ 7z.exe x xxxx.7z -oD:\Extract *.so -r -y

压缩则可以使用以下命令:

1
$ 7z.exe a xxxx.7z COMPRESS_DIR

scp拷贝文件

使用以下命令可以使用ssh从远程拷贝文件到本地:

1
scp -P 22 buildmachine@xx.xx.xx.xxx:/Users/buildmachine/Client/Binaries/IOS/FGame.dSYM D:\

但是这样有一个缺点是当需要输入密码的时候scp无法指定密码。

在Win上可以用puttypscp来解决,它可以指定-pw参数,还可以通过-batch禁用所有交互提示:

1
pscp.exe -batch -pw 123456 -P 22 buildmachine@xx.xx.xx.xxx:/Users/buildmachine/Client/Binaries/IOS/FGame.dSYM D:\

v2ray中大量的67错误

看到v2ray里有大量的下列错误:

1
2020/04/12 17:31:30 tcp:127.0.0.1:53920 rejected  v2ray.com/core/proxy/socks: unknown Socks version: 67

官方说这是因为应用里设置里http代理,排查了一下,这是因为在win10的设置里开启了代理,在Win10设置-网络-代理关掉系统代理即可。

Chrome阅读模式

chrome://flags/中有Enable Reader Mode,开启即可。

命令行安装VS

以下命令控制根据配置安装VS,并且不启动任何前台程序,等待安装完成:

1
vs_professional.exe --config="D:\config.vsconfig" --quite --wait

NPM:指定Packages的版本

  • ~version “Approximately equivalent to version” See npm semver - Tilde Ranges & semver (7)
  • ^version “Compatible with version” See npm semver - Caret Ranges & semver (7)
  • version Must match version exactly
  • >version Must be greater than version
  • >=version etc
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
  • http://sometarballurl (this may be the URL of a tarball which will be downloaded and installed locally
  • * Matches any version
  • latest Obtains latest release

What’s the difference between tilde(~) and caret(^) in package.json?

在命令行启动资源管理器打开文件夹

在Windows上的可以通过cmd命令来在资源管理器中打开一个文件夹,使用explorer命令:

1
explorer.exe /e,/root, F:\Test

注意,最后指定的路径必须是由\组成的路径,如果是反斜杠的则无法打开正确的目录(打开的是user/documents目录)。

在UE中使用时我写了一个路径转换的函数,把一个路径中的所有/替换为\\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FString ConvPath_Slash2BackSlash(const FString& InPath)
{
FString ResaultPath;
TArray<FString> OutArray;
InPath.ParseIntoArray(OutArray, TEXT("\\"));
if (OutArray.Num() == 1 && OutArray[0] == InPath)
{
InPath.ParseIntoArray(OutArray, TEXT("/"));
}
for (const auto& item : OutArray)
{
if (FPaths::DirectoryExists(ResaultPath + item))
{
ResaultPath.Append(item);
ResaultPath.Append(TEXT("\\"));
}
}
return ResaultPath;
}

Windows tree命令

在Windows的cmd下可以使用tree命令来列出当前文件夹的目录结构。其命令格式为:

1
tree [drive][path] [/F] [/A]

/F:显示每个文件夹中文件的名称
/A:使用ASCII字符,而不使用扩展字符

For example:

1
2
3
4
5
6
D:\recastnavigation\RecastDemo\Contrib\SDL>tree /a
+---docs
+---include
\---lib
+---x64
\---x86
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
D:\recastnavigation\RecastDemo\Bin>tree /a /f
文件夹 PATH 列表
卷序列号为 000002D0 ECDB:6872
C:.
| .gitignore
| DroidSans.ttf
| RecastDemo.exe
| RecastDemo.pdb
| SDL2.dll
| Tests.exe
| Tests.pdb
|
+---Meshes
| dungeon.obj
| nav_test.obj
| undulating.obj
|
\---TestCases
movement_test.txt
nav_mesh_test.txt
raycast_test.txt

快速运行一个http文件下载服务

可以使用nodejsserve,安装完node之后在目录中执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ npx serve
WARNING: Checking for updates failed (use `--debug` to see full error)

┌──────────────────────────────────────────────────┐
│ │
│ Serving! │
│ │
│ - Local: http://localhost:5000 │
│ - On Your Network: http://192.168.2.83:5000 │
│ │
│ Copied local address to clipboard! │
│ │
└──────────────────────────────────────────────────┘

浏览器即可访问。

另一种方法是下载hfs,启动之后添加一个目录即可,很简单。

Windows编译最新版本的Lua

首先去lua.org下载最新的lua代码并解压(目前是v5.3.5):

1
2
curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz

在windows上启动MSVC的开发者工具命令:开始菜单-x64 Native Tools Command Prompt,将路径切换到Lua源码的Source目录吗,使用cd /d命令。
然后依次执行下面几条命令:

1
2
3
4
5
6
7
cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua535-import.lib /OUT:lua535.dll *.obj
lib /OUT:lua535.lib *.obj
link /OUT:luac.exe luac.o lua535.lib
link /OUT:lua.exe lua.o *.obj

最终编译出lua.exe/luac.exe/lua535.dll/lua535-import.lib/lua535.lib,这一堆的东西。

Windows环境变量长度超限制

今天往系统的PATH中添加一个新的路径,结果居然提示我太长不能保存。

这岂不是要了老命了,研究了一下,发现可以在系统的Path中添加一个另外的环境变量值。

即,现在系统中随便新建一个环境变量,如%ExternPATH%,然后将该环境变量添加至PATH中,ExternPATH中的值也都可以被查找到。

Epic账号切换国家区域

Epic商城是锁国区的,有些内容国内账号没有,而且现在Epic商城要求付款账单地址信息与Epic账户信息一致,意味着,美元账户付不了国区。如果在Epic商城绑定支付信息和购买内容之后是没办法直接在网页上修改的,需要联系人工客服。

首先去Epic Games | Support Center提交联系客服的申请,问题描述就用英文说要修改账户的国家和地区从中国转为美国,之后客服会给你邮箱发邮件要求你提供几个信息。

  1. Email address associated with your Epic Games account
  2. Current Epic Games account display name
  3. First and last names of Epic Games account holder
  4. External account currently connected to your Epic Games account, if applicable.
  • This includes Google, Facebook, Twitch, PSN, Xbox, and Switch accounts.
  • Include the platform AND display name of any external accounts.

在邮件里直接回复这些信息之后,他们会给Epic账号绑定的邮箱发送一个验证链接,验证之后,再给他们回复邮件说验证成功,之后他们就会给你修改了。

注意:修改国家之后,之前账户绑定的支付信息都会清空,如Paypal账号之类的。

PS:Epic的客服联系渠道还真是超难找…

CMD添加环境变量

cmd查看系统的环境变量,在cmd窗口中输入set

将执行路径添加至系统的PATH路径,使用setx

1
setx Path "%PATH%;C:\BuildPath\Adb";

添加自定义的环境变量:

1
setx ANDROID_HOME "%current_dir_name%\android-sdk-windows"

cmd中获取当前的目录:

1
set "current_dir_name=%cd%"

附上添加AndroidSDK环境的bat:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
set "current_dir_name=%cd%"
setx JAVA_HOME "%current_dir_name%\jdk18077"
setx ANDROID_HOME "%current_dir_name%\android-sdk-windows"
setx ANDROID_NDK_ROOT "%current_dir_name%\android-ndk-r14b"
setx ANT_HOME "%current_dir_name%\apache-ant-1.8.2"
setx GRADLE_HOME "%current_dir_name%\gradle-4.1"
setx NDK_ROOT "%current_dir_name%\android-ndk-r14b"
setx NDKROOT "%current_dir_name%\android-ndk-r14b"
setx NVPACK_NDK_TOOL_VERSION "4.9"
setx NVPACK_NDK_VERSION "android-ndk-r14b"
setx NVPACK_ROOT "%current_dir_name%"

自动以管理员权限启动bat

将依赖管理员权限启动的bat命令写到Admin之后即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
cd /d "%~dp0"
cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit

:Admin

CMD杀掉进程

在Linux中可以使用kill PID来干掉某一个进程。

在Cmd中可以使用taskkill来终止进程:

1
taskkill /f /t /im PROCESS_NAME.exe

如:

1
taskkill /f /t /im qq.exe

批量ping

有时候会有一堆的域名和ip需要进行ping测试,看是哪些ping不通,可以用下面的命令(将待检测的ip和域名都放到ip.txt中):

1
$ for /f %D in (ip.txt) do (ping %D -n 1 && echo %i>>ok.txt || echo %D >>no.txt)

修改Epub书籍的页面翻页方向

我们习惯的书籍是从左往右翻页的,但是在港台有些出版的书籍是从右往左翻页的,很不习惯。
今天我下了一本书就是这个样子的,研究了一下可以修改为从左往右的翻页方式。
首先把目标epub文件解压出来,找到content.opf文件,打开编辑,找到如下内容:

1
2
<spine page-progression-direction="rtl" toc="ncx">
</spine>

问题就是出在page-progression-direction="rtl"这里,从参数上可以看rtl就是right to left啊,改成ltr(left to right)后,把刚解压出来的所有文件压缩成zip文件然后把zip后缀改为epub即可。

无损转换AZW3到EPUB

使用Calibre默认的AZW3转换到EPUB中间是有损压缩的,可以安装Calibre的一个插件来实现无损转换。
在Calibre的首选项-插件下搜索KindleUnpack并安装,安装之后重启Calibre,可以看到工具栏有了一个KindleUnpack的按钮。

选中书籍后点击工具栏上的KindleUnpack按钮选择AZW3-UnpackAZW3

路由器级联:使两个路由器在同一网段

今天有个需求,需要把单独连接一个路由器A的几台电脑与连接其他路由器B的电脑配置在同一个局域网里。
方法为,关闭路由器A里的DHCP,从路由器B的LAN口拉一条网线过来查到路由器A的LAN口,其他的设备还接路由器A的LAN口,在路由器或者电脑的网络设置中设置过IP之后,路由器A就和路由器B连接的设备在同一个局域网下了。

VMWare扩展Linux虚拟机磁盘

首先在虚拟机启动之前(关闭状态下),调整虚拟机的磁盘大小:

经过漫长的等待…

与网上的其他方法不一样,我不打算列一堆命令,有一个最简单的方法。

那就是在虚拟机设置里添加一个CD/DVD的硬件,挂载GPrated的镜像,在选择CD-ROM加载之后,进去就是图形化的分区工具了,十分方便。

引导菜单:

启动之后:

Linux查看文件系统类型

查看文件系统类型可以使用以下命令:

1
$ df -Th

Chrome重启之后就暂停同步

打开 chrome://settings/content/cookies ,仅将本地数据保留到您退出浏览器为止取消勾选。重启 Chrome 即可。

隐藏bat的黑窗口

1
2
3
4
5
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
"%~dp0\Engine\Binaries\Win64\UE4Launcher.exe"

保存为.bat,将真正需要执行的命令写入begin之后即可。

MBR无损迁移到GPT

之前装系统使用的是MBR分区表,但是最近要折腾一下黑苹果,四叶草只能UEFI启动,所以必须要是GPT分区表,但是完全不想完全格掉重装,折腾了一下,可以无损迁移。
首先,要有一个可以启动并且有GHOST工具的U盘。

  1. 进入PE,使用GHOST备份当前MBR的C盘
  2. 备份完成后,删除原C盘硬盘的所有分区,修改分区表为GPT并创建好分区
  3. 在PE中使用GHOST将备份的系统还原到GPT的分区中
  4. 引导原版的系统镜像(将boot/efi/bootmgrbootmgr.efi放入恢复完成的分区)
  5. 重启进入原版镜像的安装模式,使用修复系统会重建EFI的系统引导,修复完成即可。

注意:4-5两个步骤可以使用其他的引导修复工具替代。

Windows窗口切换快捷键

Win+Shift+Left/Right:可以控制窗口在多个显示器上左移或者右移;
Win+Shift+Up:保持窗口宽度的同时最大化窗口;
Win+Shift+Down:最小化窗口;

PS:Win+Shift+S则是屏幕截图。

Linux创建软链接

1
2
$ ln -s $TargetPath $SoftLinkPath
# ln -s ~/blog newblog

Linux添加PATH路径

Linux上可以通过export来查看当前的PATH路径列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ export
declare -x HOME="/root"
declare -x LANG="en_US.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.webp=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.webp=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"
declare -x MAIL="/var/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/etc/ngrok_bin"
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="root"
declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share:/var/lib/snapd/desktop"
declare -x XDG_RUNTIME_DIR="/run/user/0"
declare -x XDG_SESSION_ID="2"

或者:

1
$ echo $PATH

输出当前用户的PATH路径。

  1. 直接在终端中添加PATH,只在当前环境有效,退出终端失效:
1
$ export PATH=$PATH:ADD_PATH
  1. 为当前用户添加PATH路径,打开~/.profile增加以下内容:
1
export PATH=$PATH:ADD_PATH

重启之后生效。

Windows查看程序的网络连接

首先在任务管理器中显示进程的PID,然后在cmd下执行命令:

1
netstat -ano|findstr PID

把PID换成你的进程ID即可。

apt-get update错误:无法验证签名

如果apt-get出现下列错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@gyvrhost:~/downloads/onedrive# sudo apt-get update && sudo apt-get -y --allow-unauthenticated
Hit:1 http://security.ubuntu.com/ubuntu artful-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu artful InRelease
Hit:3 http://archive.ubuntu.com/ubuntu artful-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu artful-backports InRelease
Get:5 https://netcologne.dl.sourceforge.net/project/d-apt d-apt InRelease [4,893 B]
Err:5 https://netcologne.dl.sourceforge.net/project/d-apt d-apt InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EBCF975E5BA24D5E
Reading package lists... Done
W: GPG error: https://netcologne.dl.sourceforge.net/project/d-apt d-apt InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EBCF975E5BA24D5E
E: The repository 'https://netcologne.dl.sourceforge.net/project/d-apt d-apt InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

如果不修复这个错误回在安装或升级软件包时出现问题,因为APT具有一组可信密钥,用于确定是否可以对软件包进行身份验证,从而决定是否可以在系统上安装软件包。
可以执行以下操作将缺失的密钥添加到APT密钥管理器:
上面的错误是告诉我们缺少EBCF975E5BA24D5E这个键,添加密钥使用以下命令:

1
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EBCF975E5BA24D5E

执行完毕即可解决错误。

Chrome浏览器由所属组织管理

解决办法,删除:

1
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome

下的EnabledPlugins文件夹,重启 Chrome 即可。

CMD命令:拷贝文件夹

windows下拷贝多级目录可以使用xcopy.

1
xcopy /y/i/s/e ..\..\..\Content\Slate UE4Launcher\Engine\Content\Slate

CMD命令:创建多级目录

1
md 123\456\789

tar.gz的压缩与解压缩

1
2
3
4
# 压缩
$ tar zcvf target.tar.gz target_dir/
# 解压缩
$ tar zxvf target.tar.gz

使用Calibre转换繁体为简体

首先,将原始的繁体书籍(epub/mobi)导入Calibre,然后使用转换:

在弹出的界面中选择搜索&替换,加载一个文字替换规则:Calibre繁体转简体规则

然后点元数据选择输出格式以及文件信息,最终点确定即可开始转换。

从GooglePlay下载图书并去除DRM

Google图书看书不方便,试了一下怎么把购买过的图书从GooglePlay上下载下来。
首先,打开play.google.com/books,找到你购买过的书,点击下载:

这里并不会把书真的下载下来,而是会下载下来一个*.ACSM文件。
然后需要下载Adobe Digital Editions来打开它,安装之后,将*.ACSM文件拖入_Adobe Digital Editions_的窗口中,会弹出下列窗口:

请选择我想要在不使用ID的情况下对我的计算机授权,之后点_下一步_:

授权
之后会自动下载书籍并且会在Adobe Digital Editions中打开,但是这些图书文件是使用DRM保护的,无法使用其他的阅读器打开。需要去除DRM才可以被其他的阅读器打开,需要使用的工具为Calibre和Calibre的去除DRM插件DeDRM_tools.
下载完Calibre之后安装,解压DeDRM_tools压缩包。
打开Calibre的首选项-插件:


点击从文件夹加载插件,选择DeDRM_plugin.zip

安装完成之后选择文件类型 插件,点自定义插件:

为ADE添加一个key:

然后重启Calibre.
最后将从ADE下载下来的具有DRM的图书文件拖入Calibre后即去除了DRM(Calibre Library里生成的图书文件).

Windows访问共享提示没有权限使用网络资源

如果Windows在访问共享的文件夹时提示:

无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。

解决办法:添加Windows凭证。
控制面板显示所有控制面板项,搜索凭据管理器,进入后点击Windows凭据,然后添加一个Windows凭据
根据需要访问的共享的IP和账户信息创建即可。

解决Windows在英文语言下中文字体太丑的问题

因为在中文语言下我替换了雅黑的字体,看起来不那么虚,但是当我把系统语言切换为English后发现中文的字体都很虚啊。
查了一些如何在英文语言下替换中文字体的方法,记录一下。

在英文版Windows中默认字体一般都是Segoe UI、Tahoma、Microsoft Sans Serif之类,这些字体都是没有中文字库的,所以当需要显示中文字体的时候,就会出现各种难看的文字效果。
解决方法是使用“字体链接(FontLink)”技术:就是在使用英文字体时,如果遇到这种字体中没有的字符,就会到注册表相应的位置去找它链接的字体。
英文版Win7的默认字体是Segoe UI,这是个纯英文字体。所以要显示中文的时候它就会去找它链接的字体。
打开注册表地址:

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink

这里面就是各个字体的链接字体的信息。
在这个键值下会发现Segoe UI,Tahoma这些常用英文字体的链接,查看Segoe UI的值,它的第一行为Tahoma.TTF,意思就是遇到中文时,它默认到Tahoma.TTF文件里去找,如果没有发现这个字,再到第二行的字体里去找。
双击编辑Segoe UI的项,可以看到雅黑的链接顺序在中间的位置,我们要做的就是把雅黑的顺序提到最前面:

替换后:

然后重启即可。

以防原链接失效,上面的部分内容摘录自后面的文章,作为本站的备份用。想要了解更具体内容可看这篇文章:解决英文版Windows中中文字体难看的问题

修改Android的DNS

编辑/system/build.prop加入以下几行:

1
2
3
4
net.rmnet0.dns1=1.1.1.1
net.rmnet0.dns2=8.8.8.8
net.dns1=1.1.1.1
net.dns2=8.8.8.8

保存退出即可(最好重启或者开关一下飞行模式。

tracert命令

路由跟踪,查看数据包访问目标所选择的路径。
Tracert 命令使用用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由.

禁用MIUI的更新提示

ROOT手机,安装RE文件管理器。
打开RE,找到路径/system下打开build.prop编辑:

1
ro.build.version.incremental=V9.5.8.0.OCAMIFA

修改为一个大的版本号:

1
ro.build.version.incremental=V99.5.8.0.OCAMIFA

保存后重启即可。

增强扫描版pdf

  • 首先下载ImageMagick并安装,注意勾选Install legacy components (convert.exe etc)
  • 然后安装Ghostscript(目的是为了使用convert命令)。
  • 将pdf转为图片

假设原始文件名是origin.pdf, 目标文件名是target.pdf, 下方的convert应替换为实际路径

1
$ convert -density 400 origin.pdf output/%03d.webp

上方的density参数指像素密度,数字越高图片质量越高体积越大, 如果pdf带文字,就设置300以上吧. 这是影响最终效果的重要参数, 如果过低, 那么下方再神操作效果也不会很好, 过高会导致文件体积过大该指令将整个pdf按页转为多张图片, %03d.webp表示命名为001.webp,002.webp….(超过1000页就应改为%04d.webp)转换为图片这一步, 是为了获取中间产物进行测试和调整, 通常只需截取一部分页面即可(因为截取一页需要花费数秒时间)

1
2
3
4
#截取第11到第21页
$ convert -density 400 origin.pdf[10-20] output/%04d.webp
#截取第10页
$ convert -density 400 origin.pdf[9] output/%04d.webp
  • 测试转换效果
1
$ convert -level 60,97% -quality 50 output/010.webp preview010.webp

上方的level参数是指调整图像通道的级别, 60,97%表示灰度低于60%即为黑点, 高于97%为白点. 这里的60,97需要反复调节到自己认为达到最佳效果, 这是整个过程中最重要的参数, 通过该参数实现调整对比度quality指输出jpg文件质量(压缩比), 1-100数字越高质量越高体积越大, 出于减少pdf文件大小的考虑, 应适当调节该参数(举个例子density 400的jpg文件可能有1.4M, 压缩后为700K, 这样最终的pdf文件大小相差一倍, 而肉眼无法察觉页面效果有何区别)

二值化图片
扫描的pdf很多都是泛黄的,影响观感,可以通过ImageMagick将图片处理为黑白的:

1
convert 0020.webp -threshold 55% threshold0020.webp

经过尝试,阈值选择在140(255*55%)附近时,分割效果较好。灰度值大于该阈值的像素全部变为255(白色),灰度值低于该阈值的像素全部变为0(黑色)。

  • 转为pdf

确定了density, level和quality的值之后就可以执行转换了可以从原始pdf转换

1
$ convert -density 400 origin.pdf -level 40,97% -quality 50 target.pdf

也可以从之前生成的jpg转换:

1
$ convert -level 60,97% -quality 50 output/* target.pdf

如果直接从目录转换为pdf打开显示有问题,可以将导出的文件批量处理之后再使用福昕之类的软件合并:

1
find . -name "*.webp"|xargs -I {} convert -level 60,97% -quality 50 {} {}_.webp

把当前目录下所有的.webp增强处理之后另存为*.webp_.webp.
然后把它们移动到单独的目录(-I {}的作用是把后续的{}替换为参数):

1
2
$ mkdir finalOutput
$ find . -name "*_.webp"|xargs -I {} mv {} ./finalOutput

然后使用福昕合并成pdf文件即可(顺便也可以做OCR)。

Windwos上使用MinGW编译LLVM

首先,下载LLVMClang源码,并解压。
将Clang的源码(cfe-6.0.1.src)目录改名clang后放到LLVM源码的tools目录下($LLVM_SRC_ROOT/tools/clang)。
在LLVM源码目录右键打开Git Bash终端,执行下列命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkdir build
$ cd build

# cmake参数
# G为要生成的格式,用MinGW,这里大小写必须写对,写错的话会有提示。
# CMAKE_BUILD_TYPE为构建类型,可以写Debug,Release,MinSizeRel。
# CMAKE_INSTALL_PREFIX为install路径,一般这里路径最好保守一些,尽量不要用中文或空格。
# CMAKE_MAKE_PROGRAM这里写不写都可以,如果用Ninja编译的话,这里就必须写了。
$ cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=D:\LLVM -DCMAKE_MAKE_PROGRAM=mingw32-make.exe ..
# 执行编译
$ mingw32-make
# 编译完毕后执行安装
$ mingw32-make install

安装完之后就可以在CMAKE_INSTALL_PREFIX指定的目录看到编译完的LLVM和Clang了,将其添加到系统Path路径即可。
我编译好的版本(目前最新LLVM 6.0.1),编译环境为MinGW64-x86_64-6.2.0-posix-seh-rt_v5-rev1,可以在这里下载。
注:其他的细节可以看Clang源码目录下的INSTALL.TXT文件。

  • 2018.09.27 这几天LLVM出了7.0.0版本,果然是版本帝。我又编译了一个7.0.0版本的,编译环境与上文相同:点此下载

解决cmder中文乱码


打开cmder设置Startup-Environment,添加 set LANG=zh_CN.UTF-8即可。

apk的反编译与签名

  1. 安装java环境,jdk下载
  2. 下载最新版本的apktool.jar,并且重命名为apktool.jar
  3. 保存下列脚本为apktool.bat
1
2
3
4
5
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*

然后将apktool.bat和apktool.jar放在同一个目录下。或者直接下载我打包的apktool

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 反编译apk
$ apktool.bat d -o <output_dir> <input.apk>
# 修改完成后重新编译apk
$ apktool.bat b -o <output.apk> <input_dir>

# 生成keystore文件

# -genkey 产生证书文件
# -alias 产生别名
# -keystore 指定密钥库的.keystore文件中
# -keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
# -validity 为证书有效天数,这里我们写的是40000天
$ keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

# 签名到appk,记得替换<input.apk>为需要签名的apk文件
$ jarsigner -verbose -keystore demo.keystore <input.apk> demo.keystore

查看keystore证书指纹

1
keytool -list -v -keystore xxxx.keystore -storepass PASSWORD

树莓派命令行配置连接Wifi

在树莓派上的Wifi连接信息是保存在/etc/wpa_supplicant/wpa_supplicant.conf文件中的:

1
2
3
4
5
6
7
8
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="APName"
psk="password"
key_mgmt=WPA-PSK
}

照着network中的配置信息把ssid与psk填上就可以了。
注意:优先连接的顺序是配置的顺序,如果你希望优先连接某一个AP,那么将它的配置挪到最前面。

关闭Windows休眠来释放磁盘空间

Windows下的休眠文件hiberfil.sys一般很大,都有十几个G,而我一般也很少用到休眠功能,可以使用下面的命令关闭。
以管理员权限运行cmd:

1
powercfg -h off

重启系统即可,hiberfil.sys所占的空间就会被释放了。

远程控制下切换窗口到另一个屏幕

有些VNC工具对多屏幕支持不友好,只能显示一个屏幕上的窗口内容,如果所有的打开窗口默认都在另一个屏幕,则软件都操作不了了。
Windows移动窗口的快捷键是:
Alt+Space出现菜单,然后按M,就是移动功能。
可以使用鼠标或者上下左右键来移动窗口到远程可以看到的屏幕。

Windows窗口快捷键

最大化:在窗口下按:Alt+Space+X
最小化:在窗口下按:Alt+Space+N

Wget下载网站

1
$ wget -c -r -np -k -L -p api.unrealengine.com/INT/API/

参数如下:

-c 断点续传
-r 递归下载,下载指定网页某一目录下(包括子目录)的所有文件
-nd 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录
-np 递归下载时不搜索上层目录,如wget -c -r www.xxx.org/pub/path/
没有加参数-np,就会同时下载path的上一级目录pub下的其它文件
-k 将绝对链接转为相对链接,下载整个站点后脱机浏览网页,最好加上这个参数
-L 递归时不进入其它主机,如wget -c -r www.xxx.org/
如果网站内有一个这样的链接:
www.yyy.org,不加参数-L,就会像大火烧山一样,会递归下载www.yyy.org网站
-p 下载网页所需的所有文件,如图片等
-A 指定要下载的文件样式列表,多个样式用逗号分隔
-i 后面跟一个文件,文件内指明要下载的URL

Linux查看nohup.out

1
$ tail -fn 50 nohup.out

WSL换源

WSL的Ubuntu使用的是Ubuntu 16.04版本,可以通过lsb_release -a查看:

1
2
3
4
5
6
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

备份/etc/apt/sources.list,然后替换其中的内容为国内阿里源:

1
2
3
$ sudo cd /etc/apt
$ sudo mv sources.list sources.list.backup
$ sudo nano sources.list

把下面的内容填入其中,保存退出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

然后更新即可:

1
$ sudo apt-get update

清理Mstsc的历史记录

清理mstsc的历史记录只需要把下面这个注册表项里的记录删除即可:

1
[HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default]

修改Win10远程连接的默认端口

这几天使用frp做内网穿透,在公司也可以通过mstsc来访问内网的电脑,但是使用默认的端口(3389)感觉又不安全(总有无良开扫描器的),研究了一下怎么修改win10默认的远程连接端口,具体操作如下。

打开下面两个注册表项,依次执行下列操作:

1
2
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/Wds/rdpwd/Tds/tcp
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/WinStations/RDP-Tcp

在这两个注册表项的右侧找到PortNamber记录,可以看见其默认值是3389,修改成所希望的端口(<65535)即可(如11111),注意使用十进制。

然后还需要修改防火墙的放行端口,因为Windows的远程连接默认端口是3389,所以3389防火墙是默认放行的,但是上面修改之后的端口是不行的,所以要修改一下。
依次打开这两个注册表项,执行下面的操作:

1
2
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/SharedAccess/Defaults/FirewallPolicy/FirewallRules
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/SharedAccess/Parameters/FirewallPolicy/FirewallRules

在这两个注册表项的右侧找到这两个记录:RemoteDesktop-UserMode-In-TCPRemoteDesktop-UserMode-In-UDP:
他们的值默认情况下类似下面这样:

1
v2.28|Action=Allow|Active=FALSE|Dir=In|Protocol=6|LPort=3389|App=%SystemRoot%\system32\svchost.exe|Svc=termservice|Name=@FirewallAPI.dll,-28775|Desc=@FirewallAPI.dll,-28756|EmbedCtxt=@FirewallAPI.dll,-28752|

我们只需要将这两个记录里面的LPort改为我们上面修改的端口(11111)即可。

然后就可以在控制面板/系统和安全/防火墙/高级设置/入站规则里点刷新之后看到我们修改之后的端口了(我的端口已打码..):

查看Linux系统上所有的服务

1
$ service --status-all

注:在我的系统版本(ubuntu 16.04.3 LTS)上iptables的服务是ufw

Linux防火墙放行端口

如果是使用ufw服务的话可以使用这种方法:

1
2
$ ufw allow 6060/udp
$ ufw allow 6060/tcp

允许特定端口范围通过防火墙
使用 UFW 指定端口范围时,必须指定规则适用的协议( tcp 或 udp ),以下为示例:

1
2
$ ufw allow 10000:10100/tcp  #允许 10000~10100 端口的 tcp 通过防火墙
$ ufw allow 10000:10100/udp #允许 10000~10100 端口的 udp 通过防火墙

如果是使用iptable服务的话可以使用下面的方法:

1
2
3
4
# 接受从端口6060的入站的UDP连接
$ iptables -A INPUT -p udp --destination-port 6060 -j ACCEPT
# 丢弃从6060入站的UDP数据包
$ iptables -A INPUT -p udp --destination-port 6060 -j DROP

更多ufw的用法:Ubuntu 18.04 使用 UFW 设置防火墙

iptables的参数:

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
iptables v1.4.21

Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--wait -w wait for the xtables lock
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.

一些参数缩写:

  • --sport is short for --source-port
  • --dport is short for --destination-port

Linux下递归删除特定文件

如果我们期望递归删除当前目录下的所有Binaries文件夹,可以使用以下命令:

1
$ find . -name "Binaries" | xargs rm -rf

就是先通过find找到当前目录下所有的Binaries文件夹,然后通过xargs这个构造参数列表并运行rm -rf命令。

在WSL中跑SS和KCP

最近公司把shadowsocks-windows的进程给禁用了,ss-qt的版本有很多问题十分难用。想着继续用其他SS的win客户端依然治标不治本,我把shadowsocks-python跑在了Win10的WSL里,感觉用起来比win客户端稳定很多…
注:kcp的客户端也可以跑在WSL里,直接从kcptun/release下载linux-amd64版本的即可,具体用法见./client_linux_amd64 -h的参数。

1
2
3
4
5
# start kcp
$ nohup /etc/client_linux_amd64 --localaddr ${KCP_LOCAL_ADDR} --remoteaddr ${KCP_SERVER_ADDR:KCP_SERVER_PORT} --key ${KCP_PASSWORD} --crypt none --mode fast3 --mtu 1350 --sndwnd 512 --rcvwnd 512 --datashard 10 --parityshard 3 --dscp 0 --quiet false >/dev/null 2>&1 &

# start ss(using kcp)
$ python /usr/local/lib/python2.7/dist-packages/shadowsocks/local.py -s 127.0.0.1 -p ${KCP_LOCAL_ADDR} -k ${SS-SERVER-PASSWORD} -b 0.0.0.0 -l ${SS-LOCAL-PORT} -m aes-256-cfb -t 600

注:其中shadowsocks的-b参数为0.0.0.0,表示允许来自局域网的连接(注意关闭防火墙)。

这样就不需要读配置文件了,但注意各项参数都改为你自己的配置值。

IDA的插件和配置

注:版本为IDA 7.0 Pro
我的IDA配色插件zyantific/IDASkins和主题:ida_skin,效果如下:

还有我编译的支持IDA7.0的REhints/HexRaysCodeXplorer:ida7_HexRaysCodeXplorer.

IDA安装findcrypt

1
2
3
4
5
# 可能需要先更新pip
$ python -m pip install --upgrade pip

# 之后安装 yara-python
$ pip install yara-python

然后将findcrypt-yara仓库里的findcrypt2.pyfindctypr3.rules这两个文件放在进入Ida/plugins目录下,打开IDA即可在插件目录看到findcrypt了。

删除包含某些字符的行

在Linux下可以使用sed命令:

1
2
3
4
5
6
7
8
# 将abc.txt中所有含有"ABC"这个连续字符的行删除并写入到log.txt中
sed -e '/ABC/d/' abc.txt > log.txt
# 将自身所有含有"ABC"这个连续字符的行删除并保存
sed -i -e '/ABC/d' abc.txt

# 要删除的字符参数可以指定多个,只需要指定多个-e
# 将含有ABC和DEF的行都删除
sed -i -e '/ABC/d' -e '/DEF/d' abc.txt

其中-e的参数ABC也可以使用正则表达式来代替。

启用Chrome自动禁用的插件

通过运行->gepdit进入组策略。
计算机配置->管理模板右键选择添加/删除模板(A),导入Chrome.adm
然后在管理模板下就会有经典管理模板(ADM),依次展开Google->GoogleChrome->扩展程序;双击右侧配置扩展程序安装白名单,启用它并把我们想要启用的扩展程序的ID(扩展程序ID可以从Chrome->扩展程序中查看)填入其中保存即可,重新打开Chrome,那个插件就可以启用了。
Enable-Chrome-Local-Plugin

注:将Cortana的搜索默认使用Chrome以及Google.
使Cortana默认使用Google作为搜索引擎的插件CortanaUseGoogle.crx(需要使用上面的方式将该插件加入到扩展程序安装白名单中).同时组合EdgeDeflector可以将Cortana使用的默认浏览器由Edge改为Chrome.

VS附加到进程的错误

今天使用VS的Debug->Attach to process产生了一个错误:

MS2017-AttachToProcessField

1
Unable to attach to the process.The Visual Studio 2017 remote Debugger(MSVCMON.EXE) does not appear to be running on the remote computer.This may be because a firewall is preventing communication to the remote computer.Please see Help for assistance on configuring remote debugging.

本来以为是VS的配置问题,后来才发现这是因为我在Proxifier中把电脑上的所有流量转发到了SS,没想到VS的本地调试也是走网络的,流量通过代理之后一直连接不到本地计算机就会出现这个问题,全局代理需谨慎。

Separate memory location

[ISO/IEC 14882:2014 §1.7.5] A structure declared as:

1
2
3
4
5
6
7
8
struct {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
}

contains four separate memory locations: The field a and bit-fields d and e.ee are each separate memory locations, and can be modified concurrently without interfering with each other. The bit-fields b and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently modified, but b and a, for example, can be.

Linux增加SWAP大小

有时候给虚拟机能够实际分配的内存大小不能满足于虚拟机的需求,可以扩大SWAP来临时解决,方法如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建1G大小的文件(/swap_file为指定存放该文件路径及名字)
$ sudo dd if=/dev/zero of=/swap_file bs=1M count=1024
# 改变创建的swap_file文件权限:
$ sudo chmod 600 /swap_file
# 使用mkswap设置上面创建的文件为SWAP文件
$ sudo mkswap /swap_file
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=f6286522-5b12-46d9-a4a3-ef151547841c
# 启用SWAP文件
$ sudo swapon /swap_file
# 在fstab文件中加入一条记录,开机时挂载该SWAP文件
$ sudo vim /etc/fstab
# 在/etc/fstab中加入下面一行内容
/swap_file swap swap defaults 0 0

Linux静态IP设置

下面需要修改的文件路径为/etc/network/interface.

1
2
3
4
5
6
7
8
9
10
11
# The loopback network interface
auto lo
iface lo inet loopback

# The primry network interface
auto eth0
# iface eth0 inet dhcp 为自动获取分配IP
iface eth0 inet static
address 192.168.2.111
netmask 255.255.255.0
geteway 192.168.2.1

一些cmd命令技巧

cmd命令里是让他们同时执行几个命令:

1
2
start cmd.exe /c ""
start cmd.exe /c ""

在上面双引号内输入要执行的命令,保存为.bat;运行时会同时打开两个命令行窗口。
cmd/c的意思为执行完命令后关闭命令窗口;如果想要执行完不关闭可以使用/k

cmd中让命令在后台执行不会阻塞后续命令的方式(类似于linux命令后加&):

1
2
start /b cmd.exe /c ""
start /b cmd.exe /c ""

start加入/b,这两条命令就不会阻塞(不会等到第一条命令执行完毕之后再执行第二条)。

.bat后台执行,有些.bat我们希望开机启动,这时候开机弹出黑框框就不太好,可以使用下面的.vbs脚本来执行.bat

1
2
3
DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("cmd.exe /C hideRuningBat.bat", 0, TRUE)