0%

由于某些需求,决定上SSD,提高一下硬盘读写速度。上二手东买了三星(SAMSUNG) 860 EVO
最初的想法是作为数据盘使用,即操作系统还是跑在机械硬盘上,仔细一思考,还是折腾
一下,要不实在是有些浪费,事实证明,折腾是值得的,感觉就想飞一样。

首先查看一下原始的情况:

1
2
3
4
$ mount

/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,stripe=4)
/dev/mapper/fedora-root on / type ext4 (rw,relatime,seclabel)

当然首先要把SSD处理一下,安装一下 gparted 图形化界面很好用。建个分区表,选择
gpt,分个区,/dev/mapper/fedora-root 大小为50G,先分个50G的分区,剩下的全部给
另外一个分区,格式化为 ext4。操作完成后,用fdisk 查看一下:

1
2
3
4
5
6
7
8
9
10
11
12
$ fdisk -l

Disk /dev/sdb:232.9 GiB,250059350016 字节,488397168 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:

设备 起点 末尾 扇区 大小 类型
/dev/sdb1 2048 104859647 104857600 50G Linux 文件系统
/dev/sdb2 104859648 488396799 383537152 182.9G Linux 文件系统

将原来系统的 / dd 到新的SSD,

1
dd if=/dev/mapper/fedora-root of=/dev/sdb1 bs=1M

用新的root 把系统启动起来,reboot 后进入引导界面,按e 编译,找到
root=/dev/fedora/root 改为 root=/dev/sdb1 按 ctrl+x 启动,一会儿就进系统了,速度
提升很大。现在需要把 grub.cfg 更新一下,因为我们是手动修改进入了新的根,如果重启
的话,还是会使用老的根,因为grub.cfg 里就是这么写的。

要生成新的grub.cfg 需要使用grub2-mkconfig, 命令很简单

$ grub2-mkconfig -o /boot/grub2/grub.cfg

执行后重启,md 怎么又进到老根去了。这里折腾了好久,第一个问题fedora 的内核出bug
了,每次重启都要等待非常久的时间,所以需要升级,所以正确的顺序应该是先升级系统再
dd,没办法升级系统重新 dd

解决了fedora 内核的问题后,发现还是进不到新根。只要认真地看 grub.cfg, grub2 改动
挺大,不太熟悉了。

1
2
3
4
#                                      
# DO NOT EDIT THIS FILE #
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub

启动有两个信息,确实是使用 grub2-mkconfig 生成,/etc/default/grub 里有配置

1
2
3
4
5
6
7
8
9
10
$ cat /etc/default/grub


GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

grub2-mkconfig 里用这句

1
GRUB_DEVICE="`${grub_probe} --target=device /`"  

执行查看结果, 发现正确

1
2
3
$ grub2-probe --target=device /

/dev/sdb1

可是为什么不能正确启动呢,看看生成的 grub.cfg 文件

linux16 /vmlinuz-4.17.2-200.fc28.x86_64 root=UUID=290a98e3-7937-49db-a971-4d0e49567cf0

使用的是 UUID,并不是 /dev, 查看一下各分区的 uuid

1
2
3
4
# blkid

/dev/sdb1: UUID="290a98e3-7937-49db-a971-4d0e49567cf0" TYPE="ext4" PARTUUID="fe64f395-7520-42c3-939b-b17eb7064cec"
/dev/mapper/fedora-root: UUID="290a98e3-7937-49db-a971-4d0e49567cf0" TYPE="ext4"

由于dd 的原因,/dev/sdb1 和 /dev/mapper/fedora-root 的 UUID 居然是相同的。第一个
想法是把/dev/sdb1 的 UUID 给改了。放狗搜发现有下面的方法

1
2
3
4
$ uuidgen 
8e4c27b2-c63e-4d1d-8ac4-5ddd90669eb0

tune2fs /dev/{device} -U {uuid}

