Substratum Android 上的主题引擎

Substratum 是一款 Android 上的主题工具,能够不用 root 来达到系统级主题修改。并且在该工具下有一群爱好者和社区开发了无数的美观且实用的主题。Substratum 开始于以前非常流行的 CyanogenMod, Cyanogen 内置了该主题引擎,并使得修改主题异常简单。但是不幸的是,Cyanogen 没有继续下去, 但是 Substratum 死灰复燃。最初的时候 Substratum 还需要 Root 来使用,但是 Android Oreo 之后就可以不依赖于 Root 了。

Installation

如果想要正式版从 Play Store 下载:

如果要开发版可以在 Telegram channel 下载

Substratum Themes

Substratum 有非常多著名的主题,可以从 Play Store 搜索,或者到 xda 寻找

  • Swift Black
  • Flux White
  • Victory
  • VaLeRie youtube
  • Transparent

Conclusion

最后,Swift theme 看起来不错,1.99 刀还可以,果断购入。

reference


2019-08-10 theme , android , substratum , oneplus-7-pro , oneplus , android-pie

Flask Babel 使用

Flask babel 是 Flask 的语言扩展,允许非常简单的方式让 Flask 支持多语言。

Installation

pip install flask-babel

安装时会安装依赖

  • Babel, Python 国际化
  • pytz 时区
  • speaklater 辅助工具集

Configuration

在 python 文件中要使用多语言的文字时引入

from flask_babel import gettext

比如

gettext('author')

在 html 模板文件中

<pre>{\% trans \%\}Submit{\% endtrans \%\}</pre>

在项目目录中新建 babel.cfg

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_,webassets.ext.jinja2.AssetsExtension

然后生成模板文件

pybabel extract -F babel.cfg -o translations/messages.pot .

文件 messages.pot 就是翻译模板文件

然后生成中文翻译文件

pybabel init -i translations/messages.pot -d translations -l zh_Hans_CN

复杂的项目可以借助 GUI 工具 poedit

编辑后编译

pybabel compile -d translations

如果更新了项目文件,新增了需要翻译的字段,在生成 messages.pot 之后可以使用如下方法将更新合并到需要翻译的文件中

pybabel update -i translations/messages.pot -d translations

Flask Babel 和 Flask WTF 一起使用

如果直接定义时使用 gettext 可能无法使用 babel 的翻译,需要使用 lazy_gettext('').

class LoginForm(Form):
    username = TextField(gettext(u'Username'), validators=[validators.Required()])

Notice

translations 位置

translations 目录必须是跟你 Flask 的 app 应用对象在同一目录下,如果你的 app 对象是放在某个包里,那 translations 目录也必须放在那个包下。

如果使用自定义的目录那么,需要自己手动指定目录名字。

app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'translation'

Other

可以使用 pybabel --list-locales 来查看本机语言编码。

reference


2019-08-03 flask , flask , flask-babel , translations , langauge

Android 内核中的 CPU 调频

CPU 调频模块主要分为三块:

  • CPUFreq 核心模块,核心模块主要是公共的 API 和逻辑
  • CPUFreq 驱动,处理和平台相关的逻辑,设置 CPU 频率和电压
  • CPUFreq governor,频率控制器,CPU 调频的策略,CPU 在什么负载,什么场景下使用多少频率

最后第三部分 governor 也是本文重点。传统的 CPU governor 选择,以 Performance 和 Powersave 举例,就是一个让 CPU 跑在最高频率,一个让 CPU 跑在最低频率,所有动作都在初始化时设置。

调频器策略

OnDemand, Conservative 或者 Interactive 内部都含有一个计时器,每隔一段时间就会去对 CPU 负载采样。这是一种基于负载采样的调频器策略。

而另外一种策略是,从内核调度器中直接取得 CPU 负载,这就是基于调度器的 governor。基于调度器的 CPU 调频策略会通过 PELT(per entity load tracking) 来统计各个任务的负载,映射到一个范围。内核中负载均衡通过这些统计值来平衡 CPU 之间的任务,基于调度器的 governor 就是通过把各个 CPU 负载映射到 CPU 频率来完成调频动作,负载越高,CPU 频率也越高。内核社区中有个方案:

  • ARM 和 Linaro 主导项目 cpufreq_sched
  • Intel 主导的 shedutil

CPU 调频器

OnDemand

