跳到主要内容

博客

代码人生:编织技术与生活的博客之旅

  • 之前有个展示个人 waketime 的小卡片
  • 感觉还挺高级的
<p>
<img
src="https://github-readme-stats.vercel.app/api?username=anguswg&count_private=true&theme=dark&show_icons=true"
height="165"
/>
<img
src="https://github-readme-stats.vercel.app/api/top-langs/?username=anguswg&theme=dark&show_icons=true"
height="165"
/>
<img
src="https://github-readme-stats-nzp4ivrq9-florianbussmann.vercel.app/api/wakatime?username=AngusWG&theme=dark&show_icons=tru&range=last_7_days"
height="165"
/>
</p>


找了一下 leetcode 的项目

  • LeetCode-Stats-Card
  • 支持 leetcode 和 leetcode cn
  • 找到你的用户名
    • 顺便,用户名可以再力扣中更改一个好看的,目前 90 天一次。
  • 配置网页 配置一下
    • 还是展示 Activity 把,以前 hitmap 还稍微好看一点,但是做题太频繁真的扛不住,也不是很喜欢刷题。

![LeetCode Stats](https://leetcard.jacoblin.cool/anguswg?theme=light&ext=activity&site=cn)

LeetCode Stats


  • 懒人一点 直接吧 anguswg 换成你自己的用户名就好了
编程阅读需 1 分钟

删除旧镜像服务器文件

sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak.20240609

Docker d 开启代理

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

# Add content below
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

# 重启Docker
sudo systemctl daemon-reload && sudo systemctl restart docker

# 检查Docker有没有使用VPN
systemctl show --property=Environment docker
# Environment=HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890
编程阅读需 1 分钟

最近在编写爬虫时,我遇到了一个非常奇怪的请求,通过浏览器的 F12 开发者工具抓取到了它。

  • 响应与预览
    • 无法加载响应数据:因为该请求被重定向,所以没有可用内容
  • 但在请求发起者链下面有多条记录

  • 在网络选项卡下也能找到对应的请求
  • 经过几次跳转后,触发了浏览器的文件下载工具开始下载文件

  • 我首先尝试使用 requests 直接访问这个下载链接,等待了一段时间后,请求超时了
  • 我以为是 cookies 的问题,右键请求-复制为 cURL - [转成 Python 代码](https://curlconverter.com/)
    • 仍然不行
  • 我还以为每次请求会有某个头部或其他东西,于是使用了 requests.session。
    • 也不行
  • 偶尔有一次请求成功了,状态码是 200,但是我注意到 F12 里面显示的请求状态码是 302,还是不对劲,
  • 我查找了关于 Python requests 302 相关的帖子
    • Python requests 默认设置了 allow_redirects=True
    • 这导致了有 302 的情况下直接跳转到下一个链接,
    • 无法获取到文件下载的链接,
    • 然后直接开始下载,
    • 由于网络不稳定或其他原因,导致了超时。
    • 将 allow_redirects 设置为 False 后问题得到解决

# 三层下载
# 第一层
resp = requests.get(
download_url,
allow_redirects=True,
cookies=cookies,
proxies=proxies,
)

# 第二层
download_url_2 = resp.headers["Location"]
resp = requests.get(
download_url_2,
allow_redirects=False,
cookies=cookies,
proxies=proxies,
)
# 第三层
download_url_3 = resp.headers["Location"]
data = call_aria2(download_url_3)
  • 真是屁大点事发个帖子。哈哈哈。
屁大点事阅读需 2 分钟

小米运动数据导出

  • 参考
  • 我的 - 设置 - 账号与安全 - 注销账号 - 导出数据

图表体重

  • gpt 语句
现在有一个 filepath = './BODY_1711700416591.csv'  数据如下 

time weight height
2016-02-25 12:51:09+0000 62 null
2016-02-25 12:53:18+0000 64.5 null

怎么用图标查看 weight 的变化


import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 读取CSV文件
filepath = './BODY_1711700416591.csv'
data = pd.read_csv(filepath)
weight_filter = 50
start_time = "2014-01-01"
end_time = "2025-01-01"

# 将时间列转换为日期时间格式
data['time'] = pd.to_datetime(data['time'])

# 根据时间范围过滤数据
df = data[(data['time'] >= start_time) & (data['time'] <= end_time) & (data['weight'] > weight_filter)]

# 提取"weight"列的数据
weights = df["weight"]

# 设置图表大小
plt.figure(figsize=(12, 6)) # 宽度为12英寸,高度为6英寸
# plt.figure(figsize=(30, 20)) # 宽度为12英寸,高度为6英寸

# # 绘制柱状图,设置线条宽度为最细
# plt.bar(df['time'], weights, linewidth=0.5)

# 绘制折线图
plt.plot(df['time'], weights, marker='o', linestyle='-', linewidth=1)

# # 添加数据标注
# for i, weight in enumerate(weights):
# plt.annotate(weight, (df['time'].iloc[i], weight), ha='center', va='bottom')

# 设置横坐标刻度间隔为3个月
# plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))

# 设置纵坐标刻度间隔为5.0
plt.yticks([i for i in range(50, 100, 5)])


# 设置图表标题和标签
plt.xlabel('Time')
plt.ylabel('Weight')
plt.title('Weight Variation')
plt.xticks(rotation=45)
plt.grid(True)

# 设置Weight坐标轴范围
plt.ylim(55, 90)

# 自动调整子图布局,尽可能放大图表
plt.tight_layout()

# 显示图表
plt.show()
plt.savefig('weight_variation.png')

体重


随笔阅读需 2 分钟

选择镜像

在 docker hub 上搜索 frp ,没有官方镜像,目前下载量最高的是 snowdreamtech/frpc 这个,所以选用这个,查了一下没有现成的 docker-compose.yml 参考。

写配置文件

# 公网服务器
mkdir frps
touch frps/frps.toml
touch frps/docker-compose.yml

mkdir nginx
mkdir nginx/conf.d
touch nginx/conf.d/service_1.my_domain.conf
touch nginx/conf.d/tmp.my_domain.conf # 测试用 Nginx 配置

# 内网服务器
mkdir frpc
touch frpc/frpc.toml
touch frpc/docker-compose.yml

frps.toml

  • Server 端配置文件
    • 有公网 ip 或者域名指向
    • 用户访问 ip 所在的服务器
# vim frps/frps.toml
bindPort = 7000 #{必选} 客户端与该端口建立连接
log.to = "console" #{可选} 日志配置, 通过打印的方式输出日志
vhostHTTPPort = 7100 #{可选} http 代理需要,当访问该端口时跳到对应本地 frpc 代理
vhostHTTPSPort = 7200 #{可选} https 代理需要,当访问该端口时跳到对应本地 frpc 代理
transport.tcpMux = true #tcp 流多路复用(优化传输,需一致)

#身份验证
auth.method = "token" #{可选}身份验证方式
auth.token = "password" #token 设置密码,用于通过身份验证创建连接

#frp 服务仪表板配置

webServer.port = 7500 #{也可自行修改端口}
webServer.addr = "0.0.0.0" #公网 ip 或者域名
webServer.user = "admin" #登录用户名{可自行修改}
webServer.password = "admin" #登录密码{可自行修改}

frpc.toml

# vim frpc/frpc.toml
serverAddr = "服务器 IP 或域名"
serverPort = 7000
log.to = "console"
auth.token = "密钥"

#frpc 服务仪表板配置 可以不要
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"

[[proxies]]
name = "rdp"
type = "tcp"
localIP = "10.128.39.41"
localPort = 3389
remotePort = 3389

报错

访问 Nginx 域名间接性无响应

  • 写了个简单的配置测试,测试后依然没有返回结果,无日志。
# vim tmp.my_domain.conf
server {
listen 80;
listen 443 ssl;

server_name tmp.my_domain.com; #请求域名

include /etc/nginx/conf.d/base.conf;

location / {
default_type application/json;
return 200 '{"status":"success","result":"nginx json"}';
}
}

  • 本地机器上 curl tmp.my_domain.com 依然无结果。
  • 感觉是官方 nginx 被反复硬重启,导致的无响应。
  • sudo docker compose stop && sudo docker compose rm -f && sudo docker compose up -d
  • 重启后 curl tmp.my_domain.com 反应正常。

my_domain.com 端口可以访问 二级域名映射后走 Nginx 不能访问

 *1 connect() failed (111: Connection refused) while connecting to upstream, client: 223.73.6.219, server: ttrss.my_domain.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:10181/", host: "ttrss.my_domain.com"

被访问端 Server A

  • 声明所用的网络
# vim frps/docker-compose.yml
version: '3'
services:
frps:
restart: unless-stopped
image: snowdreamtech/frps
container_name: frps
volumes:
- ./frps.toml:/etc/frp/frps.toml
ports:
- 7000:7000
networks:
- default # 默认为 service_name + network_name = frps_default

networks:
default:
driver: bridge

访问端 Nginx

  • 注明需要访问的网络
# vim nginx/docker-compose.yml
version: '3'
services:
nginx:
restart: unless-stopped
container_name: nginx
image: nginx
# network_mode: "host"
ports:
- 80:80
- 443:443
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
privileged: true
volumes:
# # 有可能会出现不能挂载,这个时候用手动拷贝配置文件就行
# - /usr/local/nginx/nginx.conf/:/etc/nginx/nginx.conf
# - /usr/local/nginx/html:/usr/share/nginx/html
# - /usr/local/nginx/www:/var/www
# - /usr/local/nginx/etc/cert:/etc/nginx/cert
- /var/log/nginx:/var/log/nginx
- ./conf.d:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
- /etc/letsencrypt/live/my_domain.com:/usr/local/nginx/ssl/any
networks:
- frps_default # 默认为 service_name + network_name = frps_default

networks:
frps_default:
external: true
  • 这时候,Nginx 配置文件里的 ip 地址就可以直接用 frps 配置里的服务名 frps
# vim ./conf.d/service_a.my_domain.conf
upstream docker-frps {
server frps:3389;
}

server {
listen 80;
listen 443 ssl;

server_name service_a.my_domain.com; #请求域名

include /etc/nginx/conf.d/base.conf;

location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://docker-frps;

}

# set site favicon
location /favicon.ico {
return 204 ;
}
}

Nginx and favicon.ico - "GET /favicon.ico HTTP/1.1" FAILED

location = /favicon.ico {
return 204;
access_log off;
log_not_found off;
}

最后 frpc 的 docker-compose.yml

# vim frpc/docker-compose.yml
version: '3'
services:
frpc:
restart: unless-stopped
image: snowdreamtech/frpc
container_name: frpc
volumes:
- ./frpc.toml:/etc/frp/frpc.toml
# ports:
# - 7400:7400

因为是由 frpc 访问内网服务,所以它不用写端口,不过有个管理页面,需要的打开。


编程阅读需 4 分钟

因为是 zsh 所以修改 vim source ~/.zshrc

if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
tmux at -t 0 || tmux new -s 0
fi

一个命令版本

echo -e "\n# Automatically start tmux session\nif command -v tmux &> /dev/null && [ -z \"\$TMUX\" ]; then\n    tmux attach-session -t 0 || tmux new-session -s 0\nfi\n# Automatically start tmux session end\n" >> ~/.zshrc
source ~/.zshrc

再也也不用担心长命令不敢关 terminal 啦~

编程阅读需 1 分钟

Cloudflare Worker 是由 Cloudflare 提供的一种边缘计算平台,用于在全球分布的边缘节点上运行和扩展代码。它允许开发人员将自定义代码部署到 Cloudflare 的网络中,将计算任务尽可能地靠近用户,实现低延迟和高性能的应用程序。

使用 Cloudflare Worker,开发人员可以编写和部署 JavaScript 代码,这些代码在 Cloudflare 的边缘节点上执行。这意味着代码可以在靠近用户的位置运行,而不是在传统的中心化服务器上。这种分布式计算的方式可以提供更快的响应时间和更好的用户体验。

代码如下:

export default {
// async fetch(request, env, ctx) {
// return new Response('Hello World!');
// },


async fetch(request, env, ctx) {
const response = await fetch('https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US')
const data = await response.json()

const image_url = data.images[0].url
const target_url = `https://www.bing.com${image_url}`

const image_response = await fetch(target_url)

const response = new Response(image_response.body, image_response);
// 图片到期时间太长 有8天 设置 Cache-Control 标头
const CACHE_TIME = 12 * 60 * 60; // 缓存时间为 12 小时,单位为秒
response.headers.set('Cache-Control', `max-age=${CACHE_TIME}`);

return response;
}
};
  • 保存后项目会提示有对应的订阅链接
    • 这个链接就不放了,有每日 10w 的使用次数
  • 其实是为了 cloudflare-worker 这盘醋包了 bing-wallpaper 这个饺子。

图片到期时间太长

在 Microsoft Edge 浏览器中,你可以使用开发者工具来查看图片的缓存到期时间。请按照以下步骤进行操作:

  1. 打开 Microsoft Edge 浏览器,并导航到包含你要查看的图的网页。
  2. 在浏览器中,按下 F12 键,或右键点击网页上的任何位置,然后选择 "检查" 或 "检查元素"。这将打开开发者工具窗口。
  3. 在开发者工具窗口中,切换到 "网络" 或 "Network" 选项卡。这将显示所有加载的网络资源列表。
  4. 在资源列表中,找到你要查看缓存到期时间的图片。你可以使用筛选器或直接滚动浏览列表来找到它。
  5. 右键点击图片资源,并选择 "检查" 或 "Inspect"。这将打开 "元素" 或 "Elements" 面板,其中将显示有关该图片的详细信息。
  6. 在 "元素" 或 "Elements" 面板中,查找 "请求标头" 或 "Request Headers" 部分。在该部分中,你将看到 "缓存控制" 或 "Cache-Control" 的信息。它会提供关于图片缓存到期时间的指示。
    • 如果 "缓存控制" 或 "Cache-Control" 的值为 "max-age=xxx",其中 "xxx" 表示以秒为单位的缓存有效期。例如,"max-age=3600" 表示图片缓存将在 3600 秒(1 小时)后过期。
    • 如果 "缓存控制" 或 "Cache-Control" 的值为 "no-cache",表示该图片不会被缓存。
  • 通过查看缓存控制标头,你可以了解图片缓存的到期时间或是否会被缓存。请注意,这仅适用于服务器正确设置了缓存控制标头的情况。如果服务器未提供缓存控制信息,浏览器可能会使用默认的缓存策略。

  • 增加代码解决

    const CACHE_TIME = 12 * 60 * 60; // 缓存时间为 12 小时,单位为秒
const response = new Response(image_response.body, image_response);
// 设置 Cache-Control 标头
response.headers.set('Cache-Control', `max-age=${CACHE_TIME}`);
编程阅读需 3 分钟

停掉之前的 samba

Ubuntu 或 Debian

  • 打开终端。
  • 运行以下命令以停止 Samba 服务:
sudo systemctl stop smbd
sudo systemctl stop nmbd
  • 运行以下命令以禁用 Samba 服务,使其在系统启动时不自动启动:
sudo systemctl disable smbd
sudo systemctl disable nmbd

CentOS 或 RHEL

  • 打开终端。
  • 运行以下命令以停止 Samba 服务:
sudo systemctl stop smb
sudo systemctl stop nmb
  • 运行以下命令以禁用 Samba 服务,使其在系统启动时不自动启动:
sudo systemctl disable smb
sudo systemctl disable nmb

生成用户信息

sudo docker run -ti --rm --entrypoint create-hash.sh ghcr.io/servercontainers/samba

Enter username: bob New password: Retype password: bob:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U ]:LCT-65E47AF9:

