Skip to main content

树莓派4b low voltage warning

· 4 min read

需求场景

用的好好的树莓派,有一天连接 vnc,发现桌面任务栏一直提示 low voltage warning,please check your power supply,看样子是供电不足,可是树莓派的负载并不高啊。

解决方案

搜了一大圈基本都是说电源的问题,电源确实不是官方的,可能质量不太好,可是之前一直没问题,怎么突然就有问题,连一年都没到啊。现在树莓派挂了一个小风扇,一个固态硬盘,负载只有 0.2 左右。后来终于搜到一个可能的原因。电源长时间充电会导致降压,断电后过一段时间就可以了。我的树莓派已经好几个月通电没关机了,有可能是这个原因。然后我就把树莓派的电源断了一晚睡觉了,第二天再接通,果然问题解决了。掌握了一个小知识啊,电源长时间充电还会降压啊,可能是山寨电源的原因吧

2020-12-30 日更新

继上次出现问题解决后,两周后再次出现这个问题,这次又断电睡觉了,第二天都好了。两次都是断电一整晚,第二天就好了。测试过只是通过命令重启树莓派是不能解决的,那到底断电多久是可以恢复的呢?下次遇到再测试一下吧

2021-02-28 日更新

再次出现此问题,关闭电源 5 秒后重启恢复正常。

2021-05-06 日更新

由于这个提示只有在连接显示器或 vnc 连接时才能在 gui 桌面任务栏看到,如果是 ssh 登录就看不到了,非常的不方便。最好是能够通过命令判断是否电压不足。具体的脚本详见 https://gist.github.com/maxme/d5f000c84a4313aa531288c35c3a8887
通过此脚本可以查看 cpu 和电压不足的问题。不过每次登录之后需要手动运行,实在不方面。而且脚本中采用了 while 循环需要手动中断脚本。所以可以把代码中的 while 循环去掉,并且在 ssh 登录的时候执行命令病输出到登录信息上。效果如下,具体方式参考 ubuntu 修改 ssh 登录提示信息
修改后的raspberry-power-supply-check.sh代码如下