可是tune2fs 时报错,死活改不过来。lzx 提示可以看看如何是grub.cfg 不使用uuid,
发现有个参数 GRUB_DISABLE_UUID=true, 在 /etc/default/grub 加上这行,重新生成
grub.cfg 重启,一切 OK 进入到SSD 的新root

有的系统上的参数可能不太一样,ubuntu 系统里这个参数好像的是 GRUB_DISABLE_LINUX_UUID=true
可能需要确认一下。

  • EOF

上周媳妇的 iPhone 提示内存满了,重启后就进入白苹果状态。安装 itunes 以更新的方式重刷系统后恢复正常 (如果选择恢复模式则会丢失数据)。
刷系统的时候一度遇上 14 错误,重新使用更新系统的方式再刷了一遍后,顺利通过 (运气不错)。顺利登录 iPhone 后马上删除各种 App,清理后台驻留的程序,在此也提示大家 iPhone 手机也是要定期维护啊。

说起来就上面几句话,实际操作起来比较麻烦,大概弄了一个早上,把几个要点总结一下。

强制重新启动 iPhone

其实在刷机前我尝试了强制重启 iPhone,强制重启 iPhone 的方法可以参考下面链接:
https://support.apple.com/zh-cn/guide/iphone/iph8903c3ee6/ios

新版 iPhone 可以使用下面的方法

1
2
3
4
5
强制重新启动配备面容 ID 的 iPhone

若要强制重新启动 iPhone X、iPhone XS、iPhone XR、iPhone 11、iPhone 12 或 iPhone 13,请执行以下操作:

按下并快速松开调高音量按钮,按下并快速松开调低音量按钮,然后按住侧边按钮。当 Apple 标志出现时,松开按钮。

但是强制重启 iPhone 并没有成功,手机依然处于白苹果状态没有响应。

进入 DFU 模式

不进入 DFU 模式无法刷机,iPhone 不同机型进入 DFU 模式的方法不相同,具体的可以参考下面链接:
https://support.apple.com/en-us/HT201263

1
2
3
iPhone 8 or later: Press and quickly release the Volume Up button. 
Press and quickly release the Volume Down button.
Then, press and hold the Side button until you see the recovery mode screen.

安装 itunes 刷机

安装 itunes 的过程就不在细说了,正常安装即可。更新过程需要注意中间某个步骤可能耗时很长,不要着急得慢慢等,Apple 还专门有链接说明这个问题。
https://support.apple.com/zh-cn/HT203435

1
2
3
4
5
6
7
出现这种情况后,进度条可能移动非常缓慢或似乎不移动。

请等待设备完成更新、恢复或抹掉过程。

进度条会显示安装进度。所用时间取决于设备上的文件数量,以及您是要抹掉、更新还是升级 iOS 或 iPadOS。
如果设备上只有很少数据或没有数据,或者如果您要抹掉设备上的数据,这个过程可能只需一分钟时间。
如果设备包含大量文件,则这个过程可能需要数分钟至一小时不等。

刷机过程中大概率会遇上 14 错误,网络上说法很多大概就两点。

  • (1)挑线,要保证 USB 数据线有效,优先使用 USB 2.0
  • (2)多刷几次,反复刷

我这次运气不错,遇上 14 错误后,换了个 USB 2.0 的口重刷一次就过了,祝大家好运。

重启后需要输入密码,提示尝试恢复数据,进度跑完就大功告成了。

事后的清理工作

恢复完数据,登录媳妇的手机发现以下几点问题:

  • (1) 手机存储空间紧张
  • (2) 后台驻留的程序比较多

导致白苹果的原因未知,将这些问题解决了一下,希望能正常使用了。

SSL pinning

SSL Pinning是一种防止中间人攻击的技术,主要机制是在客户端发起请求–>收到服务器发来的证书进行校验,如果收到的证书不被客户端信任,就直接断开连接不继续请求。可以发现中间人攻击的要点是伪造了一个假的服务端证书给了客户端,客户端误以为真。解决思路就是,客户端也预置一份服务端的证书,比较一下就知道真假了。