配置 docker-compose.yml 文件

  • 跟着 样例 配置一下
    • 以前有 smb.conf 的可以直接大段复制进去
version: "3"
services:
samba:
image: ghcr.io/servercontainers/samba
container_name: samba
restart: unless-stopped
cap_add:
- CAP_NET_ADMIN
volumes:
- /home/bob/tmp:/home/bob/tmp
- /tmp/smb_tmp:/tmp/smb_tmp
ports:
- 137:137/udp
- 138:138/udp
- 139:139
- 445:445
environment:

GROUP_family: 1500

ACCOUNT_alice: alipass
UID_alice: 1000
GROUPS_alice: family

ACCOUNT_bob: "bob:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U ]:LCT-65E47AF9:"
UID_bob: 1001
GROUPS_bob: family

SAMBA_VOLUME_CONFIG_tmp: |
[tmp]
path = /home/bob/tmp
guest ok = yes
public = yes
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777
available = yes

SAMBA_VOLUME_CONFIG_share: |
comment = /home/bob/
guest ok = yes
public = yes
browseable = yes
path = /home/bob/
writable = no
create mask = 0777
directory mask = 0777
available = yes
  • windows 需要
    cap_add:
- CAP_NET_ADMIN
编程阅读需 2 分钟

images

  • [参考]
  • 项目地址 gethomepage/homepage
  • 先拉个镜像
    • 镜像拉起后会有配置自动出现在 ./config 这个目录里
    • 然后可以通过 VSCode SFTP 插件同步到编辑器,编辑完后再上传到部署服务器上。