OnDemand 是一个比较老的 linux kernel 中的调频器,当负载达到 CPU 阈值时,调频器会迅速将 CPU 调整到最高频率。由于这种偏向高频的特性,使得它有出色的流动性,但与其他调频器相比可能对电池寿命产生负面影响。OnDemand 在过去通常被制造商选用,因为它经过了充分测试并且很可靠,但已经过时,并且正在被 Google 的 interactive 控制器取代。

对于 OnDemand 会启用计时器,定时去计算 CPU 负载,当负载超过 80% 时,OnDemand 会将 CPU 频率调到最高。

OndemandX

基本上是拥有 暂停、唤醒配置的 OnDemand,没有在 OnDemand 上做更多的优化。

Performance

Performance 调频器将手机的 CPU 固定在最大频率。

Powersave

与 Performance 调频器相反,Powersave 调频器将 CPU 频率锁定在用户设置的最低频率。

Conservative

该调速器将手机偏置为尽可能频繁地选择尽可能低的时钟速率。换句话说,在 Conservative 调频器提高 CPU 时钟速度之前,必须在 CPU 上有更大且更持久的负载。根据开发人员实现此调频器的方式以及用户选择的最小时钟速度,Conservative 调频器可能会引入不稳定的性能。另一方面,它可以有利于电池寿命。

Conservative 调频器也经常被称为“slow OnDemand”。原始的、未经修改的 Conservative 是缓慢并且低效的。较新版本和修改版本 Conservative(来自某些内核)响应速度更快,并且几乎可以用于任何用途。

和 OnDemand 一样,会通过定时器来检测 CPU 负载,对 Conservative ,当负载较高时,会以 5% 步增调高频率,当负载低于一个值时,以 5% 步伐递减。

Userspace

这种调频器在移动设备中极为罕见,它允许用户执行的任何程序设置 CPU 的工作频率。此调频器在服务器或台式 PC 中更常见,其中应用程序(如电源配置文件应用程序)需要特权来设置 CPU 时钟速度。

Min Max

Min Max 调频器会根据负载选择最低或者最高的频率,而不会使用中间频率。

Interactive

Interactive 会平衡内核开发人员(或用户)设置的时钟速度。换句话说,如果应用程序需要调整到最大时钟速度(CPU 100%负载),用户可以在调频器开始降低 CPU 频率之前执行另一个任务。由于此计时器,Interactive 还可以更好地利用介于最小和最大 CPU 频率之间的中间时钟速度。它的响应速度明显高于 OnDemand,因为它在调整到最大频率时速度更快。

Interactive 还假设用户打开屏幕之后很快就会与其设备上的某个应用程序进行交互。 因此,打开屏幕会触发最大时钟速度的斜坡,然后是上述的定时器行为。

Interactive 是当今智能手机和平板电脑制造商的首选默认调频器。

InteractiveX

由内核开发人员“Imoseyon”创建,InteractiveX 调频器主要基于交互式调频器,增强了调整计时器参数,以更好地平衡电池与性能。但是,InteractiveX 调频器的定义功能是在屏幕关闭时将 CPU 频率锁定到用户最低定义的速度。

Smartass

基于 Interactive,表现和之前的 minmax 一致,smartass 相应更快。电池寿命很难精确量化,但它确实在较低频率下可以使用更长。

当睡眠时调整到 352Mhz ,Smartass 还会限制最大频率(或者如果您设置的最小频率高于 352,它将限制到您设定的最小频率)。

该调频器会在屏幕关闭时缓慢的降低频率,甚至它也可以让手机 CPU 频率降至一个让手机无法正常使用的值(如果最小频率没有设置好的话)。

SmartassV2

从 Erasmux 中而来的 Version 2 版本,该调频器的目标是“理想的频率”,并且更加积极地向这个频率增加,并且在此之后不那么激进。它在屏幕开启或者关闭时使用不同的频率,即 awake_ideal_freqsleep_ideal_freq。 当屏幕关闭时,此调频器非常快地降低 CPU(快速达到 sleep_ideal_freq )并在屏幕开启时快速向上调整到 awake_ideal_freq。 屏幕关闭时,频率没有上限(与 Smartass 不同)。因此,整个频率范围可供调频器在屏幕开启和屏幕关闭状态下使用。这个调频器的主打功能是性能和电池之间的平衡。

Scary

Scary 基于 Conservative 并增加了一些 smartass 的特征,它相应地适用于 Conservative 的规则。所以它将从底部开始,采取一个负载样本,如果它高于上限阈值,一次只增加一个梯度,并一次减少一个。 它会自动将屏幕外的速度限制为内核开发人员设置的速度,并且仍然会根据保守法律进行调整。 所以它大部分时间都花在较低的频率上。 这样做的目的是通过良好的性能获得最佳的电池寿命。

