Vim Tips

regexp 相关

1
2
3
4
5
6
7
8
# 统计正则匹配到的次数
:%s/pattern//ng

# 利用 global 把匹配到的行打印出来
:global/pattern/print

# 或者
:global/pattern

日志过滤

global

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# [d]elete all lines not(!) matching patterns
:g!/pattern/d
:v/pattern/d

# 匹配多个单词
:v/onStart\|onStop/d

# 忽略大小写,可以直接 `:set ignorecase`,或者:
# 强制忽略大小写:\c
:g/\cpattern/z#.1|echo "================================"
# 强制匹配大小写:\C
:g/\Cpattern/z#.1|echo "================================"

# 更多信息可查看帮助 `:help /ignorecase`

# 将匹配的行移动到最后吗
:g/pattern/m0
# 将匹配的行移动到最前面(顺序会变成倒序)
:g/pat/m$

# 展示匹配该正则表达式的列表
:g/regular-expression/p

[I, ilist

1
2
3
4
5
# Display all lines that contain the keyword under the cursor.
[I

# Like "[I" and "]I", but search in [range] lines	(default: whole file).
:il /pattern1\|patter2\|pattern3/

quickfix, location list

1
2
:vimgrep pattern %
:lvim pattern %

文件编辑相关

Json 格式化

1
2
# V 选中 json 字符串,然后调用 json.tool 格式化 json 字符串
:'<,'>!python3 -m json.tool

二进制编辑

使用 xxd 命令,切换到二进制模式: :%!xxd

Python Pandas

简单任务

  1. 数据读取

    1
    2
    3
    4
    5
    6
    7
    8
    
    import pandas as pd
    
    df = pd.read_csv('data/android/oom-sessions/oom.csv')
    
    # thousands=',' 可以自动将类似 "1,316" 格式的数字转换为整数
    df = pd.read_csv('ui-90.csv', thousands=',')
    
    df.head()
    
  2. 数据过滤

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    df = df[df['name']=='ThreadPoolForeg']
    
    # 组合多个条件
    df = df[(df.p_date >= 20220830) & (df['count'] >= 200)]
    
    # np.isin,保留 name 匹配列表中的名字
    df = df[np.isin(df['name'], ['a', 'b', 'c',])]
    
    # np.isin, invert,保留 name 不在列表中的
    df = df[np.isin(df['name'], ['d', 'e',], invert=True)]
    
    # MultiIndex,取第一项做过滤
    df = df[np.isin(df.index.get_level_values(0), ['a', 'b', 'c'])]
    
  3. 数据排序

Android Tools

常用工具

  • scrcpy:PC 端镜像手机端屏幕,可操作、截屏、录屏等

  • UI 分析工具

    • codeLocator:实时抓取 viewTree
    • Android Studio:Android Device Monitor
    • UIAutomatorViewer
    • Appium Inspector
    • Espresso
    • adb
  • flipper:A desktop debugging platform for mobile developers.

adb 命令备忘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 查看当前 Activity 是否使用了 SurfaceView。如果有 SurfaceView 字样,则表示使用了 SurfaceView
adb shell dumpsys SurfaceFlinger|grep 'HWC layers' -A10

# 查看最近的 crash 日志
adb logcat -b crash

# 查看当前 Activity
adb shell dumpsys activity top | grep ACTIVITY

# 查看当前获得焦点的 Window 所在的 Activity
adb shell dumpsys window | grep mCurrentFocus

# 通过 Action 隐式拉起页面,例如通过 schema 拉起页面
adb shell am start -a android.intent.action.VIEW -d 'kwai://live/play/RZA8aukYCco'

# 通过 包名/组件名 显示拉起页面
adb shell am start -n com.android.camera/com.android.camera.Camera
adb shell am start -n com.android.browser/com.android.browser.BrowserActivity

Emacs 的本地变量 (Local Variables)

Emacs 中的变量

要解释本地变量,先解释一下 Emacs 里面变量的作用。

Emacs 中有很多功能(内置的或者插件提供的)都可以通过设置一些变量的值来 进行一些个性化的定制。

这里举几个例子加以说明:

Go 并发模式总结

Go 的并发哲学

Don’t Communicate by sharing memory, share memory by communicating.

不要通过共享内存来通信;相反,通过通信来共享内存。

Generator 发生器

Generator 指返回一个 chan 的函数。这是一种十分常见的使用 goroutine + chan 的方式,可以说是一种标准用法了。