OnePlus 7 pro Oxygen OS 设置

这些年用 Android 下来总是最喜欢原生的系统,但是却总觉得缺少一些什么,而这些东西在用 Oxygen OS(后简称 OOS)之后发现竟然如此的贴心好用,甚至有一定程度上要超越 Google 原生的系统。比如一些非常不错的小功能,状态来显示网速,三指截屏等。

OOS 自带

  • 内置录屏,虽然是一个使用频率不高的功能,但需要起来就能使用还是很不错的
  • 三指截屏,滚动获取长截图,以前多屏长截图需要额外的软件支持,自带还是很贴心的
  • 翻转静音
  • 可选虚拟按键,本人一直喜欢虚拟按键,但是用过 OOS 的 Navigation 手势之后发现原来真的可以不用常驻的虚拟键,虽然 OOS 的返回依然有些难用,但是也是一个不错的选择。

界面 Tweak

  • 电量显示百分比,默认情况下电量只会显示一个电池,并不会显示百分比,可以在设置中开启
  • 状态栏显示网络速度,设置开启

使用 GravatyBox 调整

  • Statue Bar 支持滑动调整亮度,OnePlus 7 Pro 的自动调亮似乎总是把屏幕亮度调低
  • 状态栏显示下载进度条
  • 显示上传下载网速,可选,和 OOS 原生类似

Android 9.0 uses xposed solutions

  • https://github.com/solohsu/EdXposed/releases
  • https://github.com/RikkaApps/Riru/releases
  • https://github.com/ElderDrivers/EdXp…nager/releases
  • https://github.com/solohsu/XposedInstaller/releases

Use Magisk order to install

  1. Flash magisk-riru-core-arm-arm64-v10.zip
  2. Flash magisk-EdXposed-arm-arm64-v x.x_beta-release.zip
  3. Installation XposedInstaller_by_dvdandroid_19_10_18. apk

Reboot the device

Android Pie 在 EdXposed 下可用的模块列表

reference


2019-06-03 oneplus7-pro , oxygen-os , rom , tweak

OnePlus 7 Pro 折腾记

OnePlus 7 Pro 折腾记。

Unlock Bootloader

先前准备:

  • 备份数据,具体可以使用 adb 命令,见后文
  • 开启开发者模式,Settings -> About Phone -> 点击 Build Number 7 次
  • 调试模式,Settings -> Developer option -> Enable USB Debugging
  • 开启 OEM Unlocking,Settings -> Developer options -> OEM Unlocking 开启
  • PC 上安装 fastboot 工具

具体步骤

  • 数据线连接手机,adb devices 确认连接成功
  • 手机出现 Debug 对话框,确认
  • 进入 bootloader 模式,adb reboot bootloader
  • fastboot devices
  • fastboot oem unlock
  • 然后使用音量键选择,重启
  • 等待重启完毕就 OK 了

TWRP

第三方的 Recovery,首推 TWRP, 在 OnePlus 7 Pro 推出不久之后 xda 上面的 mauronofrio 就发布了非官方版本的 TWRP,当然随着时间往后 mauronofrio 将其制作的 TWRP 发布到了官方页面 . 本人测试 2019-06-08 的 twrp-3.3.1-3-guacamole.img ,非常完美。

安装 TWRP 过程

  • 去官方网站下载 twrp-3.3.1-3-guacamole.img 和 twrp-installer-3.3.1-3-guacamole.zip 文件准备,img 文件放到桌面版以便于 adb 刷入,zip 包拷贝到手机内存
  • 连接电脑,让手机进入 fastboot 模式
  • fastboot boot twrp-3.3.1-3-guacamole.img 让手机用该 Recovery 启动,boot 命令只会让手机此次启动使用 TWRP,需要进行下一步才能让手机保持 TWRP Recovery
  • 在 TWRP 中 flash 之前准备好的 zip 包

刷完重启进入系统