version: "3.3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
environment:
ports:
- 3000:3000
volumes:
- ./config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
restart: unless-stopped

快速给每个 收藏点加上 ping 的功能

  • vscode 中 ctrl+R 打开当前文件的内容替换

    • 查找:href: (.*)\n(?! ping)
    • 替换为:href: $1\n ping: $1\n
    • 点击 "替换所有"
  • 相关文章

    • [[使用 cloudflare-worker 获取 bing-wallpaper 的每日壁纸]]
编程阅读需 1 分钟

tt-rss

  • Tiny Tiny RSS(TT-RSS)是一款基于 PHP 的免费开源 RSS 聚合阅读器,需要自行托管和部署,为基于网页的 RSS 阅读器。 暂时没找到邮件推送的方法。
  • 目前有被墙的 feedly 做替代品,不知道好用不。
  • 订阅配置可以一键导出,切换用问题不大。

wget https://raw.githubusercontent.com/HenryQW/Awesome-TTRSS/master/docker-compose.yml
docker-compose down
docker-compose up -d

http://localhost:181/ 默认账户: admin 密码: password

设置代理

在 docker-compose.yml 中 environment 增加全局变量 HTTP_PROXYHTTPS_PROXY

  service.rss:
image: wangqiru/ttrss:latest
container_name: ttrss
ports:
- 181:80
environment:
- HTTP_PROXY=http://localhost:9999
- HTTPS_PROXY=http://localhost:9999

