MoreRSS

site iconTjSky | 秋风于渭水修改

90后。编程爱好者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

TjSky | 秋风于渭水的 RSS 预览

本地 AI 图片视频搜索引擎——MaterialSearch

2025-02-28 12:06:54

基于 AI 的本地素材搜索引擎。扫描本地的图片以及视频,可以用自然语言进行查找。
实现中文语义下的 以图搜图、截图搜视频、查找本地素材、根据文字描述匹配画面、视频帧搜索、根据画面描述搜索视频。找素材再也不用费力去一个个翻 tag 了。


准备运行环境

首先,默认看本文的照片视频都是存在 windows 系统上的,以下都是基于 win 系统的操作
需要准备3个或4个东西
Python 3.11.7,Git ,CUDA,这三个的下载地址在文章的最前边。
视情况,你可能还需要一个魔法上网工具(假设你的魔法上网工具代理在127.0.0.1:6808)

安装 Python 3.11.7 与 pip

我这里采用直接系统内安装Python 3.11.7的方式(其实安装Python3.12.9也是可用的,看你需求了。)
如果你会用Miniconda,也可以用Miniconda实现Python多版本切换。

  1. 访问 Python3.11.7 下载页面
  2. 把页面拉到底,找到【Windows installer (64-bit)】点击下载

  3. 安装是注意,到这一步,需要如下图这样勾选 Add Python to PATH

    然后再点上边的 Install Now
    python

  4. 安装完成后,命令行里输入Python -V,如果返回Python 3.11.7那就是成功安装了。

  5. 命令行里输入 python -m pip install --upgrade pip安装升级pip到最新版。

安装 Git

  1. 访问 Git 下载页面

  2. 点击【Download for Windows】,【64-bit Git for Windows Setup】点击下载

  3. 一路下一步安装

  4. 命令行运行git --version,返回git version 2.XX.0.windows.1就是安装成功了。

安装 CUDA (nvidia显卡用户)

  1. 命令行运行nvidia-smi,看下自己显卡支持的 CUDA版本
    (升级显卡驱动可能会让你支持更高版本的 CUDA)

  2. 接下来前往英伟达 CUDA 官网,下载对应版本。
    注意请下载,你对应的版本号最高的版本,比如我的是11.7的,那就下11.7.1(这里最后的.1意思是,11.7版本的1号升级版)

  3. 选你自己的操作系统版本,注意下个离线安装包【exe [local]】,在线安装的话,速度还是比较堪忧的。

正式安装

以下假设你当前文件目录是D:\github\

建立虚拟环境并安装依赖

避免玩其他 Python 项目时出现项目依赖冲突问题

  1. 安装虚拟环境工具(virtualenv)
pip install virtualenv
pip install virtualenvwrapper
# virtualenvwrapper一定要在virtualenv后安装
  1. 创建一个新的虚拟环境:
virtualenv MSWenv

这将在当前目录下创建一个名为”MSWenv”的虚拟环境。

  1. 激活虚拟环境:
D:\github\MSWenv\Scripts\activate

这将激活虚拟环境,并将您的终端提示符更改为虚拟环境名称类似这样

(MSWenv) D:\github> ▏

拉取源码并安装依赖

# 拉取仓库
git clone https://github.com/chn-lee-yumi/MaterialSearch.git

# 进入目录
cd MaterialSearch

# 安装全部依赖(GPU运行)
pip install -U -r requirements.txt --index-url=https://download.pytorch.org/whl/cu121 --extra-index-url=https://pypi.org/simple/

# 安装全部依赖(CPU运行)
pip install -U -r requirements.txt --index-url=https://pypi.org/simple/

注意:
1. GPU运行里的cu121,作者原始脚本里这里是cu118,虽然理论上最新的是cu124,但是作者限制torch版本要小于2.4,所以实际最大只能用到CU121。
2. 如果你这会儿还拿不准用 GPU 还是 CPU 运行的话,请先按照【安装全部依赖(GPU运行)】执行,torch的GPU版本也支持CPU运行。

尝试启动

按照以下命令启动项目