注意:OnePlus 7 Pro 使用 Slot A/B,但是最新的 TWRP 已经自动支持 A/B 识别,不用担心 A/B 的问题

Root OnePlus 7 Pro with patched Boot Image

在 root 之前需要注意

  • 使用原生 OOS
  • Unlocked bootloader
  • fastboot 工具

然后根据一下流程:

  • 根据自己的版本 GM1910,系统版本 Oxygen OS 9.5.6 下载 patched boot image,或者自己制作 patched boot image
  • 安装最新的 Magisk Manager
  • adb reboot bootloader 进入 fastboot mode
  • fastboot devices
  • 如果担心下错 boot image,可以尝试使用 fastboot boot boot.img 来用本地的 image 文件启动
  • 确认没有问题之后,刷入 fastboot flash boot boot_patched.img
  • fastboot reboot 重启
  • 打开 Magisk ,安装,使用 Direct Install
  • 这样就有了一个 root 的 OnePlus 7 Pro

From: xda

Magisk

使用 Magisk ROOT

From: xda

更新系统 OTA 之后保留 recovery root 等

更新 OTA, Magisk 在拥有 slot A/B 的设备上有新的特性,能让系统正常更新而不会丢失 ROOT。如果想要了解更多 A/B 分区的问题可以参考这里.

如果想要在 OTA 之后保留 ROOT:

  • 使用全量包更新,然后在 System 设置中使用本地更新,切记更新完成不要立即重启
  • 打开 Magisk ,点击 Magisk 一行的安装,在弹出的对话框中点击安装
  • 然后在弹出的对话框 (select Method) 中选择 Install to Inactive Slot (After OTA) 选项 (中文应该是,安装到未使用的槽位,安装完 OTA 后)
  • 最后安装重启

在上方的步骤重启进入系统之后会丢掉 TWRP,进入系统后需要重新刷入,在 OTA 之后保留 TWRP:

  • 打开 Magisk Manager ,然后像刷入其他 Module 一样输入之前 TWRP 的 zip 包
  • 不要重启,刷入 TWRP 之后会丢失 ROOT Access
  • 然后重新到 Magisk,点击 Install , Direct Install,然后再重启

在最后一步,有些教程可能有问题,在这里只需要 Direct Install,而不需要 Install to Inactive Slot(After OTA) 了。

这些步骤之后就 OTA 成功,并且保留了 TWRP,以及 Magisk 和 Magisk 下所有的模块。

使用 adb 备份数据

使用 adb 备份数据的时候千万注意,adb 备份的数据恢复时不会自动安装应用,并且可能恢复不完整。如果可能还是使用 Titanium Backup (ROOT) 等专业工具备份和恢复。

adb backup -apk -shared -all -f op7pro-backup-file.ad

参数解释:

  • -apk|-noapk 是否备份包含 apk 或者仅仅备份应用数据,推荐使用 -apk 选项,默认为 -noapk
  • -shared|-noshared 决定是否备份设备共享的 SD 卡内容,默认为 -noshared,主要包括内部存储中的音乐,图片和视频等,推荐使用 -shared
  • -all 备份所有应用
  • -system|-nosystem 决定 -all 选项是否包含系统应用,默认是 -system
  • -f 后面需要指定路径及文件名,表示用来存储的位置,比如 -f /path/backup.file 那么会存储在 path 目录下名为 backup.file 的文件中

恢复数据

设备连接电脑,adb devices 查看连接成功

adb restore op7pro-backup-file.ad

如果想要手动解开这个备份文件,可以参考这个项目

一些问题

GM 版本问题

氧系统有好几个版本的全量 ROM, GM21AA,GM21BA。这两个版本的含义是:

  • 标记有 GM21AA 的包适用于印度、全球(不含欧洲)、美国的无锁版 Model

      - GM1911: India
      - GM1917: Global/US Unlocked (?)
    
  • GM21BA 欧洲销售版本

      - GM1913: EU
    
  • GM27BA EU 5G 版本,GM 1915
  • GM31CB GM1915 T-Mobile (Carrier Locked)