#!/bin/bash
function throttleCodeMask {
perl -e "printf \"%s\", $1 & $2 ? \"$3\" : \"$4\""
}
function throttledToText {
throttledCode=$1
throttleCodeMask $throttledCode 0x80000 "Soft temperature limit has occurred, " ""
throttleCodeMask $throttledCode 0x40000 "Throttling has occurred, " ""
throttleCodeMask $throttledCode 0x20000 "Arm frequency capping has occurred, " ""
throttleCodeMask $throttledCode 0x10000 "Under-voltage has occurred, " ""
throttleCodeMask $throttledCode 0x8 "Soft temperature limit active, " ""
throttleCodeMask $throttledCode 0x4 "Currently throttled, " ""
throttleCodeMask $throttledCode 0x2 "Arm frequency capped, " ""
throttleCodeMask $throttledCode 0x1 "Under-voltage detected, " ""
}
temp=$(vcgencmd measure_temp | cut -f2 -d=)
real_clock_speed=$(vcgencmd measure_clock arm | awk -F"=" '{printf ("%0.0f", $2 / 1000000); }' )
sys_clock_speed=$(awk '{printf ("%0.0f",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
voltage=$(vcgencmd measure_volts | cut -f2 -d= | sed 's/000//')
throttled_text=$(throttledToText $(vcgencmd get_throttled | cut -f2 -d=))
echo "$temp $sys_clock_speed / $real_clock_speed MHz $voltage - $throttled_text"

js常用正则表达式整理

· 2 min read

在线正则表达式工具

基于Web开发者助手FeHelper修改的在线正则表达式工具

常用字符

#匹配中文字符                  /[\u4e00-\u9fa5]/gm
#匹配双字节字符 /[^\x00-\xff]/igm
#匹配行尾行首空白 /(^\s*)|(\s*$)/
#只能输入数字 /^\d+$/
#只能输入n个数字 /^\d{n}$/
#至少输入n个以上的数字 /^\d{n,}$/
#只能输入m到n个数字 /^\d{m,n}$/
#只能由英文字母组成 /^[a-z]+$/i
#只能由大写英文字母组成 /^[A-Z]+$/
#只能由英文和数字组成 /^[a-z0-9]+$/i
#只能由英文、数字、下划线组成 /^\w+$/

常用表单

#匹配Email地址          /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/   
#匹配URL地址 /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
#匹配手机号码 /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/
#匹配身份证号 /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
#匹配邮编号 /^[1-9]\d{5}(?!\d)$/
#匹配日期(yyyy-MM-dd) /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/

清除ios系统h5页面input,textarea disabled默认样式

· One min read

需求场景

textarea在设置了disable之后在安卓手机上显示正常,但ios系统手机上就会显示边框,背景为半透明,字体颜色为灰色。

解决方案

input:disabled, textarea:diabled {
-webkit-opacity: 1;
-webkit-text-fill-color: #333;
color: #333;
}

puppeteer爬虫400,412错误

· 4 min read

需求场景

最近发现一直爬取的网站升级了,无法通过request模块简单获取了。考虑到其实自己爬取的数据访问量并不大,实际也就我一个人偶尔访问一下,不会是因为我的爬取而去更新反爬虫机制,猜测是其他原因导致了网站升级了反爬虫机制。

解决过程

通过postman测试,可以发现一直返回412错误,后来在postman中携带了cookie,发现可以正常访问,所以通过在request请求中注入了我自己的cookie解决了问题。后来发现还是too young啊,cookie是有时效性的,一段时间后就会消失。于是想到可以通过puppeteer爬取而不是request,可奇怪的问题出现了,puppeteer访问居然显示400,搜了一大圈可以很确定是网站的反爬虫机制才会出现这个情况,参见puppeteer get 400 Error,这个机制有点666啊,一直以为puppeteer是万能的大招,后来通过搜索反爬虫机制,了解到识别puppeteer和普通chrome的大致原理,参见浏览器如何识别selenium及爬虫如何绕过反爬,到这里就很清楚了,我们需要改变puppeteer的默认参数来模拟真实的浏览器,搜索到puppeteer相关的代码,参见puppeteer无头模式下反反爬配置集合,后来在实际测试中,我需要爬取的网站只要删除默认的webdriver字段即可,并没有那么高级。

核心代码

const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.evaluateOnNewDocument(() => { //在每个新页面打开前执行以下脚本
const newProto = navigator.__proto__;
delete newProto.webdriver; //删除navigator.webdriver字段
navigator.__proto__ = newProto;
window.chrome = {}; //添加window.chrome字段,为增加真实性还需向内部填充一些值
window.chrome.app = {"InstallState":"hehe", "RunningState":"haha", "getDetails":"xixi", "getIsInstalled":"ohno"};
window.chrome.csi = function(){};
window.chrome.loadTimes = function(){};
window.chrome.runtime = function(){};
Object.defineProperty(navigator, 'userAgent', { //userAgent在无头模式下有headless字样,所以需覆写
get: () => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
});
Object.defineProperty(navigator, 'plugins', { //伪装真实的插件信息
get: () => [{"description": "Portable Document Format",
"filename": "internal-pdf-viewer",
"length": 1,
"name": "Chrome PDF Plugin"}]
});
Object.defineProperty(navigator, 'languages', { //添加语言
get: () => ["zh-CN", "zh", "en"],
});
const originalQuery = window.navigator.permissions.query; //notification伪装
window.navigator.permissions.query = (parameters) => (
parameters.name === 'notifications' ?
Promise.resolve({ state: Notification.permission }) :
originalQuery(parameters)
);
})
await page.goto('')

树莓派4b docker安装nextcloud打造私有云盘

· One min read

安装方式

nextcloud是基于php开发,可以通过lamp方式安装,不过我选择了docker安装的方式,因为比较简单方便。

步骤一:安装nextcloud

docker pull nextcloud
mkdir /data/nextcloud
docker run --name nextcloud -p 8080:80 -v /data/nextcloud:/var/www/html/data -d nextcloud

如果docker安装nextcloud太慢,可以参考docker修改国内镜像源

步骤二:初始化nextcloud

通过http://localhost:8080打开网站,可以看到初始化界面,默认数据库是sqlite,如果需要连接mysql等,注意将host地址改为http://xx.xx.xx.xx:3306,这个数据库可以是本地的,也可以是云端服务器的。

其他说明

如果需要通过域名访问这个地址,需要在/var/www/html/config/config.php配置文件中的trusted_domains加入这个域名

docker修改国内镜像源

· One min read

步骤一:替换中科大阿里云镜像源

修改/etc/docker/daemon.json文件

{
"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com/"]
}

