软件技巧


GIST NOTES

注意:使用GIST管理的笔记,在国内网络可能会无法显示。

Xcode与clang版本对照

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包名。

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: [email protected]
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

安装的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

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
[email protected]:/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! <[email protected]>

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 [email protected]:/Users/buildmachine/Client/Binaries/IOS/FGame.dSYM D:\

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

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

1
pscp.exe -batch -pw 123456 -P 22 [email protected]:/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
[email protected]:~/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

树莓派命令行配置连接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|[email protected],-28775|[email protected],-28756|[email protected],-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)