adb 连接问题

adb 之前保证打开开发者模式,并且设置中确保设置打开,

adb devices
List of devices attached
5fxxxxxx	no permissions (verify udev rules); see [http://developer.android.com/tools/device.html]

在使用 adb 连接的时候如果遇到这个问题,那么在通知栏中,换一种 USB 连接模式,保证非充电模式。如果还不行可以尝试

adb kill-server
adb start-server

更多关于 adb 和 fastboot 命令的使用可以参考之前的 adb 文章fastboot 文章

从 recovery 中删除导致无限重启的 magisk module

按住音量下+电源键进入 Recovery 模式,在 TWRP Recovery 下,Advanced > File Manager,打开文件管理,找到:

/data/adb/modules

在这个目录里面就能看到安装的 Magisk 模块,删除新增的模块即可。

reference


2019-06-02 oneplus , android , root , magisk , adb

Java 定时任务框架 Job-scheduling Quartz 使用

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system.

Setup

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

Usage

客户端调用

JobDetail job = newJob(MyJob.class)
    .withIdentity("myJob")
    .build();

Trigger trigger = newTrigger()
    .withIdentity(triggerKey("myTrigger", "myTriggerGroup"))
    .withSchedule(simpleSchedule()
        .withIntervalInHours(1)
        .repeatForever())
    .startAt(futureDate(10, MINUTES))
    .build();

scheduler.scheduleJob(job, trigger);

Source Code

StdSchedulerFactory 是 Scheduler 的工厂方法,实现了 SchedulerFactory 接口。

// 提供客户端可用的 Scheduler
Scheduler getScheduler() throws SchedulerException;
// 通过名字获取
Scheduler getScheduler() throws SchedulerException;
// 返回当前 JVM 中通过该 Factory 创建的所有 Scheduler
Collection<Scheduler> getAllSchedulers() throws SchedulerException;

SchedulerRepository 单例,内部持有一个 Map HashMap<String, Scheduler> schedulers

类中,绑定 (bind),解绑 (remove) 都为同步方法,保证线程安全。

Scheduler

Scheduler 是一个很庞大的接口,它的实现主要有

  • RemoteScheduler, via RMI
  • StdScheduler, std
  • JBoss4RMIRemoteMBeanScheduler, via JBoss’s JMX RMIAdaptor

Quartz 的核心实现也基本都在这些实现类中,Scheduler 可以用来定时触发任务。

CronScheduleBuilder

CronScheduleBuilder 用来将字符串的 cron 表达式变成 CronScheduleBuilder 对象,ScheduleBuilder 是一个抽象类

public class CronScheduleBuilder extends ScheduleBuilder<CronTrigger> {
    public static CronScheduleBuilder cronSchedule(String cronExpression) { }
}

主要的实现有:

  • CronScheduleBuilder 主要实现 cron 定时任务,通过字符表达式
  • SimpleScheduleBuilder 比较简单的 ScheduleBuilder
  • CalendarIntervalScheduleBuilder 看例子 withIntervalInDays(3) 每隔 3 天,如果要使用固定间隔的可以看一下这个
  • DailyTimeIntervalScheduleBuilder 看例子比较简单 onDaysOfTheWeek(MONDAY, THURSDAY) , 每一个周一和周四

比如

CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpr());
trigger = TriggerBuilder.newTrigger().withIdentity(triggerId).withSchedule(scheduleBuilder)
    .forJob(jobDetail).build();
scheduler.scheduleJob(jobDetail, trigger);

2019-05-30 java , quartz , schedule , cronjob

jbpm 中 ProcessEventListener 顺序问题

在 jBPM 商业流程中有一个 ProcessEventListener ,可以用来回调流程的执行过程,但是这个 Listener 的执行顺序非常奇怪。