步骤二:刷新配置

sudo systemctl daemon-reload
sudo systemctl restart docker

movable-area遮挡住页面元素,导致无法触发点击事件

· One min read

需求场景

最近在开发小程序时,遇到如下需求:之前固定在右侧的展开折叠按钮会挡住计数器,所以希望可以手动调整按钮的位置,使其可以上下拖动。看了下官方文档,movable-area,movable-view 是最快的解决方式。可当开发完成时,发现 movable-area 的区域实际也是覆盖在计数器上面的,导致计数器无法点击。

解决方案

movable-area {
pointer-events: none;
}
movable-view {
pointer-events: auto;
}

nginx上传文件出现413 Request Entity Too Large?

· One min read

需求场景

当用nginx上传文件时,出现413 Request Entity Too Large报错

解决方案

找到nginx的配置文件nginx.conf,修改或增加client_max_body_size属性值大小

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_max_body_size 5m;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

##以下省略
}

安卓手机安装frp实现内网穿透

· 3 min read

需求场景

家里有一台树莓派4b已经通过frp进行内网穿透了,有时候在公司远程更改树莓派上的frpc.ini文件,然后重启frpc时因为一些原因报错导致重启失败。然后就gg了,再也不能在公司访问树莓派了,搭建在树莓派的应用也就无法访问了。这时候刚好手上有一部退休的摔坏屏幕的安卓手机。就想着能不能安卓手机也通过frp内网穿透,然后当树莓派挂了的时候,再通过安卓ssh局域网的树莓派修复问题。经过搜索,确实是可行的。

安装环境

一开始想要把安卓手机刷成linux,然后通过linux安装frp,方案采用的是busybox+linux deploy,可是最后失败了。具体原因不详。后来了解到装busybox了,就可以安装frp,网上的一些教程也是安装busybox环境的,不过我没有试过。我用了termux,里面是集成busybox的,直接安装就能使用,不用折腾,而且不用root(我的手机已经root)。

步骤一:安装termux

我的手机是红米pro,android6,如果到termux官网安装已经是最新版本了,需要android7及以上,所以只能安装低版本的termux,下载地址在这篇文章中可以找到End of android-5/6 (termux.net) support on 2020-01-01

步骤二:开启ssh登录

在手机上打字输入命令是在太麻烦了,建议打开ssh,在电脑操作。

#安装ssh
apt install openssh
#开启ssh
sshd
#查看用户名
whoami
#电脑ssh登录,termux的ssh端口默认是8022
ssh -p 8022 用户名@192.168.1.22

步骤三:安装基础软件wget,vim

apt install wget
apt install vim

步骤四:安装frpc

根据自己手机的cpu通过wget下载对应版本的frp,一般都是arm64,具体安装方法参考基于frp快速搭建内网穿透工具
安装好后就可以通过frpc -c frpc.ini方式启动了

其他说明

安装好frpc后,还有ssh登录需要优化,可以在.bashrc文件中写入实现每次打开termux启动sshd

sshd
alias frpc='/data/data/com.termux/files/home/software/frp_0.34.1_linux_arm64/frpc -c /data/data/com.termux/files/home/software/frp_0.34.1_linux_arm64/frpc.ini'

树莓派4b安装seafile私有网盘

· One min read

安装方式

一开始考虑使用docker安装,不过失败了,并没有arm的docker镜像,后来在官网看到了树莓派的版本,记录一下安装方式。

步骤一:下载解压安装包

数莓派服务端安装包地址,根据自己的树莓派系统下载对应的版本。

cd  ~
mkdir seafile
cd seafile
wegt https://github.com/haiwen/seafile-rpi/releases/download/v7.1.5/seafile-server-7.1.5-buster-armv7.tar.gz
tar -zxvf seafile-server-7.1.5-buster-armv7.tar.gz

步骤二:初始化

cd ~/seafile/seafile-server-7.1.5
./setup-seafile.sh

步骤三:启动项目

cd ~/seafile/seafile-server-7.1.5
./seafile.sh start #启动seafile服务默认端口8082
./seahub.sh start #启动seafile web端默认端口8000

之后就可以通过http://127.0.0.1:8000访问了

步骤四:设置开机启动(可选)

详细参考systemctl设置开机启动,管理service