SSL-pinning有两种方式:证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。

证书锁定

需要在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书,通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此客户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是在证书续期后需要将证书重新内置到APP中。

公钥锁定

提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。

(此小节内容摘抄自互联网)

总体思路

使用 mitmproxy https://github.com/mitmproxy/mitmproxy 进行抓包,使用 frida 绕过 SSL pinning, frida 的安装和使用这里就不再详述了,可以参考其他资料。

安装 mitmproxy

参考 https://docs.mitmproxy.org/stable/overview-installation/ 文档

可以直接下载 Linux binary: https://snapshots.mitmproxy.org/7.0.2/mitmproxy-7.0.2-linux.tar.gz, 或者使用 pip 进行安装 https://pypi.org/project/mitmproxy/
执行命令 ~/.local/bin/pip3 install mitmproxy --user

安装成功之后,有三个程序可以使用: mitmproxymitmdumpmitmweb

设置代理

在主机上执行下面几行命令设置代理

1
2
3
mitmweb -p 8080
adb shell settings put global http_proxy 127.0.0.1:8888
adb reverse tcp:8888 tcp:8080

mitmweb -p 8080 在本机起 8080 代理,在 Android 上设置 http 全局代理 127.0.0.1:8888, 最后将 Android 的 8888 端口转发到本机 8080 端口

设置 CA

https://docs.mitmproxy.org/stable/concepts-certificates/

1
The first time mitmproxy is run, it creates the keys for a certificate authority (CA) in the config directory (~/.mitmproxy by default).
Filename Contents
mitmproxy-ca.pem The certificate and the private key in PEM format.
mitmproxy-ca-cert.pem The certificate in PEM format. Use this to distribute on most non-Windows platforms.
mitmproxy-ca-cert.p12 The certificate in PKCS12 format. For use on Windows.
mitmproxy-ca-cert.cer Same file as .pem, but with an extension expected by some Android devices.

我们是 Android 应该使用 mitmproxy-ca-cert.cer,在 Android 系统安装的话,需要点击 设置 -〉安全 -〉 加密与凭证 -〉安装证书 -〉CA 证书

使用 frida 绕过 SSL pinning

使用 frida 脚本首先需要将 mitmproxy-ca-cert.cer 上传到 /data/local/tmp/cert-der.crt

使用脚本 https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/

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
/*
Android SSL Re-pinning frida script v0.2 030417-pier

$ adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt
$ frida -U -f it.app.mobile -l frida-android-repinning.js --no-pause

https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/

UPDATE 20191605: Fixed undeclared var. Thanks to @oleavr and @ehsanpc9999 !
*/

