runcat-pystray-win V3

之前撸了一个 runcat-pyqt5-win,可以在windows任务栏养猫,用奔跑的猫来显示当前系统资源(CPU)的占用情况。

原来的基于 ptqt5 库比较大; 这次采用 pystray 轻量实现:

Requirements

  • psutil
  • pystray
阅读全文 »

1. 创建 Lorenz 函数,生成随机数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.animation as animation


# === define the lorenz system ===
# x, y, and z make up the system state
# t is time,
# sigma, rho, beta are the system parameters
def lorenz_system(current_state, t):
x, y, z = current_state

dx_dt = sigma * (y - x)
dy_dt = x * (rho - z) - y
dz_dt = x * y - beta * z

return [dx_dt, dy_dt, dz_dt]


# define the initial system state, system parameters
initial_state = [-0.1, 0.01, 0.08]
sigma = 10.
rho = 50.
beta = 3.

start_time = 0
end_time = 10
num_points = 100 * (end_time - start_time)
time_points = np.linspace(start_time, end_time, num_points)

# === generate datas =========
xyz = odeint(lorenz_system, initial_state, time_points)
data = np.array(xyz).T * 0.01 # scale down to 0.01
print(data)

print(data[0])

阅读全文 »

  • 申请 leancloud 应用。

ref: https://console.leancloud.cn/apps

  • 安装 pip install leancloud
1
2
3
4
5
6
7
8
9
10
11
12

import leancloud

leancloud.init("xxx", "yyy")

TestObject = leancloud.Object.extend('my_log')
test_object = TestObject()
test_object.set('col1', 'a')
test_object.set('col2', 'b')
test_object.set('col3', 'c')
test_object.save()

群晖型: DS218+,
CPU: Intel Celeron J3355
DSM版本: 7.0

1. 安装 bootstrap

1
2
3
4
5
wget http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh
chmod +x syno-i686-bootstrap_1.2-7_i686.xsh
sudo sh syno-i686-bootstrap_1.2-7_i686.xsh

reboot

2. 安装 aria2

1
2
3
ipkg update
ipkg install aria2

阅读全文 »

日历文件:将csv文件转换为ics

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# pip install icalendar

# %%
import pandas as pd

df = pd.read_csv('1.csv',
encoding='gbk',
header=0,
parse_dates=[0,1],
date_parser=lambda x: pd.to_datetime(x, format='%Y/%m/%d %H:%M'))

print(df)


# %%
from icalendar import Calendar, Event

cal = Calendar()
cal.add('version', '2.0')


for row in df.itertuples(index=False):
stime, etime, thing = row[0], row[1], row[2]

# print(row[0], row[1], row[2])

event = Event()
event.add('summary', thing)
event.add('dtstart', stime)
event.add('dtend', etime)
# print(event)

cal.add_component(event)

txt = cal.to_ical()
print(str(txt, encoding='utf8'))


# %%
with open('1.ics', 'wb') as f:
f.write(txt)

文件替换:保留原始路径

问题描述:将特定类型文件的文件挑出来,放入一个文件夹,批量处理之后再替换原文件。

1. 文件迁移

  • 将文件路径经过md5加密后,作为文件名前缀。
  • 复制文件到一个新文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# xyz_a.py
# %%
import os
import shutil

from hashlib import md5


# 创建 md5 对象
def encrypt_md5(s):
new_md5 = md5()
new_md5.update(s.encode(encoding='utf-8'))
return new_md5.hexdigest()


# old_root = os.getcwd() # 待处理文件的根目录
old_root = "E:\\"
new_root = "D:\\0\\"
exts = ['.xyz']


for parent, dirnames, filenames in os.walk(old_root):
for filename in filenames:
extension = os.path.splitext(filename)[1]

if extension.lower() in ext:

old_dir = os.path.join(parent, filename)
new_name = encrypt_md5(old_dir) + '_' + filename # 修改文件名
new_dir = os.path.join(new_root, new_name)

print(f'{old_dir};; {new_name};; {new_dir}')