设置邮件

  • 参考 [[ttrss 邮件]]
  service.rss:
image: wangqiru/ttrss:latest
container_name: ttrss
ports:
- 181:80
environment:
- ENABLE_PLUGINS=auth_internal,mailer_smtp # plugin
- SMTP_FROM_NAME=Tiny Tiny RSS
- SMTP_FROM_ADDRESS=USERNAME@gmail.com
- SMTP_SERVER=smtp.gmail.com:465
- SMTP_LOGIN=USERNAME@gmail.com
- SMTP_PASSWORD=PASSWORD
- SMTP_SECURE=tls

浏览器插件

  • RSSHub Radar
    • RSSHub Radar 是 RSSHub 的衍生项目,是一个能帮助用户发现和订阅 RSS 源的浏览器扩展插件。
    • 强烈建议安装。
    • 可以发现如 知乎、b 站、github 等 不常用 非官方 的 RSS 订阅源。
      • github 有官方的 release 订阅源,RSSHub Radar 不会显示,在 rsshub 教程 查到的。
    • 需要 TTRSS 能翻墙访问 RSSHub
  • 默认订阅源

rsshub

  • RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。它借助于开源社区的力量快速发展,目前已适配数百家网站的上千项内容。
  • RSSHub 和 TT-RSS 的主要区别在于,RSSHub 是一个 RSS 生成器,可以将非 RSS 格式的内容转换为 RSS 格式以便订阅;而 TT-RSS 是一个 RSS 阅读器,用于订阅和阅读 RSS 格式的内容。
  • 一般情况下不用部署
mkdir ~/server/rss -p
cd ~/server/rss
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
docker volume create redis-data
docker-compose up -d

访问 localhost:1200

编程阅读需 2 分钟