在 hugo 中插入游戏信息卡片

起因:受到 https://immmmm.com/hugo-shortcodes-douban/ 的启发,看了一下也不是特别复杂,简单仿照了一下,获取游戏数据并展示。 目前支持游研社的链接(数据相对比较全,也比较好获取),后续有空的话可能会考虑一下支持一下 Steam 商店 之类的平台。 代码不复杂,直接开源了:gameinfo-api 框架使用的是 expressjs,使用起来并不复杂,直接看文档吧。 顺便撸了一个免费的 Node 服务:https://gameinfo-api2.onrender.com,限制如下: 每月 100G 流量 每月 750 小时的时候时间 超过 15 分钟没有流量的话,服务会被睡眠,睡眠后如果重新收到请求,服务冷启动的时间可能需要 30s 或者更长的时间 如果不嫌弃的话,可以直接使用以上的 URL。 使用方法和案例如下: hugo 的 shortcode 和 CSS 在此:https://gist.github.com/bobolo2ex/7ffd163cc99d7891c8c362b19b632b34 <!-- shortcode --> {{ $dbUrl := "https://gameinfo-api2.onrender.com/" }} {{ $dbID := replaceRE `.*yystv.cn/g/([0-9]+)/.*` "$1" (.Get 0) }} {{ $db := getJSON $dbUrl "yys/v1/" $dbID }} {{ $score := div (int $db.score) 10.0 }} <div class="post-preview game"> <img referrer-policy="no-referrer" loading="lazy" class="post-preview--image" src="{{ $db....

January 31, 2023

Read and Parse JSON With Rust