# shutil.copyfile(old_dir, new_dir) # 复制到新文件夹


  • 用命令行运行:
    1
    python xyz_a.py > zzz.csv
阅读全文 »

0 Winget官网

Winget官网: https://github.com/microsoft/winget-cli

1. 安装 winget (Win10 LTSC)

目前官方只支持 windows store 安装,但 LTSC 并没有应用商店。

1
2
3
4
版本	Windows 10 企业版 LTSC
版本号 21H2
操作系统内部版本 19044.1766
体验 Windows Feature Experience Pack 120.2212.4170.0

Win10 手动安装 winget 方法如下:

参考安装方法: https://github.com/muradbuyukasik/winget-script

1.1 安装 VC++ v14 依赖

1.2 安装 Microsoft.UI.Xaml 依赖

  • 下载页面: https://www.nuget.org/packages/Microsoft.UI.Xaml/

  • 下载、解压、安装 appx:

    1
    2
    3
    4
    5
    6
    cd ~
    aria2c -c -s 5 -x 5 https://www.nuget.org/api/v2/package/Microsoft.UI.Xaml/2.7.1 # 注意版本号
    # 下载的文件: microsoft.ui.xaml.2.7.1.nupkg,解压
    7z x microsoft.ui.xaml.2.7.1.nupkg -o*
    cd microsoft.ui.xaml.2.7.1\tools\AppX\x64\Release
    Add-AppxPackage microsoft.ui.xaml.2.7.appx

1.3 安装 winget

  • 下载页面:https://github.com/microsoft/winget-cli/releases
  • 下载、安装 msixbundle
    1
    2
    3
    4
    5
    6
    7
    8
    cd ~
    aria2c -c -s 5 -x 5 https://github.com/microsoft/winget-cli/releases/download/v1.2.10271/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle # 注意版本号
    # aria2c -c -s 5 -x 5 https://ghproxy.net/https://github.com/microsoft/winget-cli/releases/download/v1.2.10271/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle

    Add-AppPackage .\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle

    .\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle

阅读全文 »

1.安装

以scoop安装oh-my-posh。

1
2
3
4
5
6
#
scoop install psreadline
scoop install posh-git

#
scoop install oh-my-posh

2. 配置文件

新建、修改配置文件,运行:

1
2
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
code $PROFILE

加入以下内容:

1
2
3
4
5

chcp 65001
Set-PSReadLineOption -PredictionSource History

oh-my-posh init pwsh --config ~\scoop\persist\oh-my-posh\themes\yo.omp.yaml | Invoke-Expression

ref: https://ohmyposh.dev/docs/

阅读全文 »