schedutil

schedutil 是最新版本 Linux 内核(4.7+)中的 EAS 调控器,旨在更好地与 Linux 内核调度程序集成。它使用内核的调度程序来接收 CPU 利用率信息并根据此输入做出决策。作为结果,schedutil 可以比依赖于定时器的 Interactive 等常规调控器更快,更准确地响应 CPU 负载。

更多的 governor 可以访问下方的 xda 链接。

reference


2019-08-02 android , kernel , cpu-governor

QQ 音乐 qmcflac 文件解密

首先说重点,代码来自:

Build

按照项目主页的方式 Build,生成 decoder 二进制可执行文件即可。

这个二进制可以实现 qmc0、qmc3、qmcflac 格式转换,生成普通未加密的 mp3, 或者 flac 文件。

Result

运行

qq music decoder

结果

qq music decoder result

外延

C++ 实现的另外一个版本

如果熟悉 Java 也可以参考这个项目

如果熟悉 C# 那么可以看看这个项目


2019-07-27 qq-music , flac , decoder

Vim 插件之全局搜索:ack.vim

这篇文章看开始陆陆续续记录一下用过的 Vim Plugin,虽然有些一直也在用但从没有好好整理过,正好这篇开一个计划吧。

Ack.vim 在 vim 中使用 ack 或者 ag 来搜索,通过 Quickfix 来提供所搜结果

首先放上链接

我使用 Vundle 管理,安装更新就不展开,这里重点介绍一下该插件。这里需要注意 ack.vim 需要依赖 ack >= 2.0 及以上版本。

Installation

brew install the_silver_searcher
sudo apt install silversearcher-ag

~/.vimrc 中 Vundle 安装

Plugin 'mileszs/ack.vim'
let g:ackprg = 'ag --nogroup --nocolor --column'

Introduction

ack.vim 的功能是给 Vim 提供 ack 的功能,可以在编辑器中调用 ack 工具来进行搜索,并友好的展示。

Usage

在 Vim 中直接

:Ack [options] {pattern} [{directories}]

说明:

  • 默认情况下会递归搜索当前目录
  • pattern 支持正则

搜索的结果会显示在窗口中,显示的格式是文件名,内容在文件中的行数以及内容。在该窗口中回车 Enter 会直接跳到该文件中。

?    a quick summary of these keys, repeat to close
o    to open (same as Enter)
O    to open and close the quickfix window
go   to preview file, open but maintain focus on ack.vim results
t    to open in new tab
T    to open in new tab without moving to it
h    to open in horizontal split
H    to open in horizontal split, keeping focus on the results
v    to open in vertical split
gv   to open in vertical split, keeping focus on the results
q    to close the quickfix window

Config

" ack.vim
" 使用 leader + a search
cnoreabbrev Ack Ack!
nnoremap <Leader>a :Ack!<Space>

if executable('ag')
  let g:ackprg = 'ag --vimgrep --nogroup --column'
endif

" 高亮搜索关键词
let g:ackhighlight = 1

更多可以使用 :help ack 来查看

更多可以参考我的 dotfiles

reference


2019-07-21 vim , vim-plugin , ack , ack-grep , ag , search , grep

我可能要抛弃用了很多年的 Chrome 换用 Vivaldi

大概一两年前就听说了 Vivaldi 这样一款浏览器,它使用 Chromium 做内核,创始人是从 Opera 浏览器出来的,不满 Chrome 横扫浏览器市场,没有给 Opera 一点喘息的机会,很多 Opera 的特性在 Chrome 上都被摘掉了。所以他们就开始搞了这一个 Vivaldi 浏览器,我记得当时听到的第一个宣传语是,快,想来 Chrome 最初打开市场时的宣传语也是快,但是多少年过去了 Chrome 虽然自身保持非常干净,但是加上自定义的扩展,也变得越来越臃肿了,但倒是也在一个可以接受的范围内。两年前 Vivaldi 依靠这一条宣传没有吸引到我,但是我也下载尝试,并且这两年来一直存在我的电脑中。我记得之前在我看来最大的缺点便是不能同步数据,而这个功能也在之前的更新中被加上了。所以今天就非常值得拿出来讲一讲。

无法让我抛弃 Chrome 的原因

电脑中一直装着 Chrome 和 Vivaldi,但绝大多数情况下我只会打开 Chrome,毕竟这里累积了我多年的书签,扩展,同步的所有标签。