首先我们先看看这个 interface

public interface ProcessEventListener {

  void beforeProcessStarted( ProcessStartedEvent event );
  void afterProcessStarted( ProcessStartedEvent event );
  void beforeProcessCompleted( ProcessCompletedEvent event );
  void afterProcessCompleted( ProcessCompletedEvent event );
  void beforeNodeTriggered( ProcessNodeTriggeredEvent event );
  void afterNodeTriggered( ProcessNodeTriggeredEvent event );
  void beforeNodeLeft( ProcessNodeLeftEvent event );
  void afterNodeLeft( ProcessNodeLeftEvent event );
  void beforeVariableChanged(ProcessVariableChangedEvent event);
  void afterVariableChanged(ProcessVariableChangedEvent event);

}

我相信大多数人看到这些方法回调大致可以猜测 afterProcessStarted 应该是在流程开始之后被调用,然而实际的调用顺序是这样的:

- beforeProcessStarted
  - beforeNodeTriggered
    - beforeNodeLeft
      - beforeNodeTriggered
        - beforeVariableChanged
          afterVariableChanged
        - beforeNodeLeft
          - beforeNodeTriggered
            - beforeNodeLeft
              - beforeNodeTriggered
                afterNodeTriggered
              afterNodeLeft
            - beforeNodeLeft
                beforeNodeTriggered
                afterNodeTriggered
              afterNodeLeft
            afterNodeTriggered
          afterNodeLeft
        afterNodeTriggered
      afterNodeLeft
    afterNodeTriggered
  afterProcessStarted

afterProcessStarted 会在流程结束时被调用。有人提过 bug 但是官方认为这是程序设计,所以使用文档的形式 将这种方式说明了。

查看源代码可以在 RuleExecutor 中可以看到:

jbpm listener

实验

假设有如下图的流程

jbpm process

那么打印所有的日志可以观察到:

- DefaultRuleContainer beforeVariableChanged ==>[ProcessVariableChanged(id=age; instanceId=age; oldValue=null; newValue=18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterVariableChanged ==>[ProcessVariableChanged(id=age; instanceId=age; oldValue=null; newValue=18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeProcessStarted ==>[ProcessStarted(name=BPTest; id=FlowTest.BPTest)]
- event ==>[ProcessStarted(name=BPTest; id=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeTriggered ==>[ProcessNodeTriggered(nodeId=4; id=0; nodeName=StartPoint; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeLeft ==>[ProcessNodeLeft(nodeId=4; id=0; nodeName=StartPoint; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeTriggered ==>[ProcessNodeTriggered(nodeId=7; id=1; nodeName= 年龄是否大于 18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeLeft ==>[ProcessNodeLeft(nodeId=7; id=1; nodeName= 年龄是否大于 18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeTriggered ==>[ProcessNodeTriggered(nodeId=2; id=2; nodeName=A1Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeLeft ==>[ProcessNodeLeft(nodeId=2; id=2; nodeName=A1Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeTriggered ==>[ProcessNodeTriggered(nodeId=6; id=3; nodeName=A2Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeLeft ==>[ProcessNodeLeft(nodeId=6; id=3; nodeName=A2Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeTriggered ==>[ProcessNodeTriggered(nodeId=3; id=4; nodeName=End; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeNodeLeft ==>[ProcessNodeLeft(nodeId=3; id=4; nodeName=End; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer beforeProcessCompleted ==>[ProcessCompleted(name=BPTest; id=FlowTest.BPTest)]
- DefaultRuleContainer afterProcessCompleted ==>[ProcessCompleted(name=BPTest; id=FlowTest.BPTest)]
- event ==>[ProcessCompleted(name=BPTest; id=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeLeft ==>[ProcessNodeLeft(nodeId=3; id=4; nodeName=End; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeTriggered ==>[ProcessNodeTriggered(nodeId=3; id=4; nodeName=End; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeLeft ==>[ProcessNodeLeft(nodeId=6; id=3; nodeName=A2Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeTriggered ==>[ProcessNodeTriggered(nodeId=6; id=3; nodeName=A2Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeLeft ==>[ProcessNodeLeft(nodeId=2; id=2; nodeName=A1Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeTriggered ==>[ProcessNodeTriggered(nodeId=2; id=2; nodeName=A1Task; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeLeft ==>[ProcessNodeLeft(nodeId=7; id=1; nodeName= 年龄是否大于 18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeTriggered ==>[ProcessNodeTriggered(nodeId=7; id=1; nodeName= 年龄是否大于 18; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeLeft ==>[ProcessNodeLeft(nodeId=4; id=0; nodeName=StartPoint; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterNodeTriggered ==>[ProcessNodeTriggered(nodeId=4; id=0; nodeName=StartPoint; processName=BPTest; processId=FlowTest.BPTest)]
- DefaultRuleContainer afterProcessStarted ==>[ProcessStarted(name=BPTest; id=FlowTest.BPTest)]

reference


2019-05-23 jbpm , drools , business-process , rule , rule-engine

drools workbench

Drools 是一个 Java 的商业过程实现,这是 Bob McWhirter 所编写的一个开源项目,由 JBoss 和 Red Hat Inc 支持。 Drools 提供一个核心的 Business Rules Engine(BRE) 和一个网页编写规则的管理系统(Drools Workbench)和 一个 Eclipse IDE 的插件,一同构成完整的 Drools 生态。

而这篇文章则主要侧重于 Drools Workbench。

Workbench

org.guvnor.m2repo.dir

The workbench stores its data, by default in the directory $WORKING_DIRECTORY/.niogit, for example wildfly-8.0.0.Final/bin/.niogit, but it can be overridden with the system property -Dorg.uberfire.nio.git.dir.

Note In production, make sure to back up the workbench data directory.

18.1.3. System properties Here’s a list of all system properties:

org.uberfire.nio.git.dir: Location of the directory .niogit. Default: working directory

org.uberfire.nio.git.daemon.enabled: Enables/disables git daemon. Default: true

org.uberfire.nio.git.daemon.host: If git daemon enabled, uses this property as local host identifier. Default: localhost

org.uberfire.nio.git.daemon.port: If git daemon enabled, uses this property as port number. Default: 9418

org.uberfire.nio.git.ssh.enabled: Enables/disables ssh daemon. Default: true

org.uberfire.nio.git.ssh.host: If ssh daemon enabled, uses this property as local host identifier. Default: localhost

org.uberfire.nio.git.ssh.port: If ssh daemon enabled, uses this property as port number. Default: 8001

org.uberfire.nio.git.ssh.cert.dir: Location of the directory .security where local certificates will be stored. Default: working directory

org.uberfire.nio.git.ssh.passphrase: Passphrase to access your Operating Systems public keystore when cloning git repositories with scp style URLs; e.g. git@github.com:user/repository.git.

org.uberfire.metadata.index.dir: Place where Lucene .index folder will be stored. Default: working directory

org.uberfire.cluster.id: Name of the helix cluster, for example: kie-cluster

org.uberfire.cluster.zk: Connection string to zookeeper. This is of the form host1:port1,host2:port2,host3:port3, for example: localhost:2188

org.uberfire.cluster.local.id: Unique id of the helix cluster node, note that ‘:’ is replaced with ‘_’, for example: node1_12345

org.uberfire.cluster.vfs.lock: Name of the resource defined on helix cluster, for example: kie-vfs

org.uberfire.cluster.autostart: Delays VFS clustering until the application is fully initialized to avoid conflicts when all cluster members create local clones. Default: false

org.uberfire.sys.repo.monitor.disabled: Disable configuration monitor (do not disable unless you know what you’re doing). Default: false

org.uberfire.secure.key: Secret password used by password encryption. Default: org.uberfire.admin

org.uberfire.secure.alg: Crypto algorithm used by password encryption. Default: PBEWithMD5AndDES

org.uberfire.domain: security-domain name used by uberfire. Default: ApplicationRealm

org.guvnor.m2repo.dir: Place where Maven repository folder will be stored. Default: working-directory/repositories/kie

org.guvnor.project.gav.check.disabled: Disable GAV checks. Default: false

org.kie.example.repositories: Folder from where demo repositories will be cloned. The demo repositories need to have been obtained and placed in this folder. Demo repositories can be obtained from the kie-wb-6.2.0-SNAPSHOT-example-repositories.zip artifact. This System Property takes precedence over org.kie.demo and org.kie.example. Default: Not used.

org.kie.demo: Enables external clone of a demo application from GitHub. This System Property takes precedence over org.kie.example. Default: true

org.kie.example: Enables example structure composed by Repository, Organization Unit and Project. Default: false

org.kie.build.disable-project-explorer: Disable automatic build of selected Project in Project Explorer. Default: false

To change one of these system properties in a WildFly or JBoss EAP cluster:

Edit the file $JBOSS_HOME/domain/configuration/host.xml.

Locate the XML elements server that belong to the main-server-group and add a system property, for example:

...

2019-05-21 drools , rule-engine

Entware-ng 使用

Entware-ng 是一个适用于嵌入式系统的软件包库,使用 opkg 包管理系统进行管理。之前的路由器刷了 Openwrt 之后直接能用命令行安装相关命令,之后的路由器,NAS 也能安装 Entware-ng 。可以将 Entware-ng 想象成嵌入式设备的一个包管理软件,能方便的用来在嵌入式设备上安装软件,现在在官方的源上已经有超过 2000 个软件包。

相关网址:

Installation

在群晖上安装

更具体的可以参考我之前的文章

在 QNAP 上安装

Usage

和普通 Linux 下的包管理一样,只要输入命令就能够联网下载相关软件。

opkg update
opkg install git

所有软件包列表可以查看 http://pkg.entware.net/binaries/armv7/Packages.html

通过 opkg 安装的软件启动脚本在 /opt/etc/init.d/ 目录

单个启动命令 /opt/etc/init.d/software_name start


2019-05-19 entware-ng , package , linux , openwrt , merlin , 路由器

每天学习一个命令:pidstat 查看进程消耗资源

pidstat 是 sysstat 工具包含的一个命令,主要用于监控 Linux Kernel 管理的进程资源占用情况,包括 CPU,IO,内存,线程等等。

The pidstat command is used for monitoring individual tasks currently being managed by the Linux kernel.

pidstat 首次运行会显示系统自开机起各项统计,之后运行将显示从上一次运行到该次运行的统计信息。

installation

apt-get install sysstat

usage

pidstat [options] [interval] [times]

常用的参数:

  • -u 默认参数,显示各个进程的 CPU 统计信息
  • -r 显示各个进程的内存使用情况
  • -d 显示各个进程的 IO 使用
  • -w 显示各个进程的上下文切换
  • -p PID 指定 PID

比如常见的每一秒查看 IO 统计,统计 10 次

pidstat -d 1 10

Examples

所有进程的 CPU 统计信息

直接运行 pidstat 默认显示所有进程的 CPU 使用信息,等效于 pidstat -u -p ALL

pidstat -u 1 10
pidstat

Result fields:

  • UID
  • PID
  • %usr: 进程在用户空间占用 cpu 的百分比
  • %system: 进程在内核空间占用 CPU 百分比
  • %guest: 进程在虚拟机占用 CPU 百分比
  • %wait: 进程等待运行的百分比
  • %CPU: 进程占用 CPU 百分比
  • CPU: 处理进程的 CPU 编号
  • Command: 进程名

显示内存统计信息

Following command will display PID memory usage 10 times every 2 seconds:

pidstat -r 2 10

Result fields:

  • UID
  • PID
  • Minflt/s : 每秒次缺页错误次数 (minor page faults),虚拟内存地址映射成物理内存地址产生的 page fault 次数
  • Majflt/s : 每秒主缺页错误次数 (major page faults), 虚拟内存地址映射成物理内存地址时,相应 page 在 swap 中
  • VSZ virtual memory usage : 该进程使用的虚拟内存 KB 单位
  • RSS : 该进程使用的物理内存 KB 单位
  • %MEM : 内存使用率
  • Command : 该进程的命令 task name

显示 IO 统计信息

pidstat -d

Result field:

  • UID
  • PID
  • kB_rd/s: 每秒进程从磁盘读取的数据量 KB 单位 read from disk each second KB
  • kB_wr/s: 每秒进程向磁盘写的数据量 KB 单位 write to disk each second KB
  • kB_ccwr/s: 每秒进程向磁盘写入,但是被取消的数据量,This may occur when the task truncates some dirty pagecache.
  • iodelay: Block I/O delay, measured in clock ticks
  • Command: 进程名 task name

T 选项来打印更详细信息

使用 -T [TASK|CHILD|ALL] 来报告打印更详细的信息,默认 pidstat 使用 TASK,表示监控独立的任务信息。

  • TASK 报告独立的进程
  • CHILD 报告进程下所有线程的情况
  • ALL 输出进程及线程统计信息

Specific PID

To show CPU, memory, IO:

pidstat -u -p PID
pidstat -r -p PID
pidstat -d -p PID

比如要查看 PID 为 12002 的进程的 CPU 使用情况,并且要查看所有子线程,每隔 1 秒输出一次,输出 10 次,则可以

pidstat -T ALL -u -p 12002 1 10

reference


2019-05-14 linux , commmand , network , pidstat , iotop , ram , cpu

每天学习一个命令:pidof 查找进程 PID

pidof finds the process id’s(pids) of the names programs.

Usage

pidof [name]

Example

find chrome pid

pidof chrome
pidof -s chrome

Options:

  • -s instructs the program to only return one pid.

Extension

  • pgrep

2019-05-14 pid , netstat , command , linux

Cross-platform Softwares I am using

This post will only list cross-platform softwares I used now. Each software has its own behaviors, and binded with its own shortcut. It takes time to be familiar with it. So I decided to use only cross-platform softwares in daily life in case I have to swith my main System. But it seems fine till now. I am happy with these great softwares.

IntelliJ IDEA

DescriptionIntelliJ IDEA is a Java integrated development environment for developing computer software. It is developed by JetBrains, and is available as an Apache 2 Licensed community edition, and in a proprietary commercial edition. Both can be used for commercial development.

Open Sources Alternatives:

  • Eclipse

Chrome

DescriptionGoogle Chrome is a cross-platform web browser developed by Google. It was first released in 2008 for Microsoft Windows, and was later ported to Linux, macOS, iOS, and Android. The browser is also the main component of Chrome OS, where it serves as the platform for web apps.

Alternatives:

  • vivaldi

SmartGit

SmartGit is a Git GUI client with support for SVN, GitHub, BitBucket pull requests and comments.

WizNote

WizNote for Windows/Mac/Linux is a cross-platform cloud based note-taking client.

GoldenDict

GoldenDict is an open-source dictionary program that gives translations of words and phrases for different languages. It allows the use of several popular dictionary file formats simultaneously and without conversion. The project aims to create a feature-rich dictionary search program.

TeamViewer

TeamViewer is proprietary software for remote control, desktop sharing, online meetings, web conferencing and file transfer between computers.

pCloud

pCloud is the secure cloud storage, where you can store, share and work on all your files.

Crypt

VeraCrypt is a source-available freeware utility used for on-the-fly encryption. It can create a virtual encrypted disk within a file or encrypt a partition or the entire storage device with pre-boot authentication. VeraCrypt is a fork of the discontinued TrueCrypt project.

TagSpace

TagSpaces is an open-source data manager and file navigator. It helps organize files on local drives by adding tags to files. Users get the same user interface to manage their files on different platforms. TagSpaces is compatible with Windows, Linux, Mac, Android, iPhone, Firefox and Chrome.

Calibre

Calibre is a cross-platform open-source suite of e-book software. Calibre supports organizing existing e-books into virtual libraries, displaying, editing, creating and converting e-books, as well as syncing e-books with a variety of e-readers. Editing books is supported for EPUB and AZW3 formats.

Telegram

Telegram is a cloud-based instant messaging and voice over IP service developed by Telegram Messenger LLP, a privately held company registered in London, United Kingdom, founded by the Russian entrepreneur Pavel Durov and his brother Nikolai.

balenaEtcher

[[balenaEtcher]] is a powerful OS image flasher built with web technologies to ensure flashing an SDCard or USB drive is a pleasant and safe experience.


2019-05-10 applications , apps

使用 Stylus 扩展自定义页面样式

有油猴脚本可以用来修改网页页面,那么相应的也能通过挂载自己的定义的 CSS 来实现对页面的修改。

如果有了这样的概念,那么可以在页面做到,完全修改页面显示的样式,增加背景,移除广告等等事情。

installation

安装扩展

CSS 样式

从该站点寻找可用的样式

InoReader

  • https://userstyles.org/styles/119240/inoreader-countrystyle-flat-ui-remove-ads

reference


2019-05-08 stylus , css , chrome , firefox , extension

电子书

最近文章

  • 将字幕压制到视频中 本文总结一下将字幕文件压制到视频中的方式,(当然我个人是非常不喜欢直接将字幕压制到视频流中作为硬字幕压制的,但有些时候可能就是需要分享这样硬字幕的视频,比如视频网站,所以也会在下文总结一下)。
  • 解决 Clash for Windows 节点测速 timeout 问题 [[Clash for Windows]] 使用过程中一直没有什么问题,但是昨天心血来潮把 Clash for Windows 从 0.18.8 升级到了最新版本(0.20.5) ,然后发现节点全部 timeout。但可以排除的是这些节点肯定是可以用的,因为在手机上是完全没有问题的。
  • Arc 浏览器初印象 很早之前就在 Twitter 上看到有人分享了 Arc 浏览器的使用体验,说是非常惊艳,我就稍微的浏览了一下官网,抱持怀疑的态度先注册了一下体验,一直好奇到了 2022 年能够在浏览器上做出什么样的创新,自 Chrome 横空出世以来,快,安全迅速抢占了浏览器市场。剩下的一点点份额被 Firefox,Safari,Edge,[[Vivaldi]] 等等占据,早两年的时候我也写过一篇标题略微耸动的文章 —- 我可能要抛弃用了很多年的 Chrome 改用 Vivaldi ,但事实是 3年多过去了,我日常用的还是 Chrome,虽然 Google 在浏览器插件,隐私等等问题上这两年来一直被诟病,但至少还没有彻底地激怒我这个用户。
  • 使用开源 Wakapi 代替 WakaTime 统计编码时间 之前折腾 GitHub Profile 的时候发现了 [[WakaTime]] 这样一款统计编码时间的工具,之后在读 waka-readme 项目的时候发现,还有两个完全开源的后端兼容版本,一个是 Golang 编写的 [[wakapi]] ,一个是 Huskell 编写的 hakatime 。
  • 使用 WakaTime 统计编码时间 [[WakaTime]] 是为程序员打造的编码统计 Dashboard,可以同来统计项目,编程语言,IDE,编码时间等等内容。 之前在折腾 GitHub Profile 的时候发现的,可以在 GitHub Profile 页面中动态的展示最近的编程状态。