setTimeout(function(){
Java.perform(function (){
console.log("");
console.log("[.] Cert Pinning Bypass/Re-Pinning");

var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
var FileInputStream = Java.use("java.io.FileInputStream");
var BufferedInputStream = Java.use("java.io.BufferedInputStream");
var X509Certificate = Java.use("java.security.cert.X509Certificate");
var KeyStore = Java.use("java.security.KeyStore");
var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
var SSLContext = Java.use("javax.net.ssl.SSLContext");

// Load CAs from an InputStream
console.log("[+] Loading our CA...")
var cf = CertificateFactory.getInstance("X.509");

try {
var fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");
}
catch(err) {
console.log("[o] " + err);
}

var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();

var certInfo = Java.cast(ca, X509Certificate);
console.log("[o] Our CA Info: " + certInfo.getSubjectDN());

// Create a KeyStore containing our trusted CAs
console.log("[+] Creating a KeyStore for our CA...");
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log("[+] Our TrustManager is ready...");

console.log("[+] Hijacking SSLContext methods now...")
console.log("[-] Waiting for the app to invoke SSLContext.init()...")

SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {
console.log("[o] App invoked javax.net.ssl.SSLContext.init...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);
console.log("[+] SSLContext initialized with our custom TrustManager!");
}
});
},0);

执行下面命令,绕过 SSL pinning

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
frida -U --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida -F

____
/ _ | Frida 14.2.18 - A world-class dynamic instrumentation toolkit
| (_| |
> _ | Commands:
/_/ |_| help -> Displays the help system
. . . . object? -> Display information about 'object'
. . . . exit/quit -> Exit
. . . .
. . . . More info at https://frida.re/docs/home/

[.] Cert Pinning Bypass/Re-Pinning
[+] Loading our CA...
[o] Our CA Info: O=mitmproxy, CN=mitmproxy
[+] Creating a KeyStore for our CA...
[+] Creating a TrustManager that trusts the CA in our KeyStore...
[+] Our TrustManager is ready...
[+] Hijacking SSLContext methods now...
[-] Waiting for the app to invoke SSLContext.init()...
[Pixel 2::智能生活]-> exit

其中 -F 参数 attach to frontmost application 不用指定 pid 或者包名,非常方便。

使用 mitmweb 查看报文

执行 mitmweb -p 8080 后可以用浏览器访问 http://127.0.0.1:8081/ 查看报文,如果需要共享报文数据可以使用
mitmweb 界面提供的 save 功能,会保存成一个 flow 文件,后面使用 mitmweb 界面提供的 open 打开报文文件即可展示报文详细信息。

参考资料

https://shunix.com/ssl-pinning/

沉浮 A股多年,发现一个比较重要的规律,A 股变盘的时间节点大多发生在重大节假日期间,分别举例如下:

  • 「1」重大节日 (包括阳历和农历: 劳动节,国庆节,中秋节,端午节,过年 等)
  • 「2」周一/周五
  • 「3」月初/月末

有人总结出 A 股变盘时间节点和农历的 24 节气相关,每个节气的时间间隔大致在 15 到 16 天左右,这条规律
其实和上面的 「1」 说法是一致的。

思考其背后的原因,平时交易日都是连续的中间无间断,大家的交易思路和看法也比较容易连续一致。
每逢重大节日,或者月初月末,往往都是放假休息的时间,外加期间各种信息的输入量比平时大很多,这样容易有思维波动。重大节日后,主力一带节奏,容易对大家的思维进行强化,分歧转一致后,就真的变盘了。

A股还有个月初,月末效应,月初赚钱,月末亏钱,比较奇怪,可能和基金经理的月初建仓和月末考核相关,这条规律几乎是对称的,如果月末没有大跌,月初基本就没有大赚效应。

后面发现居然有一个股票技术分析流派叫季节派。(季节理论 Season Theory)

afl-fuzz 的整体架构,新手理解起来还是比较费劲,网络上发现一张图觉得不错,放上来大家看看,感谢原作者。

afl-fuzz

要正常使用 frida 首先需要把手机给 root 了, 在最近测试的情况发现 Android 10 和 Android 11 系统工作比较正常, Android 6
和其他系统似乎差一些?

要刷机首先需要下载 adb 等工具,这些工具由 Android 的 SDK platform tools 提供,下载地址为:https://developer.android.com/studio/releases/platform-tools
选择相应的操作系统版本下载即可, Google 提供了 Windows、Linux、Mac 等系统的支持。

基础镜像可以选择的 Google 的官方镜像 Factory Image,如果能自己编译 Android 系统则更好,在调试的时候可以看到系统库的符号。

我的 Android 手机为 Pixel 2 在 https://developers.google.com/android/images#walleye 上可以查找相应的镜像, 下个最新的 https://dl.google.com/dl/android/aosp/walleye-rp1a.201005.004.a1-factory-0c23f6cf.zip

要想刷镜像前提条件是先要解锁 bootloader, Pixel2 新手机解锁的命令和以前有变化,可以参考 https://source.android.com/devices/bootloader/locking_unlocking

1
2
adb reboot bootloader
fastboot flashing unlock_critical

下载解压后,里面有个 flash-all 的脚本,将手机重启到 fastboot 模式后可以直接运行, adb reboot bootloader, 重启到 fastboot 模式后,执行 flash-all 脚本,刷机系统镜像就完成了。

以前 root Android 用的都是 SuperSU 和 TWRP, 这次使用了一个不同的方法 Magisk , 安装的方法参见:
https://topjohnwu.github.io/Magisk/install.html

有两种模式, patch boot 或者 patch recovery, 安装 Magisk app 后如果界面显示 Ramdisk:Yes,则需要 patch boot。
Magisk app 的下载地址 https://github.com/topjohnwu/Magisk/releases/download/v23.0/Magisk-v23.0.apk

安装 Magisk app 后, 选择需要 patch 的镜像文件,选择后会自动生成新的修改过后的镜像文件。
获得修改后的镜像文件后,需要将修改后的镜像文件重新刷一次

1
fastboot flash boot /path/to/magisk_patched.img #or fastboot flash recovery /path/to/magisk_patched.img

刷完新的修改后的镜像,重启系统,Root 就完成了。

现在 fcitx 已经升级到了 fcitx5, 本来用着 fcitx4 挺好,也没有想着升级,在折腾 fcitx.vim 的时候发现 fcitx 居然升级了,
使得我的 vim 插件无法正常工作了,一顿折腾,本来以为很简单没想到进了个大坑 。
主要是不愿意放弃我的一万多行的 rime 用户词库,多年的积累了,不过 Linux 用户不就是老折腾吗, 唉。

fcitx5-rime 的默认的配置目录已经变为 ~/.local/share/fcitx5/rime, fcitx4 默认的配置目录是 ~/.config/fcitx/rime

安装 fcitx5 和 fcitx5 rime

1
2
sudo dnf install -y fcitx5 fcitx5-autostart fcitx5-chinese-addons fcitx5-configtool fcitx5-gtk fcitx5-qt
sudo dnf install -y fcitx5-rime

Fedora dnf 已经默认有 fcitx5-rime 的安装包了,不用自己重新编译了,非常不错。 fcitx5-chinese-addons
为 fcitx5 自己默认带的中文输入法,这些和 rime 没有什么关系,网络上有人说, fcitx 的中文输入较以前有较大改进。
fcitx5-autostart 用于自启动。后面发现系统自带的启动环境变量好像设置的有问题,不安装其实也没有什么问题,
自己手动执行 fcitx5 -d 即可。

设置正确的环境变量

修改 ~/.xprofile~/.zshrc/etc/profile 等文件

1
2
3
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS="@im=fcitx5"

编译 fcitx5-qt5

为了使我们自己编译的 vnote 可以正常使用 fcitx5, 需要编译 fcitx5-qt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone git@github.com:fcitx/fcitx5-qt.git

cat << EOF > build_linux.sh
QTDIR="/home/henices/Qt5.12.9/5.12.9/gcc_64/"
PATH="$QTDIR/bin:$PATH"
LDFLAGS=-L$QTDIR/lib
CPPFLAGS=-I$QTDIR/include

rm -rf build
mkdir -p build
cd build
cmake ..
make -j8
EOF

bash build_linux.sh

编译完成后将生成的 so 文件 copy 到 qt 的插件目录:

1
2
cd build
cp ./qt5/platforminputcontext/libfcitx5platforminputcontextplugin.so /home/henices/Qt5.12.9/5.12.9/gcc_64/plugins/platforminputcontexts/

配置中文环境

1
2
3
4
sudo vim /etc/locale.conf

export LANG="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"

安装 rime 词库

rime 现在已经使用 plum 管理词库,如果需要安装双拼输入法的,可以执行下面的命令:

1
2
curl -fsSL https://git.io/rime-install | bash
rime_frontend=fcitx5-rime bash rime-install double_pinyin

rime 为了保证输入速度,词库很小,为了能够自动显示更多的词组,就需要使用拓展词库。

1
2
git clone https://github.com/rime-aca/dictionaries.git
cp dictionaries/luna_pinyin.dict/* ~/.local/share/fcitx5/rime/

安装了上面的拓展词库后,输入特殊符号的能力还是比较弱,需要把 symbols.yaml 也给加进来。

https://github.com/rime/rime-prelude 提供了我们所需要的 symbols.yaml 和 default.yaml,
可以使用 東風破 安裝: rime_frontend=fcitx5-rime bash rime-install prelude

由于我们使用的是自然码双拼,需要修改的文件为 double_pinyin.custom.yaml

1
2
3
4
5
patch:
# 載入朙月拼音擴充詞庫
"translator/dictionary": luna_pinyin.extended
"punctuator/import_preset": symbols
"recognizer/patterns/punct": "^/([A-Z|a-z]*|[0-9]|10)$"

设置完成后,要重新启动输入法,比如要输入 ☆ ,输入 /xh 即可

将用户词库导入 rime

rime_dict_manager -i luna_pinyin luna_pinyin.userdb.txt

这一步很关键啊,多年的积累不能浪费了。

配置 fcitx5 皮肤

fcitx5 默认的皮肤不太好看,所以下载更新了皮肤,这款简约风格的皮肤非常符合老夫的胃口。

1
2
git clone https://github.com/thep0y/fcitx5-themes.git
cp spring ~/.local/share/fcitx5/themes -r

修改配置文件 ~/.config/fcitx5/conf/classicui.conf

1
2
3
4
5
6
7
8
9
10
11
# 垂直候选列表
Vertical Candidate List=False

# 按屏幕 DPI 使用
PerScreenDPI=True

# Font (设置成你喜欢的字体)
Font="Smartisan Compact CNS 13"

# 主题(这里要改成你想要使用的主题名,主题名就在下面)
Theme=spring

另外还有一款 fcitx5 皮肤相对流行:https://github.com/hosxy/Fcitx5-Material-Color

切换皮肤的方法是,点击鼠标右键点击 配置 -> 附加组件 -> 经典用户界面 -> 点击右边图标 -> 选择皮肤

设置 fcitx rime 单行模式

如果要将输入法设置为单行模式,需要修改配置文件 ~/.config/fcitx5/conf/rime.conf

1
PreeditInApplication=True

或者按快捷键 ctrl + alt + p, 这个快捷键可以来回切换很方便,单行还是双行就因人而异了,我个人觉得单行好点。

让 fcitx5 正确显示菜单

要做这个步骤是因为 rime 有 「部署」、「同步」这几个操作按钮,如果不正确配置的话在 fcitx5 上没法正常显示。
fcitx5 在任务上有个托盘图标,点击右键就可以看到这些菜单。

要让 fcitx 正确显示菜单,关键在于让 rime 输入法默认处于激活状态,根据 fcitx5 配置的提示第一个输入法为非激活状态。

  • (1) 将第一个输入法设置为 键盘-英语 (美国),第二个输入法设置为 中州韵
  • (2) 在全局设置中,勾上默认状态为激活,共享输入状态设置为 程序

fcitx.vim

这个章节是写给 linux vim 用户看的,没有此需求的可以直接跳过这段。

vim 确实是程序编辑的利器,但是在用vim 写中文文档的时候,有一个痛点,你在用 fcitx 写中文的时候想保存文档,
vim 必须切换到 normal 模式才能输入保存的命令 :w,进入normal 模式的方法是连续按两下 ESC,好了现在你应该
输入命令了,但是你没法输入你现在还在打中文呢,没有办法你必须先切换到英文输入法,然后才能正确地输入 :w 痛苦啊。

fcitx.vim 就是为解决这个痛点而生的插件,个人觉得这是vim 必装的几个插件之一。fcitx.vim 的github 仓库
地址为:https://github.com/lilydjwg/fcitx.vim

值得一提的是这个仓库有两个分支,fcitx4 分支 和 fcitx5 分支,使用的时候一定要分清楚,这两个分支如果
使用错了,就没法正常使用 fcitx.vim 插件了。fcitx4 和 fcitx5 dbus 对象名字有变化,导致代码通用性不好。
现在默认分支为 fcitx5,如果你使用 fcitx4 可能直接 git clone 下来就会发现插件用不了,我也是因为这个
原因才发现 fcitx 居然更新了。

后记

可能有些人不知道为什么要折腾 rime,rime 的用户词库文件是个宝贝,这个词库是都是你真实的在日常使用中用到的词库,小巧又实用还能到处同步,上传到云后永不丢失,符合自己的数据自己掌握的硬道理。至于国内的那些输入法,我就不加以评价了,在这商业的社会要保持基本的做人底线不易。

参考资料

今天遇上某 App 禁止截屏,其实就是使用了下面这段代码

1
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

使用 frida 脚本可以绕过绕过这个限制 (使用 frida 需要将手机 root)。

1
2
3
4
5
6
7
8
9
10
11
12
13
Java.perform(function () {
// https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SECURE
var FLAG_SECURE = 0x2000;
var Window = Java.use("android.view.Window");
var setFlags = Window.setFlags; //.overload("int", "int")

setFlags.implementation = function (flags, mask) {
console.log("Disabling FLAG_SECURE...");
flags &= ~FLAG_SECURE;
setFlags.call(this, flags, mask);
// Since setFlags returns void, we don't need to return anything
};
});

执行 frida 命令 frida -U -l disable.js -n com.apps.android --no-pause

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ frida -U -l disable.js -n com.apps.android --no-pause

[Pixel 2::com.apps.android]->
[Pixel 2::com.apps.android]->
[Pixel 2::com.apps.android]-> Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...
Disabling FLAG_SECURE...

值得注意的是,这里使用了 -n 参数, attach 到目标进程,要不 App 会自动重启。看到输出调试信息后,
就可以正常截屏了。

使用 objection

objection「2」有此功能,执行下面命令即可: android ui FLAG_SECURE false 但是我测试失败了。

截屏小技巧 (lzx)

Android 截屏,可以使用一个快速的技巧 adb exec-out screencap -p > test.png

参考

前些年总结的,现在看起来,过于复杂了,可能做短线的会有需求。

image

作为一个长期在帝都紫竹桥混吃的中年大叔,经常遇到需要看病的情况,主要需求有两个 (大人看病,小孩看病)。

总结附近医院情况,个人理解,供参考:

466:

缺点:没有儿科,巨贵,感觉医生喜欢过度治疗,据说一些科室已被私人承包,媳妇和自己都被坑过。
优点:离紫竹桥距离近,三甲,人通常比较少,小病,偷懒的时候可以过去。据说牙科不错,但是我没有去过。

304:

缺点:信息化程度相对较弱,但是看病流程梳理得不错。
优点:三甲,有儿科,对小儿看病有一定优待。医生水平不错,小孩在这看过几次,治疗效果不错。

现在304 改名为 解放军总医院第四医学中心,儿科的实力比以往有较大提升。

四季青:

缺点:二级医院,儿科有的医生感觉不太专业。
优点:挂号方便,有儿科,医院较大。

北方医院:

缺点:二级医院, 医院较小。
优点:离紫竹桥距离近,有保健科,小孩打预防针不错。

空总:

在这个医院多个科室看过病,家人还在这做过微创手术。

缺点:挂号有点难,人多,儿科水平一般。
优点:三甲,皮肤科北京有名,各科室水平比较均衡。信息化程度高,看病挺方便。

海总:

这个医院我没有去过,距离稍远。