python main.py
  • 首次运行会自动下载模型。下载速度可能比较慢,请耐心等待。如果网络不好,模型可能会下载失败,这个时候重新执行程序即可。
  • 如果想使用”下载视频片段”的功能,需要安装ffmpeg。如果是Windows系统,记得把ffmpeg.exe所在目录加入环境变量PATH,可以参考:Bing搜索
  • 如果不知道在你设备上 CPU 和 GPU 那个更快,可以在上边步骤中先走 【安装全部依赖(GPU运行)】,在依赖安装完毕后执行python benchmark.py,运行基准测试。

正式运行MaterialSearch

MaterialSearch 配置设置

建议通过在项目根目录创建.env文件修改配置
.env文件配置示例:

# 下面添加扫描路径,用英文半角逗号分隔
ASSETS_PATH=D:\Videos,D:\Pctures
# 如果路径或文件名包含这些字符串,就跳过,逗号分隔,不区分大小写
IGNORE_STRINGS=thumb,avatar,__MACOSX,icons,cache
# 图片最小宽度,小于此宽度则忽略。不需要可以改成0
IMAGE_MIN_WIDTH=64
# 图片最小高度,小于此高度则忽略。不需要可以改成0。
IMAGE_MIN_HEIGHT=64
# 视频每隔多少秒取一帧,视频展示的时候,间隔小于等于2倍FRAME_INTERVAL的算为同一个素材,同时开始时间和结束时间各延长0.5个FRAME_INTERVAL
FRAME_INTERVAL=2
# 视频搜索出来的片段前后延长时间,单位秒,如果搜索出来的片段不完整,可以调大这个值
VIDEO_EXTENSION_LENGTH=1
# 素材处理批次大小,过大会导致显存不足而无法运行或拖慢速度。
SCAN_PROCESS_BATCH_SIZE=4
# 支持的图片拓展名,逗号分隔,请填小写
IMAGE_EXTENSIONS=.jpg,.jpeg,.png,.gif,.heic,.webp,.bmp
# 支持的视频拓展名,逗号分隔,请填小写
VIDEO_EXTENSIONS=.mp4,.flv,.mov,.mkv,.webm,.avi
# 监听IP,如果想允许远程访问,把这个改成0.0.0.0
HOST=127.0.0.1
# 监听端口
PORT=8085
# 运行模式
DEVICE=cuda
# 使用模型
MODEL_NAME=OFA-Sys/chinese-clip-vit-base-patch16
# 数据库保存位置
SQLALCHEMY_DATABASE_URL=sqlite:///./instance/assets.db
# 是否web页启用登录验证功能,如需启用改为true
ENABLE_LOGIN=False
# 登录用户名
USERNAME=admin
# 登录密码
PASSWORD=123456
# 是否自动扫描设置路径下的文件变化,如果开启,则会在指定时间内进行扫描,每天只会扫描一次
AUTO_SCAN=False
# 自动扫描开始时间
AUTO_SCAN_START_TIME=22:30
# 自动扫描结束时间
AUTO_SCAN_END_TIME=8:00
# 是否启用文件校验(如果是,则通过文件校验来判断文件是否更新,否则通过修改时间判断)
ENABLE_CHECKSUM=False
  • 你发现某些格式的图片或视频没有被扫描到,可以尝试在IMAGE_EXTENSIONSVIDEO_EXTENSIONS增加对应的后缀。
  • 小图片没被扫描到的话,可以调低IMAGE_MIN_WIDTHIMAGE_MIN_HEIGHT重试

  • 运行模式(DEVICE)可以写的选项有auto/cpu/cuda/mps`四种,如果写 auto 的话,优先级是这样的:cuda > mps > directml > cpu

  • 一般来说默认的小模型就够用了,如果你显存大或者感觉小模型的精度不够,可以改成更大的模型
    更换模型需要删库重新扫描!否则搜索会报错。数据库路径见SQLALCHEMY_DATABASE_URL参数。

  • 模型越大,扫描速度越慢,且占用的内存和显存越大。
    如果显存较小且用了较大的模型,并在扫描的时候出现了”CUDA out of memory”,请换成较小的模型或者改小SCAN_PROCESS_BATCH_SIZE。如果显存充足,可以调大上面的SCAN_PROCESS_BATCH_SIZE来提高扫描速度。
    因为目前的N卡驱动,支持了内存显存融合,超过物理显存的模型会被放在内存中,不会直接炸显存
    可以启动任务管理器——性能——GPU——专用GPU内存查看实际显存占用。不要让斜杠前的数字过于接近斜杠后的数字(比如:10.7/12GB就是良好配置,而11.8/12GB就不太好了)

    • 4G显存推荐参数:小模型,SCAN_PROCESS_BATCH_SIZE=8
    • 4G显存推荐参数:大模型,SCAN_PROCESS_BATCH_SIZE=2
    • 8G显存推荐参数1:小模型,SCAN_PROCESS_BATCH_SIZE=16
    • 8G显存推荐参数2:大模型,SCAN_PROCESS_BATCH_SIZE=4
    • 超大模型最低显存要求是6G,且SCAN_PROCESS_BATCH_SIZE=1
    • 其余显存大小请自行摸索搭配。
  • 支持的模型列表
    • 中文小模型: OFA-Sys/chinese-clip-vit-base-patch16
    • 中文大模型:OFA-Sys/chinese-clip-vit-large-patch14-336px
    • 中文超大模型:OFA-Sys/chinese-clip-vit-huge-patch14
    • 英文小模型: openai/clip-vit-base-patch16
    • 英文大模型:openai/clip-vit-large-patch14-336

构建 MaterialSearch 一键启动脚本

  1. 目录下新建一个文件myrun.txt
  2. 打开填写以下内容
call D:\github\MSWenv\Scripts\activate
python main.py
pause
  1. 改后缀名为myrun.bat以后启动直接运行这个文件就好了。

  1. 注意不要关闭那个黑乎乎的CMD窗口,不用管那行红字,那只是提示工具的web页是用的Werkzeug运行的,只要你用这个工具库就会有这个提示。
  2. 打开浏览器访问最后提示的http://127.0.0.1:8085

开始使用 MaterialSearch

  1. 第一次使用需要先点击【扫描】按钮让程序本地素材做扫描生成数据库。
  2. 扫描速度,我写本文时用的 GPU 是 N卡 1650 ,大概 1图·1线程/秒。4G显存小模型可以开8线程,1小时理论可以扫2W多张图。视频处理速度大概是图片的三分之一,毕竟多了截取多个视频帧的步骤,默认是2秒一个关键帧,基本就是1小时的视频需要扫描1小时……
  3. 之后就可以用文字搜图,搜视频了,支持自然语言搜索,但描述请一定简单准确,毕竟用的模型参量也没那么大嘛
  4. 扫描图片需要的时间比较长,不过搜起来的速度还是很快的,我尝试在我的CPU:J4150,内存:8GB的 NAS 上部署,匹配阈值为0的情况下,大概1秒可以进行20000次图片匹配,如果提高匹配阈值为10,则大概可以提升到每秒大约35000次图片匹配。
  5. 搜视频时,如果结果中的视频很多且视频体积太大,电脑会卡。毕竟又不是剪辑工作站,一般人电脑那会同时开一堆视频的。所以建议搜索视频时,右侧那个【Top X】不要超过6个。

The post 本地 AI 图片视频搜索引擎——MaterialSearch appeared first on 秋风于渭水.

【资讯】AutoCAD 2022 在 Windows 11 24H2 上出现频繁崩溃 请不要升级你的系统或CAD

2025-02-27 12:02:06

前天晚上微软最新发布的支持文档中,微软表示已经暂停向安装 AutoCAD 2022 的设备推送 Windows 11 24H2 ,待修复问题后才会恢复推送。
简而言之就是:如果你电脑内安装了 AutoCAD 2022 再将系统升级到 Windows 11 24H2 ,CAD 就会频繁奔溃退出。其他版本如 AutoCAD 2020、AutoCAD 2024 则不会受到影响。( AutoCAD 2024 肯定没事,我用的好好的)

消息来源:微软 Windows 11,版本 24H2 已知问题和通知

AutoCAD


根据微软的说法,应该是 AutoCAD 2022 与系统之间的兼容性问题导致的,微软已经联系了 Autodesk 公司协助解决问题。待问题修复前使用 AutoCAD 2022 的用户不要手动升级安装 Windows 11 24H2

要注意微软的兼容性保留措施(暂停推送),只对系统内的 Windows Update、Windows更新 功能起作用,
如果使用 ISO 镜像、Windows 11安装助手、Media Creation 工具等方式安装的话是会绕过兼容性检测的。

如果你已经不小心升级到 Windows 11 24H2 了。可以考虑换个其他版本的 CAD ,比如 AutoCAD 2024 之类的不受影响的版本。

The post 【资讯】AutoCAD 2022 在 Windows 11 24H2 上出现频繁崩溃 请不要升级你的系统或CAD appeared first on 秋风于渭水.

论爱艺奇的法务部门有多离谱,头一次见还能这样发 DMCA 的

2025-02-26 17:52:02

之前也不是没收到过 DMCA 投诉,但是如此离谱的 DMCA 还是头一次收到。
论北京爱奇艺科技有限公司(以下简称爱艺奇)的法务部门有多离谱,爱艺奇不是中国公司吗?咋中文都看不懂了?一个句子,开头、中间、结尾分别含有关键词的一部分给我投诉了?
而且举报的很多站点提供的盗版资源也不是爱艺奇持有版权的那个资源。

版权声明:头图所用 iQiyi 图标来源为 Donnnno,遵守 CC BY-SA 4协议。


收到来自谷歌的 DMCA 通知

大中午的突然收到谷歌邮件,告知有版权移除。

我感觉自己还挺遵守版权的啊,发生啥了?
打开一看,哦,原来是RSS翻译站啊。

所以我是侵犯了谁的什么东西导致的 DMCA 呢

RSS翻译的来源基本都是各种媒体的新闻报道,
在我的认知里新闻申明来源的转载和翻译应该是不侵犯版权的
为啥会收到版权投诉,然后我接着往下看

啥?我看见了啥?版权所有者:北京爱奇艺科技有限公司?版权物:film“我们之间”?

我直接惊呆好不好,我第一反应是,是不是有境外媒体报道了这个电影引用什么东西,导致我把原文翻译后的结果,让爱艺奇认为我侵权了?

于是我去看了下那个网址上到底有什么,结果……就这?

这和爱奇艺主张的电影《我们之间》有什么关系呢?

吐槽一下爱艺奇

在爱奇艺法务眼中版权词是可以这样拆开的吗?

我们 的生活一夜 之间 发生了变化》=《我们之间》?

合着这玩意还能拆开理解的?

而且这里面的出现的唯一一个外链是 BBC 的,爱奇艺你咋不投诉英国 BBC 呢?

难道在爱奇艺法务眼中版权词是可以缩短用的?

你在国内用爱艺奇里是搜不到任何名字叫《我们之间》的影视资源的,
爱奇艺现在有版权的能勉强挨上这四个字的,叫《我们之间的秘密》
所以可以这样缩短用主张版权吗?

难道在爱奇艺法务眼中已下架内容也是可以拿来用的?

爱奇艺确实有一个名字是“我们之间”的东西叫《Between us》(是一个泰剧,中文翻译是“麻绳”或“我们之间”,爱艺奇持有东南亚区版权)
而其他叫《我们之间》的资源,一个是韩剧,一个是西班牙电影,爱艺奇则通通都没有版权。

整一个大无语

之前也不是没收到过 DMCA 投诉,但是如此离谱的 DMCA 还是头一次收到。
这也过于草台班子了,感觉纯粹是,程序自动化关键词搜索,然后自动一次性批量举报的结果。

更新一下进展

  1. 已经向谷歌提交反DMCA申请,要求恢复搜索索引结果。
  2. 经过申请详细清单,终于知道爱艺奇主张是什么东西了,是泰剧《我们之间》,就是上边提到的《Between us》(爱奇艺站内链接)爱奇艺持有东南亚区域版权。

  3. 但是实际上被爱艺奇举报的站点的网页涉及的关键词是《我们之间的秘密》、《我们之间的敌人》《Just Between Us 》、《我们之间》、《the space between us》、《day dau gai between us》等资源的影视站。他们的页面语言中文和英文都有,之间的共同点是都同时含有:我们之间between us播放观看playsaw it等关键词。
    爱艺奇确实如上边所说的,在扩大化举报任何网页中含有这个名词的非合规影视资源站点。,哪怕对方实际提供的并不是爱艺奇有版权的资源,只是页面中含有关键词

  4. 我们 的生活一夜 之间 发生了变化,而且没有人预料到这一点||Our life changed overnight and no-one saw it coming 】

同时含有了我们之间saw it()关键词,同时这不是已知的合规影视站点,所以爱艺奇的自动化版权维护工具就认为,这是一个提供《我们之间》播放的视频站,就给举报了。

The post 论爱艺奇的法务部门有多离谱,头一次见还能这样发 DMCA 的 appeared first on 秋风于渭水.

随机图片API:基于 Cloudflare Worker + 微博图床

2025-02-18 15:01:36

一个全白嫖的免费随机图片 API 实现,通过使用免费的 Cloudflare Worker 与免费的微博相册实现。
通过使用 Cloudflare Worker 反向代理微博图床内图片实现:1、绕过微博防盗链。2、避免网页端看到微博图片链接从而查找到图片发布者的微博。

随机图片API:基于 Cloudflare Worker + 微博图床


初步实现随机图片 API

首先也是最简单的,随机从图片链接中抽一个,返回结果,简单粗暴,直接写进代码里,在图片数量在2K行以内基本不用太担心性能问题。

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
    var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
 /*需要随机到的图片的链接*/
    ]
    var index = Math.floor((Math.random()*background_urls.length));
    res = await fetch(background_urls[index])
    return new Response(res.body, {
        headers: { 'content-type': 'image/jpeg' },
    })
}

反代微博图床

为什么要反代微博图床的图片,而不是直接返回图片地址给客户,主要是两个原因,
1. 微博是有防盗链设置的,会判断请求的 referer 是否是微博
2. 通过微博图片地址是可以反查到图片发送者的,如果打算提供公开服务,且不想暴漏自己的微博的话,最好隐藏图片实际地址。

因为代码有点长就不写文章里了,去github看吧。
基本就是构建请求头,检查图片地址是微博的话,就修改 referer 解决微博的防盗链,然后反向代理图片,返回结果。

简单的 Cloudflare Workers 部署步骤

  1. 登录你的Cloudflare
  2. 在主页右侧找到【计算(Workers)】
  3. 点进【Norkers和Pages】选择一个预设的子域,点击【set up】之后,我们选择免费套餐。
  4. 点进【Workers】,选择【创建Workers】-【快速开始】-【部署】-【编辑代码】
  5. 把这里的代码(https://github.com/tjsky/randompic/blob/main/index.js) 粘贴到页面左侧的输入框
  6. 修改代码中这部分网址为你想用来随机的图片的网址
    var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
 /*需要随机到的图片的链接,注意最后一行没英文逗号*/
  1. 点击【保存并部署】按钮,
  2. (非必须)单击你刚创建的Worker,选择重命名,起个好记好写的名字,比如pic
  3. 访问你的Worker的域名比如pic.tjsky.workers.dev就可以看到啦
  4. 因为众所周的原因Cloudflare Worker的默认域名国内是无法访问的,你可能需要套个自己的域名,
    可以参考这个文章《Cloudflare Workers 添加自定义域名 解决部分区域网络无法访问的问题

如果公开部署随机图片API还需要做点什么

以上基本自用就够了,但是如果你打算提供公开服务那么还需要在 Cloudflare 内考虑好这些事情
Worker那10W 次请求看起来很高,一天才 86400 秒够每秒1次多了,但如果有人反复刷或者用户极多的时候,还是很快就会没的了。最多的时候我的某个 API 后端怼了8个 Cloudflare Worker来满足前端需求,就这每天快到 UTC 0的时候还经常有额度接近 90% 的提醒。
1. 屏蔽爬虫。很多数据收集公司的采集爬虫是不管源站死活的,他会高频反复的采集网址。
2. 限制请求速率,防止有人恶意刷图。
3. 考虑缓存优化,现在每次刷新都是一张新图。

The post 随机图片API:基于 Cloudflare Worker + 微博图床 appeared first on 秋风于渭水.

年更话题:春运 12306 怎么抢票

2025-01-13 10:21:39

又双叒叕要春运了,又要开始和其他人在 12306 搏斗抢票了。
基于多年的 12306 抢票经验,总结了一些抢票小技巧,希望能帮到你。


关于火车票的基础常识

  1. 携程,管家,分流最终还是用你的12306账号去12306给你买票的。分流比较纯净,携程那可是能干出往你账号里添加不认识的人,然后用你的账号给其他人抢票的事情的。亦或者广州到重庆没票,给你买个广州南到佛山西,但是APP内已完成订单最大的字写的是《广州-重庆》让你以为你买到了全程票,你上车后才发现7个小时的车程,实际有座的区间只有20分钟的抽象事。

  2. 12306 放票不是完全整点,可能会早2~3秒,所以别卡整点刷新。(因为网页和APP显示的时间是你设备的时间,并不是真·北京时间)

  3. 如果你发现 12306 放票后,该车次直接就没看到票,这不是被人秒买走了,而是你的区间没开始售票。如果你这个区间售票,你肯定能看到票。

  4. 提交候补也是有排队的,是按你交钱的时间算的,未来有票了,谁先交钱先给谁票。

春运 12306 火车票的售票机制

  1. 开售后 12306 只放出始发终到(始发站到终点站)和始发站到部分大站的票。也有可能只放出始发终到的票。(少部分车票会放给线下)
  2. 如果选择的区间开始售票了,那么12306 在1~2分钟内都只返回一个缓存结果(每个缓存CDN结果不一样),期间查票 12306 不会去后端查询余票数量,返回的都是缓存。只有在提交订单时,后端才会真实的为你查找车票余票情况。
  3. 如果有票 12306 开始对提交者排队,此时 APP 用户会优先于网页用户。
  4. 如果什么票都没看到的话说明:12306 就没放票! 12306 就没放票! 12306 就没放票!
  5. 你要是狂刷新(间隔小于2秒),持续超过15~30秒,你的IP会被拉黑,查什么都随便返回一个缓存。
  6. 对于乘车区间在预填单试点范围的,优先满足提前填写的人。
  7. 12306 等大家提交候补,谁先交钱谁先排上队。
  8. 在距离开车还剩7~12天时,逐步开售中间车站的票,在服务器空闲时段,优先根据候补订单付款顺序完成订单,但会留出部分余票会按比例放到 12306 和 车站与代售点。

正确的 12306 抢票流程

  1. 最好准备2个挨着的出发日期
  2. 查询出发城市的起售时间
  3. 12306 做了一个叫 “购票信息预填” 的功能。在车票起售当日,可以在起售时间之前预先填写乘车人、车次、席别等信息,在车票开始发售时,一键提交订单。
  4. 开售时刻刷新几次后,发现目标车次直接无票,说明今天不放票,马上提交候补并付款,候补是按付款时间算的,所以你付款的越早排队越靠前。
  5. 然后,尝试买长乘短。也就是尝试将到达地往后边的大站选。
  6. 如果买长没戏或者太亏,可以尝试买短,也就是到达地买到前边几站,上车后补票。
  7. 如果还没票,还可以从出发地的上游大站开始买,但此种方式购票前,请确定你所在城市的车站会让你进站…有些认死理的车站可能会以非本站车片为由不让你进站乘车。
  8. 如果这还没戏,不如去看看空铁联程,这年月飞机票很便宜的,搞不好算上机场建设费,燃油附加费,比卧铺都便宜。

一些春运抢票乘车小技巧

  1. 候补票的兑现顺序是按你的支付时间算的,所以起售第一时间抢到的候补,也要在第一时间支付。
  2. 抢了候补,也还是要刷票的,出于公平策略,每次兑现一批候补时,也会放出一部分直接购买的票。除非你是第一批候补兑现集团内的,不然一定会出现候补没兑现,结果自己买到票了。
  3. 如果全程秒无,那就是没放票,因为12306的缓存机制,哪怕只有1张票被放出来,也会在1~2分钟内一直看到这张票,而不是秒无的。
  4. 如果你有可挂机的电脑的话,分流抢票很好用的。
  5. 12306 官方 APP 手动抢是优先级最高的购票渠道。携程、分流、木鱼等抢票都是基于 12306 网页版的,目前网页版是降权状态。所以即使你使用了分流/携程的定时抢票,放票的时候也请使用 官方 APP 手动抢票。
  6. 如果你的乘车区间在预填单试点范围(京津、江浙沪、广东 – 四川、重庆),强烈建议使用!
  7. 支付宝铂金、钻石会员可以兑换高铁贵宾厅特权的,春运可能会限制部分特权,比如可能没小零食,时长从3小时变成1小时,但是走贵宾厅是可以提前检票的,不用人挤人的拖着行李在站台狂奔还是很舒适的。(可以带1个6岁以下的儿童的)
  8. 如果有65岁以上老人同行,或者你恰好需要轮椅,12306 APP内申请重点旅客,可以享受优先上车优先下车的待遇。
  9. 请提前足够长时间到车站候车…春节人多,意外变数也更多。除非确定能接受迟到导致无法乘车的结果。
  10. 不要同时打开同一个 12306 账号的网页和APP! 虽然这俩确实可以同时登陆并打开,但如果你这样做购票排队时很可能会被降权放在队伍末尾。(如果你用了木鱼/分流/携程,就不要再打开你的12306 APP了,除非你已经下好订单就剩付款了)
  11. 基于上一条和第五条,应该用账号A在携程、分流、木鱼等抢票软件内抢票。再使用家人的账号B在 APP 上手动抢票。而不是在网页和APP内都是用账号A。

The post 年更话题:春运 12306 怎么抢票 appeared first on 秋风于渭水.

给博客增加 文章归档 和 年度统计 功能

2024-12-30 17:30:16

终于在建站11年的当下终于给博客增加了文章归档页。
是基于 Rank Math SEO 插件的 Sitemap Settings 功能实现了一个简单的文章归档页。
顺带在文章归档页内塞了一个额外的网站数据年度统计功能。
大概长这样:文章归档


起因 为什么想要加文章归档页了

起因是在《WindowTabs: 让几乎一切 Windows 窗口支持多标签功能》一文下,博友 ddw2019 在评论中提到我的站点“没有找到 Archive 页面,一个个翻页起来,感觉还是有点点费劲的呀。”

之前我一直感觉文章归档页的感知不强,我认为它的主要意义和好处是:系统化整理文章、提高可发现性、增强用户体验、SEO优化、展示创作历程这 5 个方面。

毕竟现在右侧有文章分类、随机文章、热门文章三个模块。系统化整理文章提高可发现性性上已经足够了。
SEO 优化上文章归档页固然归可以帮助搜索引擎更好地抓取和索引博客内容,不过在已经有 xml 站点地图的时候,文章归档页对于提供博客的 SEO 优化上作用不大,相较这种 html 格式站点地图,xml 格式的站点地图对搜索引擎会更加友好一些。

不过嘛,确实考虑到博客里确实是缺少一个展示创作历程和增强用户体验的东西。于是在2024年的年底,终于在建站 11 年后决定加上这个东西。

思考 实现文章归档页的方案

那么现在问题来了,如何多快好省的实现文章归档页 Archive 呢?
从这个博客的可以称之为极简的风格上估计大家都能看出,我并不太喜欢在美化折腾博客页面上消耗过多精力。

  • 方案一 网友 ddw2019 的博客中写到的方案 年度归档插件
    好处是省事的多,装个插件的事情。缺点是又双叒叕需要多装一个插件了,博客速度又要被拖累。
  • 方案二 利用现有插件 Rank Math SEO 的站点地图功能实现。
    好处是利用了现有插件,少装了一个插件,缺点是样式就简陋的多了,样式的自定义空间也小的多。

  • 方案三 自己实现一个页面
    优点是更加轻量,样式完全可以自定义。缺点是自己写东西需要费更多的时间。

权衡利弊后,我决定先用方案二顶上,先解决有无问题再说。

开干 实现文章归档

以下的必要前提是:你要有装 Rank Math SEO 这个插件,并且开启了他的 Sitemap 组件。
这里我只介绍必要的操作,如果想了解更多一点,这里有篇不错的文章 《家庭数据中心系列Rank Math SEO设置与优化-无敌的个人博客》

  1. 新建一个页面,起名叫文章归档并把固定链接设置为ex.your.domain/archives并发布。
    (是的,内容为空就行)
  2. 进入博客后台,左侧找到 Rank Math SEO 的 Sitemap Settings 部分,切换到 HTML Sitemap 标签,并开启开关。

  3. 将 Display Format (显示模式)设置为 Page 也就是页面模式。如果你想在文章归档页放入额外的东西,也可以设置为 Shortcode 模式,这样上一步时,需要在你想要插入文章归档页的地方写短代码[rank_math_html_sitemap] 即可。

  4. Sort by (排序方式),既然是文章归档页,那自然是选 Published Date (基于发表日期)啦。并且开启下边的 Show Dates (显示日期),这样文章后面就会显示发布日期了。

  5. Item Titles (项目标题),作为文章归档页,建议选 Item Titles (文章标题)而不是 SEO Titles (SEO用标题)这两者的区别是:SEO用标题是给搜索引擎和搜索结果用户看的,可能会比实际的文章标题会有些奇妙的拉长和缩短。比如文章实际标题很长,但是 SEO 标题可能会为了能保证在搜索结果页把关键词凸显出来会相对减少次要描述。也就是说 Item Titles (文章标题)更能反映文章内容。

  6. 最后保存即可,现在前边设定的固定链接看到一个比较简陋的,文章归档页了。
    类似本站这样:文章归档 (https://www.tjsky.net/archives)

增强 增加博客年度数据统计功能

本来事情就该结束了,结果中午的时候,我又在博友圈里看到了 ts小陈 的文章:《为WordPress网站添加年度数据汇总
我发现,“诶,这个东西不错嘛,可以很直观的展现每年博客的发展数据。”
随后尝试直接套用代码,然后果不其然的发现:事情并没有那么简单。
毕竟我现在用的主题上次更新已经是2022年了,主题并没有完美支持页面模板php文件。
并不能像他原文介绍的那样:

  • 将php文件上传到你主题的页面模板文件夹(pages文件夹)
  • 创建新页面选择该模板-年度数据
  • 发布页面,搞定。

于是我又研究了一下WordPress这个页面模板php文件应该怎么写,以及他代码具体是做了什么。
重新写了适配自己主题的页面模板文件。主要修改点是三个

  • 修改一下样式适配博客主题
    主要是套用原有page页的代码,改一个新的模板文件。还有些小修改,比如表格做成圆角啊,表格改个主题色啊,属于毫无技术含量的修改。
  • 修改其中统计字数的函数str_word_count()mb_strlen()
    中文不用空格来分隔单词,对于中文字符串,str_word_count()会将两个标点之间的整个字符串都视为一个单词,mb_strlen()则会根据当前PHP设定的编码自适应用基于UTF8或gbk等编码正确统计字数。所以改一下得到准确的字数统计。

//修改前的代码,在原文文件的第79行
word_count = str_word_count(strip_tags(content)); // 去除HTML标签后计算字数

//修改后的代码
word_count = mb_strlen(strip_tags(content)); // 去除HTML标签后计算中文字数

大部分面板和一键脚本部署的 PHP 应该默认就开了 mb_strlen 这个函数,不过对于用虚拟主机的可能需要注意下,这个 PHP 函数不一定被启用了。

  • 把缓存改成1天,30天有些长了。

原文写的是”数据使用 Memcached 缓存”,让人以为只能用于 Memcached。不过实际上,如果你用 Redis 或者其他什么缓存,只要你装了对应的缓存插件,比如用 Redis 并且装了 Redis Object Cache。可以保证wp_cache_get()wp_cache_set() 函数能正常工作就不需要注释掉缓存代码,不然每次都现场计算一次,这性能浪费不小。

最终效果如下图

很直观的数据
2017年上一个博客被我rm -rf */干没了之后,在 17 年 12月 底重建,18 年还在保持正常的更新,可惜博客没啥人看(看评论数量),外在驱动力不足 导致 19 ~ 21 年我基本上没更新过博客,21 年底,因为一些机缘巧合博客收获了一波较大流量,加之因为这个机缘巧合重新拾起写代码的乐趣,重新开始恢复正常的更新频率。

The post 给博客增加 文章归档 和 年度统计 功能 appeared first on 秋风于渭水.