我总结 Chrome 让我无法抛弃原因:

  • 第一便是同步,全平台的无缝的体验,真正做到只要一个账号即可访问所有资源,甚至可以跨平台记录在另外一个平台上当前打开的页面
  • 第二,庞大且丰富的扩展,在 Chrome 应用市场几乎可以找到满足自己需求的所有扩展,我自己的扩展数量也是随着电脑内存的扩展而飞速增加,最恐怖的时候扩展列几乎侵占了所有地址栏的位置,但终究在选择之下只留下了最常用,并且最有效的插件
  • 第三,快速且高效的快捷键,在 Chrome 内几乎可以不用鼠标操作而浏览任何网页

Vivaldi 介绍

从 Vivaldi 的维基百科 地址上可以知道 Vivaldi 正式诞生于 2016 年 4 月 16 号。如今也已经过去了 3 年多,同样的是特性也增加了很多。

我一直期待着加入同步功能,直到 2.2 版本也终于加上了。

vivaldi

Speed Dial

说到当年的 Opera 很多人第一印象便是新标签页中的快速拨号样式,同样 Vivaldi 继承了该优点。

继承了 Chrome 所有优点

因为使用的是 Chromium ,所以 Chrome 的所有优点, Vivaldi 都有,并且也可以使用 Chrome 的扩展。

当年因为快,抛弃了 Firefox 而选择了 Chrome,而如今竟然因为快而抛弃了 Chrome。和别人推荐的时候说的第一条理由就是快。

Quick Command

使用 F2 弹出命令行,可以直接打开书签,搜索关键字,查看历史,等等等等。

手势

Opera 当前非常流行的手势被完全引用到了 Vivaldi,但是我并不是很喜欢鼠标手势,我宁愿用快捷键。

一键截图

包括整个网页的,和局部选择的

界面美观

虽然本人到并不太介意界面,但是 Vivaldi 的细节做的确实非常贴心,加载页面的进度条,甚至无形中让人觉得页面加载变快了,切换标签页时的缩略预览图,等等都非常贴心。

小惊喜

之前打开 Vivaldi 惊喜的发现竟然能够在浏览器中直接对当前的网页进行笔记,还能自动保存截图,简直太贴心了。

更多的功能有待你来发现


2019-07-20 chrome , vivaldi , google-chrome , opera , web-browser , firefox

使用 port knocking 隐藏 SSH daemon 端口

暴露在互联网上的服务器非常容易被恶意程序进行端口扫描,以前也整理过一篇 VPS 安全设置 的文章,但都是一些比较基础的设置,能够绕过一些简单的端口扫描,但是并不能从根本上解决端口扫描的问题。

Port knocking 通过防火墙的帮助能够实现,只有你按照特定方式请求后才开放端口,增加了一层保护。主要防止恶意攻击者通过端口扫描来对机器进行攻击。

这篇文章就通过 knockd 的使用来介绍一下 Port knocking 。

Note: 本文只演示 IPV4 下的配置。

Port knocking

Port knocking 类似于

准备工作

在配置 knockd 之前,首先需要了解 iptables 的基本使用。

允许本地回环地址,允许内部的网络访问

sudo iptables -A INPUT -i lo -j ACCEPT

允许当前活跃的连接继续保持

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT

允许本地 80 端口

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

除此之外组织所有的访问 (需要特别注意,输入这行命令前一定要非常清楚你即将做的事情)

sudo iptables -A INPUT -j DROP

查看

sudo iptables -S

持久化 iptables 设定

sudo apt-get install iptables-persistent
sudo service iptables-persistent start

安装 Knockd

sudo apt install knockd

配置

管理员打开

sudo vim /etc/knockd.conf

编辑如下内容

[options]
        UseSyslog

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

解释

在最上方 options 中可以看到 UseSyslog,表示的是 knockd 会将日志记录到系统的日志中,路径是 /var/log/messages

如果想要指定一个可以使用

LogFile = /path/to/log/file

在下方是两块配置,名字可以是任意,例子中的两块配置分别是打开 SSH 默认端口,和关闭 SSH 端口。

敲门的顺序由 sequence 来指定。当然正常配置时请换用尽量随机的端口。

seq_timeouttcpflags 分别用来做校验,请求包需要满足这两个条件,而 command 则是指定了满足条件后的动作。

在该例子中就是打开 SSH 默认的 22 端口。但是如果仔细看就会发现 iptables 中使用的是 -A 参数,会将这一条规则放到最后,那如果在 DROP 后面就不会有作用了,所以需要改成

command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT

使用 -I 来插入到规则列表开头。

启用 Knockd

修改配置

sudo vi /etc/default/knockd

修改内容

START_KNOCKD = 1

启动服务

sudo service knockd start

此时去测试

ssh root@server_ip_address

就会发现 22 端口被拒绝了。

然后在本地计算机上

for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done

然后在 ssh 连过去。

完事之后

for x in 9000 8000 7000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done

当然你可以在客户端直接使用 knockd

knock server_ip_address 7000 8000 9000

结束时

knock server_ip_address 9000 8000 7000

配置自动断开

[options]
    UseSyslog

[SSH]
    sequence = 5438,3428,3280,4479
    tcpflags = syn
    seq_timeout = 15
    start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout = 10
    stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

reference


2019-07-19 knocking , ssh , vps , security

威联通折腾篇十四:迁移系统盘

当时安装系统的时候就直接插入了一块硬盘,安装在了第一块机械硬盘上面,虽然读写也没有遇到什么瓶颈,但是记录以做备份,可以用于将系统迁移到 SSD 上。

下面的方法未经验证,慎用。应用可以迁移,但是一些配置可能无法成功备份到另一块硬盘中。

  1. Create a small new Volume using some of the unused space in Storage Pool 1
  2. Back up my System Setting (ControlPanel>Backup/Restore>Back up System Settings)
  3. Shut down NAS (systems that access the iSCSI storage will also be shut down)
  4. Pull the 1TB drive (System Volume)
  5. Put a 2 TB drive in both bay 3 and 4 (matching the model in bay 1 and 2)
  6. Power the NAS back on
  7. Restore from the backup taken in step 2 (point to the new volume created in step 1 for the System Volume)
  8. Add the new disks to the RAID Group in Storage Pool 1 and Migrate to RAID 5 then 6.

reference


2019-07-18 qnap , backup , system , nas

Intellij IDEA 支持 jQuery

在 设置中进行如下操作开启 jQuery 支持:

  • First press CTRL + ALT + S and go to settings.
  • Then click from the menu Languages & Frameworks
  • Select Javascript from the section below and select Libraries
  • In the open menu on the right, click on the Download button and select JQuery from the list
  • Download it and apply. It is done.

reference


2019-07-14 intellij , intellij-idea , javascript , jquery

使用 Tampermonkey 调试本地脚本

记录一下使用 Tampermonkey 调试本地脚本。

Tampermonkey 加载开发调试本地 js

首先设置 Tampermonkey 插件的设置

  • Chrome 中打开 chrome://extensions
  • 搜索 Tampermonkey ,并且在设置中开启 Allow access to file URLs

然后在文件中使用 @require 引入外部文件。

// ==UserScript==
// @name         Debug Userscript
// @namespace    https://github.com/einverne/userscripts
// @version      0.1
// @description  This is a debug script to load userscripts from local file system. NOTICE, you need to turn on Allow access to file URLs to @require local file https://www.tampermonkey.net/documentation.php
// @author       Ein Verne
// @match        http*://*
// @include      http://*
// @include      https://*
// @include      *
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @require      https://unpkg.com/dexie@latest/dist/dexie.js
// @require      file:///home/einverne/Git/userscripts/douban_export/douban_exporter.user.js
// ==/UserScript==

(function () {
    'use strict';

    console.log("debug script start here");
    // Your code here...
})();

reference


2019-07-13 tampermonkey , userscripts , userscript

电子书

最近文章

  • Substratum Android 上的主题引擎 Substratum 是一款 Android 上的主题工具,能够不用 root 来达到系统级主题修改。并且在该工具下有一群爱好者和社区开发了无数的美观且实用的主题。Substratum 开始于以前非常流行的 CyanogenMod, Cyanogen 内置了该主题引擎,并使得修改主题异常简单。但是不幸的是,Cyanogen 没有继续下去, 但是 Substratum 死灰复燃。最初的时候 Substratum 还需要 Root 来使用,但是 Android Oreo 之后就可以不依赖于 Root 了。
  • Flask Babel 使用 Flask babel 是 Flask 的语言扩展,允许非常简单的方式让 Flask 支持多语言。
  • Android 内核中的 CPU 调频 CPU 调频模块主要分为三块:
  • QQ 音乐 qmcflac 文件解密 首先说重点,代码来自:
  • Vim 插件之全局搜索:ack.vim 这篇文章看开始陆陆续续记录一下用过的 Vim Plugin,虽然有些一直也在用但从没有好好整理过,正好这篇开一个计划吧。