ref: (https://dominikrys.com/posts/zsh-in-git-bash-on-windows/)

1. 安装 zsh

https://packages.msys2.org/package/zsh?repo=msys&variant=x86_64

  • 1.1 从 MSYS2 下载 zsh package

    1
    aria2c -c -s 8 -x 8 https://mirror.msys2.org/msys/x86_64/zsh-5.8-5-x86_64.pkg.tar.zst
  • 1.2 解压
    压缩文件的格式是ZST, 需要安装一个支持的解压软件

    1
    2
    3
    scoop install zstd

    zstd -d zsh-5.8-5-x86_64.pkg.tar.zst

    \etc\usr 文件夹解压到本机 git 的安装目录:

  • 1.3 运行

    1
    2
    3
    4
    5
    zsh

    autoload -U zsh-newuser-install
    zsh-newuser-install -f

  • 设置 zsh 自启动, 在~/.bashrc加入:

    1
    2
    3
    if [ -t 1 ]; then
    exec zsh
    fi
阅读全文 »

书包没拿好掉地上, XPS13 9370 屏幕左上角磕到了,开机花屏。

想罢工是不可能的。

换新屏,连壳一起换了。

阅读全文 »

右键菜单

1
2
3
4
5
6
# 管理员运行运行后重启:
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

# 恢复默认:
# reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f

用 pymupdf 将电子发票转成图片,再插入报销单中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# %%
import os
import fitz
from pprint import pprint

fapiao_dir = 'src/'

zhantiedan = 'zhantiedan_blank.pdf'
ztd_pdf = fitz.open(zhantiedan)

new_name = 'fapiao_dayin.pdf'
new_pdf = fitz.open()


def fapiao_zhantie(fapiao=''):

print(f'\n=== fapiao pdf file:\n {fapiao}')
src_pdf = fitz.open(fapiao)

for p, page in enumerate(src_pdf):
pixmap = page.get_pixmap(dpi=300)
pixmap.save(f'{fapiao}_{str(p)}.png')

new_pdf.insert_pdf(ztd_pdf)
end_page = new_pdf[-1]
end_page.insert_image((100, 100, 700, 500), pixmap=pixmap)

src_pdf.close()

new_pdf.save(new_name)
print(f' {fapiao} :\n*** Done! ***\n')


for dir, folders, files in os.walk(fapiao_dir):
for file in files:
path = os.path.join(dir, file)
print(path)
if path[-4:] == '.pdf':
fapiao_zhantie(path)

ztd_pdf.close()
new_pdf.close()


ffmpeg 使用说明

查看使用说明:ffmpeg -h

1
2
3
4
5
6
7
8
9
# usage: 
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

# options:
-ab: 比特率
-vn: video no
-map_metadata 0: 保留 meta data

-y: overwrite output files
阅读全文 »

群晖自带的 ffmpeg 版本较低、支持编码库也比较少, 似乎不支持h265。从 SynoCommunity 升级 ffmpeg。

SynoCommunity 上给出了 DSM7版本 各套件的适配情况:

issue #4524: https://github.com/SynoCommunity/spksrc/issues/4524

1. 先从 SynoCommunity 安装 ffmpeg 套件

2. 设置 Video Station 调用 SynoCommunity 版本的 ffmpeg

https://github.com/SynoCommunity/spksrc/wiki/FAQ-FFmpeg

命令如下:

1
2
3
4
5
6
sudo mv /var/packages/VideoStation/target/bin/ffmpeg /var/packages/VideoStation/target/bin/ffmpeg.old
sudo ln -sf /var/packages/ffmpeg/target/bin/ffmpeg /var/packages/VideoStation/target/bin/ffmpeg
sudo cp -p /var/packages/VideoStation/target/lib/libsynovte.so /var/packages/VideoStation/target/lib/libsynovte.so.old
sudo sed -i 's/eac3/ZXXZ/' /var/packages/VideoStation/target/lib/libsynovte.so
sudo sed -i 's/dts/ZXZ/' /var/packages/VideoStation/target/lib/libsynovte.so
sudo sed -i 's/truehd/ZXZZXZ/' /var/packages/VideoStation/target/lib/libsynovte.so

恢复原来的设置

1
2
3
4
5
# Reverse the above changes:

sudo mv -f /var/packages/VideoStation/target/bin/ffmpeg.old /var/packages/VideoStation/target/bin/ffmpeg
sudo mv -f /var/packages/VideoStation/target/lib/libsynovte.so.old /var/packages/VideoStation/target/lib/libsynovte.so

阅读全文 »

PDF文档全文翻译,保留原有的PDF格式

1. 采用 pymupdf 识别 pdf 的图片和文字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import fitz
import re
from pprint import pprint

pdf_name = 'xxx-en.pdf'
print(f'Source pdf file: {pdf_name} \n')
src_pdf = fitz.open(pdf_name)
new_pdf = fitz.open()

for p, page in enumerate(src_pdf):
print(f'\n- translating PAGE -{p}- ...')

# 1.1 创建大小相同的新页面
new_page = new_pdf.new_page(width=page.rect.width, height=page.rect.height)

blocks = page.get_text('dict')['blocks']

# 1.2 图片
img_blks = [b for b in blocks if b['type'] == 1]
for img in img_blks:
# pprint(img)
new_page.insert_image(img['bbox'], stream=img['image'])

# 1.3 文字
txt_blks = [b for b in blocks if b['type'] != 1]
for txt in txt_blks:
text_tmp = ''.join([s['text'] for l in txt['lines'] for s in l['spans']])
text_tmp = re.sub('[@#$%^&*\'\"\n\r\t]', ' ', text_tmp).strip()

if text_tmp:
# print(txt['bbox'], text_tmp)

text_translate = '中国 ' + text_tmp
# text_translate = youdao(text_tmp)
new_page.insert_textbox(txt['bbox'], text_translate,
fontsize=6,
fontname='simhei',
fontfile=r'C:\Windows\Fonts\simhei.ttf')

# if p == 1:
# break

new_name = pdf_name.replace('.pdf', '-zh.pdf')
new_pdf.save(new_name)

print('\n------Done!-------')

阅读全文 »

这里可查CPU、内存型号
https://kb.synology.com/en-us/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have

  • 群晖型号:DS218+
  • CPU :Intel Celeron J3355 Dual Core
  • 架构: Apollolake(x64):
  • 内存:DDR3L SODIMM 2GB

群晖 DS218+ 原装内存只有 2GB,机器内预留了一个内存插槽,准备再加一个。

看了网上说群晖的机子认内存,而且最大识别到8G,也有说16G的,可以命令查询。

查看群晖内存 sudo dmidecode -t memory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ sudo dmidecode -t memory
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.

Handle 0x0023, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 16 GB
Error Information Handle: No Error
Number Of Devices: 1

Handle 0x0025, DMI type 17, 40 bytes
Memory Device
Array Handle: 0x0023
Error Information Handle: No Error
Total Width: 8 bits
Data Width: 8 bits
Size: 2048 MB
Form Factor: SODIMM
Set: None
Locator: ChannelB-DIMM0
Bank Locator: BANK 1
Type: DDR3
Type Detail: Synchronous
Speed: 1600 MT/s
Manufacturer: 0824
Serial Number: 25073816
Asset Tag: 9876543210
Part Number: D3SS56161XL10AA
Rank: Unknown
Configured Memory Speed: 1600 MT/s
Minimum Voltage: Unknown
Maximum Voltage: Unknown
Configured Voltage: Unknown

可以看到 Maximum Capacity: 16 GB

阅读全文 »

暑假马上结束了,悠悠约了琪琪姐姐要好好玩,连续几天晚上吃过饭都骑自行车去秦淮河边公园,一直玩到9点多。

我准备给她自行车加一个小灯,这样方便我能一眼找到她。

灯就用仙女棒上的,棒子已经丢了,一串小灯还留着,挺长的有1米多,但纽扣电池没电了,换成两节5号电池,刚好有个电池盒。

我正在安,悠悠说,爸爸你要做成能拆下来的。

我问为啥?

我下次要换大自行车,还把这灯安上去。

我说不用,到时候灯也换新的。

过一会,我把灯缠好了,线头准备焊到电池盒上。

悠悠说,你这可以换电池吗?没电了咋办。

可以换的,电池盒子可以打开。

有开关吗?灯是一直亮着的吗?

有。呶,关了。

阅读全文 »

配置 Github Action, 推送企业微信消息

1. 将企业微信的 secret 添加到 Action Secret

打开 hexo-source 仓库设置,在 Secrets 选项中,分别新建 3个 repo secret:

  • 名称设为CORP_ID, 内容为corpid的内容
  • 名称设为CORP_SECRET, 内容为secret的内容
  • 名称设为AGENT_ID, 内容为agentid的内容

2. 修改 wechat-push 代码

以发送 commit log 信息为列, 代码如下:

阅读全文 »

qiye-wechat-push

企业微信推送 python版

  • 不需要安装企业微信客户端
  • 可在微信中直接收到文本消息,内容显全文

1. 企业微信注册

  • 1.1 注册企业

用电脑打开企业微信官网,https://work.weixin.qq.com/, 注册一个企业

  • 1.2 获取企业ID

我的企业 –> 最下边可以看到企业ID: corpid

  • 1.3 获取应用ID

管理企业 –> 应用管理 –> 创建应用

创建完成后可得到应用ID agentid

  • 1.4 获取Secret

还在应用页面, 获取 Secret, 需要在企业微信客户端里接收。

这样就得到了 secret

2. 发送文本消息 python

阅读全文 »