主要讲讲 Rust 是如何处理 JSON 格式/文件的。 我的需求主要如下: 从一个远程地址下载 JSON 文件,保存到本地 读取这个 JSON 文件 对这个 JSON 文件内容进行搜索匹配 返回搜索结果 本文章的内容主要是集中讲讲第 2 步的内容。 首先需要解析 JSON 格式如下: { "0100000011D90000": { "bannerUrl": "https://img.../37fdb...f83a.jpg", "category": [ "Adventure", "RPG" ], "description": "Welcome to the Sinnoh region! ", "developer": null, "id": "0100000011D90000", "isDemo": false, "language": "en", "name": "Pok\u00e9mon\u2122 Brilliant Diamond", "nsuId": 70010000039950, "numberOfPlayers": 1, "publisher": "Nintendo", "rank": 30712, "ratingContent": [ "Mild Cartoon Violence", "Users Interact", "In-Game Purchases" ], "size": 7334789120, "version": 0 }, ....

July 19, 2022

Rust 基本知识

更多是从一个前端开发者的角度,来比较一下两门语言的区别,以助于更方便的入门。 基本类型(DataType) 多数情况下,基本类型直接代表了最底层的语言实现。 JavaScript 是弱类型,基本数据类型有以下 7 种: String Number BigInt Boolean Symbol ( ECMAScript 2016 新增 ) null undefined Rust 是 静态类型 ( statically typed ) 语言,也就是说在编译时就必须知道所有变量的类型。每一个值都属于某一个 数据类型 ( data type ),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。基本都属于两类数据类型子集:标量(scalar)和复合(compound)。 Integer (整数类型) 位长度 有符号 无符号 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 128-bit i128 u128 arch isize usize 每一个有符号的变体可以储存包含从 $-(2^{n-1})$ 到 $2^{n-1}-1$ 在内的数字,这里 $n$ 是变体使用的位数。所以 i8可以储存从 $-(2^7)$ 到 $2^7-1$ 在内的数字,也就是从 $-128$ 到 $127$ 。无符号的变体可以储存从 $0$ 到 $2^n-1$ 的数字,所以 u8 可以储存从 $0$ 到 $2^8-1$ 的数字,也就是从 $0$ 到 $255$。...

July 14, 2022

WordPress 如何禁止明文传输用户名密码,防止中间人攻击

虽然全站已经 HTTPS 了,但是因为某些原因,不允许明文传输用户名密码,也就意味着需要在客户端做一层加密,然后在服务端解密。 了解下来只能选择 RSA 的方式了。 准备工作,首先需要生成秘钥: # 生成 1024 位的 RSA 私钥 openssl genrsa -out key.pem 1024 # 导出相对应的公钥 openssl rsa -in key.pem -pubout -out pubkey.pem # 复制出来备用 cat key.pem cat pubkey.pem 打开 wp-login.php 文件,将以下代码补充到 loginform 后面,我是放在 $login_script 后面。 主要是为了捕获登录表单,在 submit 的时候,把 user_login 和 user_pass 各自加密后再发送到服务端。 <script src="https://cdn.jsdelivr.net/npm/jsencrypt@3.2.1/bin/jsencrypt.min.js" type="text/javascript"></script> <script type="text/javascript"> (function($) { var user_pass = $("#user_pass"); var user_login = $("#user_login"); var loginform = $("#loginform"); var sign = '公钥'; var encrypt = new JSEncrypt(); encrypt....

April 15, 2022

定时检查 unraid 网络情况,并重启

主要是为了解决机器不知道为啥突然掉 ip 的问题,就写了一个简单地监测脚本。 这是一个简单的小技巧,直接使用 unraid CA 的 User Scripts Plugin 即可。 新建一个 Script, 名字简介随便填,Script 内容如下: #!/bin/bash ping fun2ex.com -c 1 >/dev/null if [ $? -ne 0 ];then # powerdown -r echo `date` powerdown restart >> /tmp/powerdown_logs.txt fi 检查时间选手动,按照 cron 的规则添加即可,考虑到阵列关机的时间,我这里设定了 30 分钟检查一次。 # cron setting */30 * * * * –EOF–

March 24, 2022

解决 Unraid 在关机的之后无法 unmout NFS 的问题

先说一下场景: 主机安装了 unraid 6.9.2 开了一个虚拟机跑黑群晖, 并直通了一个网口+两块硬盘 unraid 通过 Unassigned Devices 来挂载黑群晖的硬盘, 使用 NFS 协议 问题: 想更换硬盘的时候, 直接点停止阵列, 等了大半天都没有停止成功。 检查了一下系统日志, 发现一直卡在 Unmounting Remote SMB/NFS Share 不成功, 并且一直在重试。 造成这个问题的原因是因为黑群晖也是跑在 unraid 上面的, 停止阵列的操作会优先把 Docker 和虚拟机服务优先关闭掉, 导致 NFS 链接失去响应无法正常 Unmoun。 搜索了一下发现好多人都碰到过类似的问题:NFS 服务器某些原因断网后, NFS 客户机无法 umount 直到最新的 nfsv4 都是这样子, 所以会造成进程一致卡住在重试。 解决办法有以下两种: 更换成 SAMBA, SMB 无法卸载不影响关机,不会造成假死。 在关机前, 手动在 Unassigned Devices umount 所有已经挂载的 NFS mount, 或者可以打开终端运行 umount -l /mnt/remotes/* 强制卸载所有 NFS umount. 剩下在问题就是如何把方案 2 改成自动化,不需要每次去手工执行,在 unraid forums 看到一个解决方案:...

March 8, 2022

How to Install Seafile Pro and Use Caddy Proxy Fronted on Ubuntu 18.04

读完这篇文章,你应该能完成安装以下软件: python & python-pip caddy mysql-server jre seafile-pro ``` 注意:如果你想流程的跑 Seafile,机器配置建议: 1. 内存 >= 2GB 2. CPU >= 2 Core 环境准备 以下只针对 ubuntu 18.04 系统,在下一个 LTS 版本出来之前,应该都不会更新。 ...

March 4, 2022

win10 内网下如何开启远程登录

一开始找到一句这样的命令: wmic /node:[IP OR Domain] /user:[User] /password:[Password] PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 一直报错,没想明白是什么原因。 一番搜寻之后大致清楚了,最终的命令如下: wmic /node:[IP OR Domain] /user:[User] /password:[Password] RDTOGGLE WHERE (__Class!="") CALL SetAllowTSConnections 1 查阅资料: https://www.yuque.com/waiting4/fgq227/gfi4v7 https://blog.csdn.net/Aaron_Miller/article/details/109644865

March 25, 2021

Apple 微信公众号排版效果

近期到处都可以看到这个被刷屏的微信公众号案例。 https://mp.weixin.qq.com/s/ZYfIqwPNbHVepSyJsLFk-w 我们就来聊一聊怎么实现的,说起来也不复杂,主要就是利用 SVG 的动画效果 + 创意达到了这么酷炫的效果。 涉及到也只有两个动画元素 opacity 和 height 的变化。 微信图文内容本质上也是一段 HTML 代码,先看一个 demo 这是一篇正常的图片,只不过是全图片排版的。 ...

March 25, 2020

面试题一道

这是碰到的一道面试题,记录一下。 问题是:如何 json 数据的所有 key 从下划线改为驼峰 下面是答题过程中的实现方法: const testData = { a_bbb: 123, a_g: [1, 2, 3, 4], a_d: { s: 2, s_d: 3 }, a_f: [1, 2, 3, { a_g: 5 }], a_d_s: 1 } /** * _w 的形式转成 W */ function toCame(str) { return str.replace(/\_(\w)/g, function(a, b) { return b.toUpperCase(); }); } /** * 将一个json数据的所有key从下划线改为驼峰 * * @param {object | array} value 待处理对象或数组 * @returns {object | array} 处理后的对象或数组 */ function mapKeysToCamelCase(data) { if(data instanceof Array) { data....

November 15, 2019