普通视图

发现新文章,点击刷新页面。
昨天以前首页

BASH: 如何使用 cURL 命令获取 HTTP 响应代码?

2025年4月18日 05:38

检查运行 curl命令 后的HTTP响应代码,您可以使用 curl 的 -w` 选项,这样可以指定自定义输出格式。以下是命令:

curl -o /dev/null -s -w "%{http_code}\n" <URL> 

您可以将HTTP响应代码保存到BASH变量中,如下所示:

resp=$(curl -o /dev/null -s -w "%{http_code}\n" <URL>) 

解释:

  • -o /dev/null: 丢弃响应体的输出。
  • -s: 以静默模式运行curl(不显示进度或错误信息)。
  • -w “%{http_code}\n”: 仅输出HTTP响应代码。

将 <url> 替换为您正在检查的实际URL。

如何获取HTTP响应代码和输出?

如果您想同时获取HTTP输出,您需要使用 `-o` 来重定向输出。例如:

resp=$(curl -s -w "%{http_code}" -o /tmp/curl_output.txt <URL>) 

然后,BASH 变量 $resp 包含HTTP响应代码,而文件 /tmp/curl_output.txt 则会保存请求的输出文本。

BASH小技巧

英文:How to Get HTTP Response Code using cURL Command?

本文一共 176 个汉字, 你数一下对不对.
BASH: 如何使用 cURL 命令获取 HTTP 响应代码?. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c BASH: 如何使用 cURL 命令获取 HTTP 响应代码? BASH BASH LINUX 小技巧
The post BASH: 如何使用 cURL 命令获取 HTTP 响应代码? first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. WordPress 最简单的过滤垃圾评论的方法 WordPress 很多垃圾评论都是由程序直接调用访问 wp_comments.php 造成的. 所以我们可以在 functions.php 文件里加入以下代码 新增一个过滤 简单的检查是否是直接调用. 1 2 3 4 5 6...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  4. 测测你的幸运 – Linux Fortune-Teller LINUX 下有很好很好玩的命令,之前已经介绍过: figlet, rig, curl. 现在推荐另一个 命令 fortune 是用来随机显示一段(句)话的.fortune 在英文里就是幸运的意思. 这个命令可以不需要 参数 如果没有 可以通过 apt-get...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 比特币钱包线上和线下有啥区别? 我玩比特币比较晚, 最近1比特币能到1900多英镑, 真是吓人. 之前有一个线下的比特币钱包, 最近又在 CoinBase 开了一个线上的比特币钱包. 线上和线下的比特币钱包都是一长串的字母数字组合, 很像随机字符串 比如: 1J88t5UAgKBHhMgzkyH9bpY5mPdCYAe5XQ 这个明显是唯一的, 可以在 BlockChain 上查到所有交易记录和余额:...
  7. LOGO 海龟作画 系列 一 之 给孩子最好的编程启蒙语言 – Logo Turtle Graphics – Series 1 – Best Introductory Programming for Kids I think the LOGO turtle graphic is the best introductory programming language for the kids....
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...

娃开始每天都在刷力扣, 他长大以后想当软件工程师

2025年3月3日 03:33

弟弟说,他想像我一样长大后成为一名程序员。然而,随着 人工智能/AI(比如ChatGPT) 的飞速进化,未来或许程序员这个职业都会被取代。这一两年,互联网大厂的招聘也明显减少了。

不过,我依然认为学习编程是一件好事。写程序不一定是为了当码农,刷题可以锻炼思维。之前教了他 700 天编程,但从未让他真正写代码,大概已经忘得差不多了。现在每天带着他刷题,也算是一次复习与再学习的过程。

对我来说,每天陪着他一起刷题,其实也相当于我自己做了一题。大部分时间里,我不亲自敲代码,而是我讲解,孩子来动手,这样能让他更熟悉代码,学得更快。

微博:我娃又在淘气了. 一身反骨: 我娃说他是想看看多添加几个if 会不会slow it down

merge-two-binary-trees-leetcode-by-ryan 娃开始每天都在刷力扣, 他长大以后想当软件工程师 教娃 教育 程序员 编程 育儿

我娃又在淘气了. 一身反骨: 我娃说他是想看看多添加几个if 会不会slow it down

相比之下,哥哥对金融更感兴趣,未来想从事相关行业,所以我没有强求他一起刷题,但有时候他也会在一旁听着。

乔布斯曾说:“这个国家的每个人都应该学习编程,因为编程能教会你如何思考。”(It teaches people how to think.)

perse-school-cambridge-visit-steve-jobs-quote-2024-09-28-10.16.58-scaled 娃开始每天都在刷力扣, 他长大以后想当软件工程师 教娃 教育 程序员 编程 育儿

乔布斯的名言:这个国家的每个人都应该学编程,它教会里如何思考。Every person in this country should learn how to program, as it teaches you how to think.

21 天可以养成习惯

我的儿子现在每天都在刷题,他说想成为一名软件工程师。但他还不知道,ChatGPT 正在统治世界,未来可能不再需要那么多程序员,尤其是初级工程师。

自己这辈子也就这样了,看不到希望,所以鸡个娃。每天带着娃刷力扣,等于自己也刷了一道。

ryan-leetcode-21-days-streak 娃开始每天都在刷力扣, 他长大以后想当软件工程师 教娃 教育 程序员 编程 育儿

每天弟弟都在刷力扣 希望他能坚持下来

视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书

Leetcode/力扣 多人协作代码房间

娃经常会在Google Talk上给我发力扣房间链接,邀请我看他实时敲代码,这个功能挺好,多人协作编辑文档。N年前QQ聊天对话框也有一个这种即时模型,可以实时看到对方敲的文字。

leetcode-room-with-my-son 娃开始每天都在刷力扣, 他长大以后想当软件工程师 教娃 教育 程序员 编程 育儿

力扣的这个房间功能挺好,娃开了房间,我就能同步看到他敲代码,也能同时指点帮助他进步!

教娃编程

刷题:程序员的基本技能

英文:My 10-yr old son starts to do leetcode every day
英文:Leetcode’s Coding Room – Real time Coding Collaboration (Coding Interview)
英文:My son wants to know if “too many if-s” would slow the code down

弟弟刷题 vlog – 刷题要从娃娃卷起

2025-04-07:Ryan 每天都在练 LeetCode。他正在厨房里用苹果平板 iPad Pro 11 英寸(妙控键盘 Magic Keyboard)解决二叉树问题/Evaluate Binary Tree。

视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 | Facebook

本文一共 1152 个汉字, 你数一下对不对.
娃开始每天都在刷力扣, 他长大以后想当软件工程师. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 娃开始每天都在刷力扣, 他长大以后想当软件工程师 教娃 教育 程序员 编程 育儿
The post 娃开始每天都在刷力扣, 他长大以后想当软件工程师 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 编程: NodeJs/Javascript 函数检查Tron/波场区块链上的交易是否已确认(TronGrid API) 我们想知道给定的交易是否已经在 Tron/波场 区块链上确认,这可以通过 TronGrid API 轻松实现。 为了确保交易在Tron/波场区块链上被确认,验证逻辑应关注交易的状态,这表明交易是否已被 Tron 虚拟机(TVM)成功处理。以下是正确的验证方法: 检查 receipt.result 验证交易成功的主要标志是 receipt.result 字段。值为 “SUCCESS”...
  4. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  7. 力扣 Leetcode 的刷题利器: 在线调试器和自动代码提示完成 力扣代码调试器 Debugger 最近 leetcode 刷题网站出了一个在线调试器. 个人感觉非常好用. 因为我平时是用 IPAD+蓝牙键盘来刷题, 而在 ipad 上是没有集成的IDE的, 对于调试来说, 只能很原始的让函数退出一个值, 然后尝试不同的输入来发现问题. leetcode在线调试器的好处...
  8. 35岁生日: 媳妇和孩子就是最好的礼物 35岁生日, 感觉是一道坎. 之前20多岁的时候得过且过, 总是对自己说, 反正还没30, 过了30岁生日, 总是会对自己说, 反正还没35, 还年轻. 但是该来的总是要来的. 35岁, 不再年轻, 这个月感冒2次, 很不正常, 年轻的时候身体几乎不生病,...

Sui 区块链编程: 通过 NodeJs/Javascript 函数获取 Gas 费用

2025年1月20日 04:06

在区块链开发的世界中,理解和管理gas费用对于优化交易至关重要。Sui作为一个相对较新但功能强大的区块链平台,有其独特的方式来处理gas价格。让我们来探讨如何使用Node.js和JavaScript获取Sui的gas价格。

Sui中的Gas理解

在区块链语境中,gas指的是执行交易或智能合约所需的费用。在Sui中,gas以MIST计量,其中1个SUI等于10^9个MIST。这意味着gas价格通常以每个交易或操作的MIST来报价。

获取Gas价格

这里有一个简单的异步函数来从Sui节点获取当前的gas价格:

const QUICKNODE_URL = "https://sui-mainnet-endpoint.blockvision.org"; // 你可以使用你自己的节点。

async function getGasPrice() {
    try {
      const response = await axios.post(QUICKNODE_URL, {
        method: "suix_getReferenceGasPrice",
        jsonrpc: "2.0",
        id: 1,
        params: [],
      });
      return parseFloat(response.data.result);
    } catch (error) {
      console.error("获取gas价格时发生错误:", error);
      return null;
    }
}

代码解析

  • axios.post: 我们使用axios向Sui RPC节点发送HTTP POST请求(假设QUICKNODE_URL在其他地方已定义为正确的URL)。
  • 方法和JSON-RPC: 使用 suix_getReferenceGasPrice 方法查询gas价格。采用JSON-RPC 2.0协议进行通信。
  • 错误处理: 如果获取gas价格时发生错误,会记录错误,并返回null以表示失败。

使用函数

你可以在异步上下文中调用这个函数:

(async () => {
  const gasPrice = await getGasPrice();
  if (gasPrice !== null) {
    console.log(`当前gas价格: ${gasPrice} MIST`);
  } else {
    console.log("无法获取gas价格。");
  }
})();

重要说明:

  • MIST: 返回的gas价格是以MIST计量的。为了实际应用,你可能需要将它转换为SUI以增加可读性,使用 gasPrice / 10^9。
  • QuickNode URL: 你需要用你实际的RPC节点URL替换QUICKNODE_URL。如果你不使用QuickNode,你可以连接到任何支持此RPC方法的Sui节点。
  • 异步特性: 记住,区块链交互本质上是异步的,因此使用async/await来处理promise。

获取Sui区块链Gas费用/价格的结论

使用Node.js获取Sui中的gas价格是直接的,但需要理解区块链gas机制的细微差别以及JSON-RPC通讯。这个代码片段可以作为开发者开始将gas价格检查整合到他们的Sui区块链应用中的起点,确保他们能够有效管理交易成本。

英文:Sui Blockchain Programming: Get the Gas Fee via NodeJs/Javascript Function

Sui 区块链编程

本文一共 496 个汉字, 你数一下对不对.
Sui 区块链编程: 通过 NodeJs/Javascript 函数获取 Gas 费用. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c Sui 区块链编程: 通过 NodeJs/Javascript 函数获取 Gas 费用 Javascript Node Js Sui 加密货币 区块链 程序设计 计算机 计算机
The post Sui 区块链编程: 通过 NodeJs/Javascript 函数获取 Gas 费用 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 油管视频/Youtube Premium会员的好处: 用了就回不去了 从前年开始,我成为了 YouTube 会员,不过中间时断时续,因为觉得价格有点贵。在英国,YouTube 家庭会员每月费用是 19.99 英镑(可供五位家人共享),而个人会员则是每月 12.99 英镑。去年回国前,我暂停了一段时间的会员服务,但回到英国后发现自己已经离不开 YouTube 会员了。 成为会员的最大好处就是没有广告。最初,YouTube 是没有广告的,但随着平台上视频数量激增,广告也逐渐多了起来。如今,YouTube 已然是长视频的王者,谷歌当年的收购绝对算得上是一次非常成功的商业决策,足以写进教材。随着视频数量越来越多,用户一辈子也看不完平台上的内容,所需的服务器资源也水涨船高。因此,谷歌插入广告确实无可厚非。然而,从最开始的一两个广告,到如今非会员用户每隔五分钟就得忍受一次广告,用户体验确实大打折扣。 会员的另一个好处是可以下载视频,不过并不是直接下载为视频文件.mp4,而是保存在设备上。这样一来,可以提前下载好音乐或视频,开车时就无需耗费流量了。 此外,YouTube...
  2. TikTok未能出售: 流量“难民”涌入小红书, 能否接得住? 最近,随着TikTok因监管压力未能在1月19日前完成出售事宜,大量的内容创作者和用户正在寻找新的平台安置自己的内容生态和社交网络。这一波流量转移,意外地将小红书(RedNotes)推向了风口浪尖。打开小红书,推荐页面中已经充满了国外用户的身影,甚至有用户戏称“小红书变成了‘国际版种草机’”。然而,这一流量迁徙带来的热闹背后,蕴藏着深刻的挑战和机会。 不过,由于美国新政府很快就要上台了,特朗普对抖音是比较友好的,所以目前这种局面可能会迎来新的转机。拜登政府上台后,政策方向可能会与特朗普有所不同,尤其是在针对中国企业的态度上,可能会采取更加审慎的评估方式,而不是简单的封杀或施压。 对于TikTok而言,这或许意味着缓冲的机会。一方面,拜登政府可能会重新审视TikTok在美国的安全问题,并尝试通过更为温和的方式解决争议,比如进一步完善数据监管和用户隐私保护,而非直接推动出售或下架。另一方面,如果政策有所松动,TikTok也许能够在国际市场重新站稳脚跟,挽回部分因政策不确定性流失的用户和广告商。 不过,这种转机并非完全没有挑战。TikTok必须快速适应美国监管层面可能提出的新要求,比如建立更加透明的数据管理流程、确保服务器本地化、以及加强对算法和内容分发的自我监督。此外,TikTok还需要修复此前因封杀风险导致的品牌信任危机,重新赢得用户和合作伙伴的信赖。 对于小红书来说,这也可能是一个需要重新评估全球化策略的时刻。如果TikTok因政策调整成功稳定住国际市场,那么这波流量“难民”可能会逐渐回归,甚至减少在小红书上的活跃度。这要求小红书在短期内快速吸引这些用户,并通过强化社区黏性和内容多样化,尽可能锁住这批流量。同时,小红书也需要未雨绸缪,为可能到来的用户流失准备应对策略。 无论TikTok是否会迎来转机,这场流量的争夺战都表明,在全球化的竞争中,灵活应变、长期规划和技术实力才是赢得用户和市场的关键因素。 外来流量与用户画像的冲突 小红书一直以其独特的社区氛围闻名,聚焦于生活方式、种草推荐和用户亲身体验分享,目标用户以中国年轻女性为主。随着大量国际用户的涌入,这一平台的内容调性可能面临巨大的冲击。很多本地用户已经开始抱怨,算法推荐的内容逐渐变得“陌生”,甚至暴露了个人的兴趣偏好。这种文化差异和用户需求的差异,可能会对小红书社区的核心黏性带来挑战。 不过,对于小红书来说,国际流量的到来也可能是一种绝佳的扩展契机。如果能够妥善应对文化融合问题,同时优化算法和内容分发策略,小红书完全有机会成为全球用户的内容分享平台,撬动TikTok留下的空白市场。 连夜招募的“英文审核”反映了什么? 面对流量的猛增,小红书显然已经嗅到了机会。平台据称正在连夜招募英文审核团队,足见其对全球化的重视和危机意识。审核机制的建立是平台内容生态的重要一环,尤其是当国外用户涌入时,如何维持内容的合法性、合规性和调性,将决定小红书能否将这波流量真正留住。 目前来看,这种快速扩展反映了小红书的敏捷反应能力,但从长期来看,审核机制的完善需要时间,语言和文化隔阂可能会导致内容质量在短期内下降。同时,海外用户的内容生产习惯与中国用户不同,是否能够在算法推荐和审核效率之间找到平衡,也是一个值得关注的问题。 小红书的变现模式是否支撑得住? 流量增长对于任何平台来说都是一次巨大的红利,但能否将流量转化为收入才是真正的考验。小红书的商业模式以种草电商为核心,通过“内容+电商”的闭环完成流量变现。然而,国际市场中用户的购买力、消费习惯以及对本土化商品的接受程度,都可能成为变现过程中的障碍。 国际用户的涌入如果只是短期行为,或者消费习惯难以转化为实际的电商订单,那么平台即便流量激增,也很难转化为长期收益。相比之下,TikTok的变现模式更依赖广告,而小红书的广告收入占比相对较低。如果能够快速调整策略,比如增加短视频广告位或推出国际版电商模块,小红书或许能在全球市场中占得一席之地。...
  3. 剑桥网红餐厅 The Ivy Cambridge Brasserie 上周刚过40岁生日,媳妇带我去剑桥的一家网红餐厅——The Ivy Cambridge Brasserie。这家餐厅是朋友推荐的,和那家Trinity一样很有名,可惜我们在剑桥待了近10年才知道。 The Ivy Cambridge Brasserie 是剑桥市中心一家备受欢迎的网红餐厅,位于历史悠久的 Trinity Street。餐厅设计时尚典雅,融合了现代与经典元素,为食客提供了一个舒适而奢华的用餐环境。这里的菜单丰富多样,覆盖全天用餐,从早餐到晚餐以及下午茶,提供英式经典美食如松露鸡肉派、英式早餐等,也有一些国际风味的菜肴。得天独厚的位置和独特的氛围使得 The Ivy Cambridge Brasserie...
  4. 负电价活久见: 安装Octopus智能电表省电费甚至赚钱 前几周我的电气公司 Octopus 终于来装智能电表了(Smart Meter),虽然是免费安装的,但是排队排了有两三年了吧。因为之前一直写邮件催的时候就老是说 Not Ready。 收到邮件说可以安装智能电表我还是相当开心和期待的,因为已经听说这玩意好,但是还是得亲身体验一下。工程师来安装大概不到2小时,其中需要停电闸一会儿,重新接下线。装好后,给了个小册子,自动切换到了 Agile 的电价,也就是每半小时的电价都不一样,提前一天可以在手机App和网站上查得。 正好在原来的电价计费合同快要结束前2天换到了智能电表计价 Octopus Agile方式,但是系统还是扣了我75英镑 Exit Fee (提前合同结束得交违约费),不过我一个电话打过去,公司很爽快就给我退了。...
  5. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  6. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
  7. ACM题解系列之 – 最小堆栈 (Min Stack) 没事刷刷题能防止老年痴呆, 而且也能让你随时处于最佳状态, 随时都可以炒老板鱿鱼另谋高就. 题目: 设计一个堆栈(Stack)使 push, pop, 和取最小 min 操作时间复杂度都是 O(1). 这题的难点就是在于怎么样用O(1)常数时间复杂度来取得堆栈里的最小值. class MinStack {...
  8. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....

WordPress 极简主题 Dear v1.2.0

2025年1月15日 15:53

独立博客至今仍是不少热爱分享的博主珍贵的自留地,会愿意投入精力去维护和滋养。通过博客,可以分享自己的专业知识、经验和见解,向读者提供有价值的信息,或展现魅力,或暗自陶醉。

来自读者的评论,有意义的互动,可能就是很多人坚持的原因。甚至有人提出,关闭了评论的博客,还叫博客吗?但总有利弊,开启评论意味着你需要投入更多的时间去回复和管理,抵抗 Spam 和无聊评论的骚扰,甚至引发言语攻击的事件。

所以,Dear 主题评论功能已增加,按需自取,哈哈。本次仅更新 WordPress 版本, Typecho 版本择日再改。

主要更新内容:

- 增加评论功能及样式(请在"设置">"评论"中关闭头像显示)
- 可选回复评论框跟随,默认禁用
- 部分样式优化

新版本请从主题发布页面获取 Github 链接:WordPress 版本

Win10系统更新暂停期限突破:轻松延长至3650天教程

2024年11月27日 02:00

在使用Windows 10系统的过程中,许多用户都曾遇到过系统自动更新的烦恼。尤其是当系统提示即将进行更新,而我们又恰好处于工作或者娱乐的关键时刻,这时候暂停更新就显得尤为重要。然而,Windows 10系统默认的暂停更新期限只有35天,这对于许多用户来说显然是不够的。那么,当这35天的暂停期限到期后,我们是否还能继续暂停更新呢?答案是肯定的。本文将详细介绍如何突破Windows 10系统更新暂停的限制,将暂停期限轻松延长至3650天。

一、准备工作 在开始操作之前,我们需要确保已经关闭了Windows Update的自动更新功能,并且当前系统没有正在进行的更新任务。此外,由于我们将要修改注册表,因此请务必备份好注册表信息,以防操作失误导致系统出现问题。

二、修改注册表 打开注册表编辑器 首先,我们需要打开注册表编辑器。按下键盘上的【Win + R】组合键,打开运行窗口,输入【regedit】命令,然后按下【确定或回车】键,即可打开注册表编辑器。

允许应用更改设备 在弹出的用户账户控制窗口中,点击【是】以允许注册表编辑器对你的设备进行更改。

定位到目标路径 在注册表编辑器窗口中,依次展开到以下路径: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings

新建DWORD值 在右侧空白处,右键点击鼠标,选择【新建 - DWORD (32 位)值(D)】,然后将其命名为【FlightSettingsMaxPauseDays】。

设置暂停天数 双击打开【FlightSettingsMaxPauseDays】,在弹出的编辑DWORD(32位)值窗口中,将基数选择为【十进制】,然后在数值数据栏中输入你想暂停更新的天数。例如,我们可以输入【3650】,然后点击【确定】按钮。

三、验证结果 完成上述步骤后,我们可以返回到Windows Update的设置界面,查看暂停更新的天数是否已经被修改为我们设置的天数。如果一切正常,你会发现暂停更新的天数已经成功延长至3650天。

同款说说页面部署代码分享

2024年5月12日 00:00

在一帮小伙伴的帮助下,杜老师终于完成了对说说页面的美化。对此颇有感概,不会前端是真不行,但就是学不会。该代码匹配 Volantis,可自适应夜间模式,感兴趣的可以尝试部署,有问题就不要问了,杜老师也不会~

特性

  1. 统计用户所发说说条数;

  2. 显示用户头像;

  3. 显示用户昵称;

  4. 显示平台的用户名;

  5. 支持大图显示;

  6. 可一键至说说广场进行评论。

效果

正常的浏览效果如下图:

夜间模式的浏览效果如下图:

代码

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
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/style.css" rel="stylesheet" type="text/css">
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/highlight.github.min.css" rel="stylesheet" type="text/css">
{% p center logo large, 点图片可放大! %}
<section id="main" class="container">
<div class="total">Total <span id="total">0</span> Memos 🎉</div>
<div id="memos" class="memos">
</div>
</section>
<script type="text/javascript">
var memos = {
host: 'https://s.dusays.com/',
limit: '10',
creatorId: '1',
domId: '#memos',
username: 'penn',
name: 'Teacher Du',
}
</script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/lazyload.min.js?v=17.8.3"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/marked.min.js?v=11.1.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/view-image.min.js?v=2.0.2"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.min.js?v=2.30.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.twitter.js"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/highlight.min.js?v=11.9.0"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/main.js"></script>
<script>hljs.highlightAll();</script>

注意:如果不是 Volantis 主题需删除{% p center logo large, 点图片可放大! %}所在行。

使用

请根据需求修改对应的内容:

参数说明
host域名
limit每页显示条数
creatorId用户的 ID
domId显示位置
username广场的用户名
name昵称

说说广场代码分享

2023年4月23日 00:00

首先感谢下林木木童鞋,参考他的代码才有此篇教程,效果可以参考本博说说广场。杜老师不擅长前端,如有更好样式,欢迎在评论区提出建议。本教程样式不兼容所有博客模板,如有错位等问题的出现,可在评论区中留言!

准备工作

此篇教程兼容各类博客框架,不管用的是 Hexo/Hugo/Typecho/WordPress 都可直接使用。

若无服务器可以不用搭建 Memos,借助现有平台「如杜老师的 https://s.dusays.com」注册账户即可。

广场代码

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
<script>
if (typeof Lately === 'undefined') {
const script = document.createElement('script');
script.src = 'https://jsd.onmicrosoft.cn/gh/Tokinx/Lately/lately.min.js';
script.onload = () => {
Lately.init({ target: '.bbs-date' });
};
document.head.appendChild(script);
} else {
Lately.init({ target: '.bbs-date' });
}
const urls = [
{home:"https://s.dusays.com/",host:"https://s.dusays.com/",apiV1:'v1/',creatorId:"1",comment:'',imgsrc:"https://cravatar.cn/avatar/28b57baa4e8f13fe4292ccb2de267e30"},
{home:"https://s.dusays.com/",host:"https://s.dusays.com/",apiV1:'v1/',creatorId:"70",comment:'',imgsrc:"https://bu.dusays.com/2023/07/13/64b00b0a2586c.png"}
]
var bbDom = document.querySelector('#bbs');
var load = '<div id="load" onclick="nextFetch()" ><button class="load-btn button-load">加载更多</button></div>'
var loading = '<div class="loader"><svg class="circular" viewBox="25 25 50 50"><circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"/></svg></div>'
var bbsDatas = [],bbsData = {},nextDatas = [],nextData = {},limit = 2
var page = 1,offset = 0,nextLength = 0,nextDom='',bbUrlNow = '',imgsrcNow = '',hostNow = '',creIdNow = '',commentNow = '',twiEnvNow='',artEnvNow='',artSiteNow=''
bbDom.innerHTML = loading
allUrls()
function allUrls(){
var myHtml = ''
for(var i=0;i < urls.length;i++){
myHtml += '<div class="bbs-urls bbs-url" onclick="urlsNow(this)" data-hostid="'+urls[i].host+"u/"+urls[i].creatorId+'" data-host="'+urls[i].host+'" data-apiV1="'+urls[i].apiV1+'" data-creatorId="'+urls[i].creatorId+'" data-imgsrc="'+urls[i].imgsrc+'" data-comment="'+urls[i].comment+'" data-home="'+urls[i].home+'" data-twienv="'+urls[i].twiEnv+'" data-artenv="'+urls[i].artEnv+'" data-artsite="'+urls[i].artSite+'" data-index="'+i+'"><img src="'+urls[i].imgsrc+'" alt=""></div>'
}
myHtml += '<div class="bbs-urls urls-button" onclick="urlsNow(this)" data-type="random"><svg t="1665928089691" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2562" width="32" height="32"><path d="M913.2 672l98.8 57.1c5.3 3.1 5.3 10.8 0 13.9l-43.4 25L710.4 924c-2.7 1.5-6-0.4-6-3.5V772c0-2.2-1.8-4-4-4H544c-70.4 0-134.4-28.8-180.8-75.2-11.1-11.1-21.2-23.2-30.1-36.1-6.4-9.2-20-9.1-26.4 0.1C260.5 723.9 183.1 768 96 768h-48c-26.5 0-48-21.5-48-48s21.5-48 48-48h48c42.5 0 82.6-16.7 112.9-47.1 30.4-30.4 47.1-70.5 47.1-112.9s-16.7-82.6-47.1-112.9C178.6 368.7 138.4 352 96 352h-48c-26.5 0-48-21.5-48-48s21.5-48 48-48h48c70.4 0 134.4 28.8 180.8 75.2 11.1 11.1 21.2 23.2 30.1 36.1 6.4 9.2 20 9.1 26.4-0.1 46.3-67 123.6-111.1 210.8-111.1H700.4c2.2 0 4-1.8 4-4V103.4c0-3.1 3.3-5 6-3.5l258.2 156 43.4 25.1c5.3 3.1 5.3 10.8 0 13.9L913.2 352 710.4 476c-2.7 1.5-6-0.4-6-3.5V356c0-2.2-1.8-4-4-4H544c-42.5 0-82.6 16.7-112.9 47.1-30.4 30.4-47.1 70.5-47.1 112.9 0 42.5 16.7 82.6 47.1 112.9C461.4 655.3 501.5 672 544 672H700.4c2.2 0 4-1.8 4-4V551.4c0-3.1 3.3-5 6-3.5L913.2 672z" p-id="2563" fill="#f5f5f5"></path></svg></div>'
myHtml += '<div class="bbs-urls urls-button"><a href="https://s.dusays.com/"><svg t="1665929410343" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6308" width="32" height="32"><path d="M906.212134 565.732986 565.732986 565.732986 565.732986 906.212134C565.732986 926.013685 541.666486 959.972 511.97312 959.972 482.297674 959.972 458.213254 926.013685 458.213254 906.212134L458.213254 565.732986 117.734106 565.732986C97.950475 565.732986 63.97424 541.666486 63.97424 511.97312 63.97424 482.279754 97.950475 458.213254 117.734106 458.213254L458.213254 458.213254 458.213254 117.734106C458.213254 97.950475 482.297674 63.97424 511.97312 63.97424 541.666486 63.97424 565.732986 97.950475 565.732986 117.734106L565.732986 458.213254 906.212134 458.213254C925.995765 458.213254 959.972 482.279754 959.972 511.97312 959.972 541.666486 925.995765 565.732986 906.212134 565.732986Z" p-id="6309" fill="#f5f5f5"></path></svg></a></div>'
myHtml = '<div id="bbs-urls">'+myHtml+'</div>'
bbDom.insertAdjacentHTML('beforebegin', myHtml);
}
function nextFetch(){
document.querySelector("button.button-load").textContent= '加载中……';
updateHTMl(nextDatas)
if(nextLength < 10){
document.querySelector("button.button-load").remove()
return
}
getNextList()
};
function urlsNow(e){
var domUrls = document.querySelectorAll('#bbs-urls .bbs-urls')
if(e.classList.contains('url-now')){
domUrls[e.getAttribute("data-index")].classList.remove("url-now")
fetchBBser()
}else{
domUrls.forEach(function(value,index){ domUrls[index].classList.remove("url-now")})
var btn = document.querySelector('button.button-load')
if(btn){btn.remove()}
page = 1,offset = 0
bbDom.innerHTML = loading
var type = e.getAttribute("data-type")
if(type == 'random'){
var num = Math.round(Math.random() * (urls.length-1))
hostNow = urls[num].host
creIdNow = urls[num].creatorId
imgsrcNow = urls[num].imgsrc
commentNow = urls[num].comment
twiEnvNow = urls[num].twiEnv
artEnvNow = urls[num].artEnv
artSiteNow = urls[num].artSite
homeNow = urls[num].home
apiV1Now = urls[num].apiV1
domUrls[num].classList.add("url-now")
}else{
domUrls[e.getAttribute("data-index")].classList.add("url-now")
hostNow = e.getAttribute("data-host")
creIdNow = e.getAttribute("data-creatorId")
imgsrcNow = e.getAttribute("data-imgsrc")
commentNow = e.getAttribute("data-comment")
twiEnvNow = e.getAttribute("data-twienv")
artEnvNow = e.getAttribute("data-artenv")
artSiteNow = e.getAttribute("data-artsite")
homeNow = e.getAttribute("data-home")
apiV1Now = e.getAttribute("data-apiV1")
}
bbUrlNow = hostNow+"api/"+apiV1Now+"memo?creatorId="+creIdNow+"&rowStatus=NORMAL&limit=10"
fetch(bbUrlNow).then(res => res.json()).then( resdata =>{
var arrData = resdata || ''
if(resdata.data){
arrData = resdata.data
}
bbDom.innerHTML = ''
bbsDatas.length = 0
for(var j=0;j < arrData.length;j++){
var resValue = arrData[j]
bbsData = {
memoId: resValue.id,
updatedTs: resValue.updatedTs,
creatorId:resValue.creatorId,
creator: resValue.creatorName || resValue.creator.nickname || resValue.creator.name,
imgsrc: imgsrcNow,
content: resValue.content,
resourceList: resValue.resourceList,
url:hostNow,
twiEnv:twiEnvNow,
artEnv:artEnvNow,
artSite:artSiteNow,
home:homeNow,
comment: commentNow
}
bbsDatas.push(bbsData)
}
updateHTMl(bbsDatas)
bbDom.insertAdjacentHTML('afterend', load);
var nowLength = bbsData.length
if(nowLength < 10){
document.querySelector("button.button-load").remove()
return
}
page++
offset = 10*(page-1)
getNextList()
});
}
}
function getNextList(){
var bbUrl = bbUrlNow+"&offset="+offset;
fetch(bbUrl).then(res => res.json()).then( resdata =>{
var arrData = resdata || ''
if(resdata.data){
arrData = resdata.data
}
nextDom = arrData
nextLength = nextDom.length
page++
offset = 10*(page-1)
if(nextLength < 1){
document.querySelector("button.button-load").remove()
return
}
nextDatas.length = 0
for(var j=0;j < nextDom.length;j++){
var resValue = nextDom[j]
nextData = {
updatedTs: resValue.updatedTs,
creatorId:resValue.creatorId,
creator: resValue.creatorName || resValue.creator.nickname || resValue.creator.name,
imgsrc: imgsrcNow,
content: resValue.content,
resourceList: resValue.resourceList,
url:hostNow,
twiEnv:twiEnvNow,
artEnv:artEnvNow,
artSite:artSiteNow,
comment:commentNow,
memoId: resValue.id,
home:homeNow,
}
nextDatas.push(nextData)
}
})
}
const withTimeout = (millis, promise) => {
const timeout = new Promise((resolve, reject) =>
setTimeout( () => reject(`Timed out after ms.`),millis));
return Promise.race([
promise,
timeout
]);
};
const fetchBBser = async () => {
const results = await Promise.allSettled(urls.map(
url => withTimeout(2000,
fetch(url.host+"api/"+url.apiV1+"memo?creatorId="+url.creatorId+"&rowStatus=NORMAL&limit="+limit).then(response => response.json()).then(resdata => {
var qsLive = ".bbs-urls.bbs-url[data-hostid='"+url.host+"u/"+url.creatorId+"']"
document.querySelector(qsLive).classList.add("liveon");
var arrData = resdata || ''
if(resdata.data){
arrData = resdata.data
}
return arrData
})
)
)).then(results=> {
bbDom.innerHTML = ''
for(var i=0;i < results.length;i++){
var status = results[i].status
if(status == "fulfilled"){
var resultsRes = results[i].value
for(var j=0;j < resultsRes.length;j++){
var resValue = resultsRes[j]
var dateNow = new Date()
var dateDiff = dateNow.getTime() - (resValue.updatedTs * 1000);
var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));
if(dayDiff < 10 ){
bbsData = {
memoId: resValue.id,
updatedTs: resValue.updatedTs,
creatorId:resValue.creatorId,
creator: resValue.creatorName || resValue.creator.nickname || resValue.creator.name,
imgsrc: urls[i].imgsrc,
content: resValue.content,
resourceList: resValue.resourceList,
home:urls[i].home,
url:urls[i].host,
comment:urls[i].comment,
twiEnv:urls[i].twiEnv || '',
artEnv:urls[i].artEnv || '',
artSite:urls[i].artSite || ''
}
bbsDatas.push(bbsData)
}
}
}
}
bbsDatas.sort(compare("updatedTs"));
updateHTMl(bbsDatas)
})
}
fetchBBser()
function compare(p){
return function(m,n){
var a = m[p];
var b = n[p];
return b - a;
}
}
function uniqueFunc(arr){
const res = new Map();
return arr.filter((item) => !res.has(item.creator) && res.set(item.creator, 1));
}
function updateHTMl(data){
var result="",resultAll="";
const TAG_REG = /#([^\s#]+)/;
const IMG_REG = /\!\[(.*?)\]\((.*?)\)/g;
BILIBILI_REG = /<a.*?href="https:\/\/www\.bilibili\.com\/video\/((av[\d]{1,10})|(BV([\w]{10})))\/?".*?>.*<\/a>/g;
NETEASE_MUSIC_REG = /<a.*?href="https:\/\/music\.163\.com\/.*id=([0-9]+)".*?>.*<\/a>/g;
QQMUSIC_REG = /<a.*?href="https\:\/\/y\.qq\.com\/.*(\/[0-9a-zA-Z]+)(\.html)?".*?>.*?<\/a>/g;
QQVIDEO_REG = /<a.*?href="https:\/\/v\.qq\.com\/.*\/([a-z|A-Z|0-9]+)\.html".*?>.*<\/a>/g;
YOUKU_REG = /<a.*?href="https:\/\/v\.youku\.com\/.*\/id_([a-z|A-Z|0-9|==]+)\.html".*?>.*<\/a>/g;
YOUTUBE_REG = /<a.*?href="https:\/\/www\.youtube\.com\/watch\?v\=([a-z|A-Z|0-9]{11})\".*?>.*<\/a>/g;
marked.setOptions({
breaks: true,
smartypants: false,
langPrefix: 'language-'
});
const renderer = new marked.Renderer();
const linkRenderer = renderer.link;
renderer.link = (href, title, text) => {
const localLink = href.startsWith(`${location.protocol}//${location.hostname}`);
const html = linkRenderer.call(renderer, href, title, text);
return localLink ? html : html.replace(/^<a /, `<a target="_blank" rel="noreferrer noopener nofollow" `);
};
marked.use({ renderer });
for(var i=0;i < data.length;i++){
var memos = data[i].url
var memoId = data[i].memoId
var memoUrl = memos + "m/" + memoId
var comment = data[i].comment
var twiEnv = data[i].twiEnv
var artEnv = data[i].artEnv
var artSite = data[i].artSite
var bbContREG = data[i].content
.replace(TAG_REG, "<span class='tag-span'>#$1</span> ")
.replace(IMG_REG, '')
bbContREG = marked.parse(bbContREG)
.replace(BILIBILI_REG, "<div class='video-wrapper'><iframe src='//www.bilibili.com/blackboard/html5mobileplayer.html?bvid=$1&as_wide=1&high_quality=1&danmaku=0' scrolling='no' border='0' frameborder='no' framespacing='0' allowfullscreen='true'></iframe></div>")
.replace(NETEASE_MUSIC_REG, "<meting-js auto='https://music.163.com/#/song?id=$1'></meting-js>")
.replace(QQMUSIC_REG, "<meting-js auto='https://y.qq.com/n/yqq/song$1.html'></meting-js>")
.replace(QQVIDEO_REG, "<div class='video-wrapper'><iframe src='//v.qq.com/iframe/player.html?vid=$1' allowFullScreen='true' frameborder='no'></iframe></div>")
.replace(YOUKU_REG, "<div class='video-wrapper'><iframe src='https://player.youku.com/embed/$1' frameborder=0 'allowfullscreen'></iframe></div>")
.replace(YOUTUBE_REG, "<div class='video-wrapper'><iframe src='https://www.youtube.com/embed/$1' title='YouTube video player' frameborder='0' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture' allowfullscreen title='YouTube Video'></iframe></div>")
var IMG_ARR = data[i].content.match(IMG_REG) || '',IMG_ARR_Grid='';
if(IMG_ARR){
var IMG_ARR_Length = IMG_ARR.length,IMG_ARR_Url = '';
if(IMG_ARR_Length !== 1){var IMG_ARR_Grid = " grid grid-"+IMG_ARR_Length}
IMG_ARR.forEach(item => {
let imgSrc = item.replace(/!\[.*?\]\((.*?)\)/g,'$1')
IMG_ARR_Url += '<figure class="gallery-thumbnail"><img class="img thumbnail-image" loading="lazy" decoding="async" src="'+imgSrc+'"/></figure>'
});
bbContREG += '<div class="resimg'+IMG_ARR_Grid+'">'+IMG_ARR_Url+'</div>';
}
var tagArr = data[i].content.match(TAG_REG);
var bbContTag = '';
if (tagArr) {
bbContTag = String(tagArr[0]).replace(/[#]/g, '');
} else {
bbContTag = '动态';
};
if(data[i].resourceList && data[i].resourceList.length > 0){
var resourceList = data[i].resourceList;
var imgUrl='',resUrl='',resImgLength = 0;
for(var j=0;j < resourceList.length;j++){
var restype = resourceList[j].type.slice(0,5);
var resexlink = resourceList[j].externalLink
var resLink = '',fileId=''
if(resexlink){
resLink = resexlink
}else{
fileId = resourceList[j].publicId || resourceList[j].filename
resLink = memos+'o/r/'+resourceList[j].id+'/'+fileId
}
if(restype == 'image'){
imgUrl += '<figure class="gallery-thumbnail"><img class="img thumbnail-image" src="'+resLink+'"/></figure>'
resImgLength = resImgLength + 1
}
if(restype !== 'image'){
resUrl += '<a target="_blank" rel="noreferrer" href="'+resLink+'">'+resourceList[j].filename+'</a>'
}
}
if(imgUrl){
var resImgGrid = ""
if(resImgLength !== 1){var resImgGrid = " grid grid-"+resImgLength}
bbContREG += '<div class="resimg'+resImgGrid+'">'+imgUrl+'</div>'
}
if(resUrl){
bbContREG += '<div class="resour">'+resUrl+'</div>'
}
}
var EnvNow = ''
if(twiEnv && twiEnv != "undefined"){
EnvNow = twiEnv.replace(/https\:\/\/.*\.(.*)\..*/,'$1')
}
if(artEnv && artEnv != "undefined"){
EnvNow = artEnv.replace(/https\:\/\/.*\.(.*)\..*/,'$1')
}
result += '<li class="'+EnvNow+'memo-'+memoId+'"><div class="bbs-avatar"><a href="'+data[i].home+'" target="_blank" rel="noopener noreferrer"><img src="'+data[i].imgsrc+'" alt=""></a><a href="'+memoUrl+'" target="_blank" rel="noopener noreferrer" class="bbs-creator">'+data[i].creator+'</a><span class="bbs-dot">·</span><span class="bbs-date">'+new Date(data[i].updatedTs * 1000).toLocaleString()+'</span>'
var comSVG = '<span class="bbs-coment-svg"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="20" height="24"><path d="M816 808H672c-4.8 0-8 1.6-11.2 4.8l-80 80c-36.8 36.8-97.6 36.8-136 0l-80-80c-3.2-3.2-6.4-4.8-11.2-4.8h-144c-70.4 0-128-57.6-128-128V232c0-70.4 57.6-128 128-128h608c70.4 0 128 57.6 128 128v448C944 750.4 886.4 808 816 808zm0-64c35.2 0 64-28.8 64-64V232c0-35.2-28.8-64-64-64H208c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h144c20.8 0 41.6 8 56 24l80 80c12.8 12.8 32 12.8 44.8 0l80-80c14.4-14.4 35.2-24 56-24H816zM320 408c27.2 0 48 20.8 48 48v32c0 27.2-20.8 48-48 48s-48-20.8-48-48v-32c0-27.2 20.8-48 48-48zm192 0c27.2 0 48 20.8 48 48v32c0 27.2-20.8 48-48 48s-48-20.8-48-48v-32c0-27.2 20.8-48 48-48zm192 0c27.2 0 48 20.8 48 48v32c0 27.2-20.8 48-48 48s-48-20.8-48-48v-32c0-27.2 20.8-48 48-48z" /></svg></span>'
var outSVG = '<span class="bbs-coment-svg"><svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><path d="M864 640a32 32 0 0 1 64 0v224.096A63.936 63.936 0 0 1 864.096 928H159.904A63.936 63.936 0 0 1 96 864.096V159.904C96 124.608 124.64 96 159.904 96H384a32 32 0 0 1 0 64H192.064A31.904 31.904 0 0 0 160 192.064v639.872A31.904 31.904 0 0 0 192.064 864h639.872A31.904 31.904 0 0 0 864 831.936V640zm-485.184 52.48a31.84 31.84 0 0 1-45.12-.128 31.808 31.808 0 0 1-.128-45.12L815.04 166.048l-176.128.736a31.392 31.392 0 0 1-31.584-31.744 32.32 32.32 0 0 1 31.84-32l255.232-1.056a31.36 31.36 0 0 1 31.584 31.584L924.928 388.8a32.32 32.32 0 0 1-32 31.84 31.392 31.392 0 0 1-31.712-31.584l.736-179.392L378.816 692.48z"/></svg></span>'
if(comment == '1'){
if(twiEnv && twiEnv != 'undefined'){
result += '<a data-id="'+memoId+'" data-twienv="'+twiEnv+'" data-path="'+memoUrl+'" onclick="loadTwikoo(this)" onmouseenter="insertTwikoo(this)" href="javascript:void(0)" rel="noopener noreferrer">'+comSVG+'</a></div><div class="bbs-content"><div class="bbs-text">'+bbContREG+'</div><div class="item-comment twikoo-'+memoId+' d-none"><div id="'+EnvNow+'twikoo-'+memoId+'"></div></div></div></li>'
}else if(artEnv && artEnv != 'undefined'){
result += '<a data-id="'+memoId+'" data-artenv="'+artEnv+'" data-artsite="'+artSite+'" data-path="'+memoUrl+'" onclick="loadArtalk(this)" href="javascript:void(0)" rel="noopener noreferrer">'+comSVG+'</a></div><div class="bbs-content"><div class="bbs-text">'+bbContREG+'</div><div class="item-comment '+EnvNow+'artalk-'+memoId+' d-none"></div></div></li>'
}else{
result += '<a href="'+memoUrl+'" target="_blank" rel="noopener noreferrer">'+outSVG+'</a></div><div class="bbs-content"><div class="bbs-text">'+bbContREG+'</div></div></li>'
}
}else{
result += '</div><div class="bbs-content"><div class="bbs-text">'+bbContREG+'</div></div></li>'
}
}
var bbBefore = "<section class='bbs-timeline'><ul class='list'>"
var bbAfter = "</ul></section>"
resultAll = bbBefore + result + bbAfter
bbDom.insertAdjacentHTML('beforeend', resultAll);
var btn = document.querySelector('button.button-load')
if(btn){
btn.textContent= '加载更多';
}
window.ViewImage && ViewImage.init('.bbs-content img')
window.Lately && Lately.init({ target: '.bbs-date' });
}
</script>

注意:如需增加站点,可增加 const urls 字段,注意格式。

样式代码

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<style>
#bbs{padding: 2rem 0;}
#bbs-urls{margin-top: 2rem;}
.bbs-urls{display:inline-block;background: #4a4b50;border-radius:10%;margin:0 .6rem 0 0;padding:4px;width:3.4rem;height:3.4rem;cursor: pointer;vertical-align: text-bottom;}
.bbs-urls img{border-radius:50%;width:100%;height:100%;}
.bbs-urls.url-now{background:#42b983;transition: 0.6s;}
.urls-button svg.icon{padding:10px;width:100%;height: 100%;}
.bbs-timeline ul {margin:0;padding: 0;}
.bbs-timeline ul li{list-style-type:none;position:relative;}
.bbs-timeline{max-width:1200px;margin:0 auto;}
.bbs-avatar{position: relative;}
.bbs-avatar img{width:24px;height:24px;border-radius:50%;margin-right:1rem;}
div.bbs-avatar > img {
display: inline-block;
margin: 0 10px 0 0;
}
.bbs-creator,.bbs-date,.bbs-dot{position:relative;top:-5px;}
.bbs-dot{font-weight: 800;margin:0 .5rem;}
.bbs-content {margin-bottom: 3rem;}
.bbs-text,.resour{background: var(--color-block);border-radius: 8px;font-size: 1em;padding:10px 14px;position: relative;}
.resour{font-size: 0.9rem;margin-top: 2px;padding: 5px 14px;}
.bbs-text{overflow:hidden;max-height:90vh;}
.bbs-text blockquote{font-family: KaiTi,STKaiti,STFangsong;margin:0 0 0 1rem;padding:.25rem 2rem;position: relative;border-left:0 none;}
.bbs-text blockquote::before{line-height: 2rem;content: "“";font-family: Georgia, serif;font-size: 28px;font-weight: bold;position: absolute;left: 10px;top:5px;}
.bbs-text p{margin:0;}
.bbs-text pre p{display: inline-block;}
.bbs-text pre p:empty{display: none;}
.tag-span{color: #42b983;}
#load button.load-btn{width:100%;padding:8px 0;background: var(--color-block);}
#bb-footer{letter-spacing:8px;margin:5rem auto 1rem;text-align:center;}
.dark .bbs-text,.dark .resour{background:#4a4b50;}
.dark .bbs-text p{color:#fafafa;}
.loader {position: relative;margin:3rem auto;width: 100px;}
.loader::before {content: '';display: block;padding-top: 100%;}
.circular {animation: rotate 2s linear infinite;height: 100%;transform-origin: center center;width: 100%;position: absolute;top: 0;bottom: 0;left: 0;right: 0;margin: auto;}
.path {stroke-dasharray: 1, 200;stroke-dashoffset: 0;animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;stroke-linecap: round;}
@keyframes rotate {100% {transform: rotate(360deg);}}
@keyframes dash {
0% {stroke-dasharray: 1, 200;stroke-dashoffset: 0;}
50% {stroke-dasharray: 89, 200;stroke-dashoffset: -35px;}
100% {stroke-dasharray: 89, 200;stroke-dashoffset: -124px;}
}
@keyframes color {
100%,0% {stroke: #d62d20;}40% {stroke: #0057e7;}66% {stroke: #008744;}80%,90% {stroke: #ffa700;}
}
.bbs-content p > img{cursor:pointer;border:1px solid #3b3d42;}
.bbs-content p:has(img.img){display: inline-block;}
.bbs-text p > img {display: block;}
.bbs-text p > img:first-child:nth-last-child(n+2),.bbs-text p > img:first-child:nth-last-child(n+2) ~ img {display: inline-block;}
.bbs-content p > img.square{height:180px;width:180px;object-fit:cover;}
.resimg.grid{
display: grid;
grid-template-columns: repeat(3,1fr);
grid-template-rows:auto;
gap: 4px;
width: calc(100%* 2 / 3);
box-sizing: border-box;
margin: 4px 0 0;
}
.resimg.grid-2{
grid-template-columns: repeat(2, 1fr);
width: 80%;
}
.resimg.grid-4{
grid-template-columns: repeat(2, 1fr);
width: calc(80% * 2 / 3);
}
.resimg.grid figure.gallery-thumbnail {
position: relative;
width: 100%;
height: 0;
padding-top: 100%;
cursor: zoom-in;
}
.resimg figure{
text-align: left;
max-height:50%;
}
.resimg figure img{
max-height:50vh;
}
.resimg.grid figure, figcaption {
margin: 0 !important;
}
.resimg.grid figure.gallery-thumbnail > img.thumbnail-image {
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
object-fit: cover;
object-position: 50% 50%;
}
.video-wrapper{position:relative;padding-bottom:55%;width:100%;height:0}
.video-wrapper iframe{position:absolute;height:100%;width:100%;}
</style>

注意:上面的样式杜老师做了微调,效果可见本站说说广场,如不满意也可自行调整。

展示代码

1
2
3
4
<div id="bbs"></div>
<script type="text/javascript" src="https://jsd.onmicrosoft.cn/npm/marked@4.3.0/marked.min.js"></script>
<script type="text/javascript" src="https://jsd.onmicrosoft.cn/gh/Tokinx/ViewImage/view-image.min.js"></script>
<script type="text/javascript" src="https://jsd.onmicrosoft.cn/gh/Tokinx/Lately/lately.min.js"></script>

注意:根据自身需求修改对应代码,如有任何问题,可随时在评论区中留言!

如何删除 GitHub 的提交历史记录

2022年9月17日 00:00

有时候不经意把一些敏感的信息写到了代码里,并提交到 GitHub 上,代码公开时被人发现是很危险的事情,这时候就需要将之前的提交记录进行删除。

需求背景

细心的小伙伴会发现本博最后活动时间永远在 24 小时内,因为杜老师经常会调整博客,包括配置、内容等等。频繁更新消耗了大量 GitHub Actions 部署配额,后经香猪提示,将库公开则不会再消耗部署配额:

公开库的第一时间,就受到了凉心云的警告信息,其在之前的提交中扫描到高权限密钥。为了避免数据泄露,杜老师需要删除 GitHub 提交历史记录:

操作指令

1
2
3
4
5
6
git checkout --orphan master # 在非新存储库上以类似 git init 的状态创建分支
git add -A # 提交所有文件到数据暂存区
git commit -m a # 提交修改
git branch -D main # 删除分支
git branch -m main # 将当前分支重命名
git push -f origin main # 强制提交当前分支

注意:数据宝贵,删除前需做好备份!

Go 语言实现 2048 游戏

2021年5月13日 00:00

相信大家都玩过 2048 这个游戏,这次我们将使用 Go 语言及调用相关包来完成一个简易版的 2048 游戏,快来一同尝试下吧!

执行代码

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
package main

import (
"fmt"
"github.com/shiyanlou/termbox-go"
"math/rand"
"time"
)

var Score int
var step int

func coverPrintStr(x, y int, str string, fg, bg termbox.Attribute) error {

xx := x
for n, c := range str {
if c == '\n' {
y++
xx = x - n - 1
}
termbox.SetCell(xx+n, y, c, fg, bg)
}
termbox.Flush()
return nil
}

type Status uint

const (
Win Status = iota
Lose
Add
Max = 2048
)

type G2048 [4][4]int

func (t *G2048) checkWinOrAdd() Status {
for _, x := range t {
for _, y := range x {
if y >= Max {
return Win
}
}
}
i := rand.Intn(len(t))
j := rand.Intn(len(t))
for x := 0; x < len(t); x++ {
for y := 0; y < len(t); y++ {
if t[i%len(t)][j%len(t)] == 0 {
t[i%len(t)][j%len(t)] = 2 << (rand.Uint32() % 2)
return Add
}
j++
}
i++
}

return Lose
}

func (t G2048) initialize(ox, oy int) error {
fg := termbox.ColorYellow
bg := termbox.ColorBlack
termbox.Clear(fg, bg)
str := " SCORE: " + fmt.Sprint(Score)
for n, c := range str {
termbox.SetCell(ox+n, oy-1, c, fg, bg)
}
str = "ESC:exit " + "Enter:replay"
for n, c := range str {
termbox.SetCell(ox+n, oy-2, c, fg, bg)
}
str = " PLAY with ARROW KEY"
for n, c := range str {
termbox.SetCell(ox+n, oy-3, c, fg, bg)
}
fg = termbox.ColorBlack
bg = termbox.ColorGreen
for i := 0; i <= len(t); i++ {
for x := 0; x < 5*len(t); x++ {
termbox.SetCell(ox+x, oy+i*2, '-', fg, bg)
}
for x := 0; x <= 2*len(t); x++ {
if x%2 == 0 {
termbox.SetCell(ox+i*5, oy+x, '+', fg, bg)
} else {
termbox.SetCell(ox+i*5, oy+x, '|', fg, bg)
}
}
}
fg = termbox.ColorYellow
bg = termbox.ColorBlack
for i := range t {
for j := range t[i] {
if t[i][j] > 0 {
str := fmt.Sprint(t[i][j])
for n, char := range str {
termbox.SetCell(ox+j*5+1+n, oy+i*2+1, char, fg, bg)
}
}
}
}
return termbox.Flush()
}

func (t *G2048) mirrorV() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[len(t)-i-1][j] = num
}
}
*t = *tn
}

func (t *G2048) right90() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[j][len(t)-i-1] = num
}
}
*t = *tn
}

func (t *G2048) left90() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-j-1][i] = num
}
}
*t = *tn
}

func (t *G2048) right180() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-i-1][len(line)-j-1] = num
}
}
*t = *tn
}

func (t *G2048) mergeUp() bool {
tl := len(t)
changed := false
notfull := false
for i := 0; i < tl; i++ {

np := tl
n := 0

for x := 0; x < np; x++ {
if t[x][i] != 0 {
t[n][i] = t[x][i]
if n != x {
changed = true
}
n++
}
}
if n < tl {
notfull = true
}
np = n
for x := 0; x < np-1; x++ {
if t[x][i] == t[x+1][i] {
t[x][i] *= 2
t[x+1][i] = 0
Score += t[x][i] * step
x++
changed = true
}
}
n = 0
for x := 0; x < np; x++ {
if t[x][i] != 0 {
t[n][i] = t[x][i]
n++
}
}
for x := n; x < tl; x++ {
t[x][i] = 0
}
}
return changed || !notfull
}

func (t *G2048) mergeDwon() bool {
//t.mirrorV()
t.right180()
changed := t.mergeUp()
//t.mirrorV()
t.right180()
return changed
}

func (t *G2048) mergeLeft() bool {
t.right90()
changed := t.mergeUp()
t.left90()
return changed
}

func (t *G2048) mergeRight() bool {
t.left90()
changed := t.mergeUp()
t.right90()
return changed
}

func (t *G2048) mrgeAndReturnKey() termbox.Key {
var changed bool
Lable:
changed = false
//ev := termbox.PollEvent()
event_queue := make(chan termbox.Event)
go func() {
for {
event_queue <- termbox.PollEvent()
}
}()

ev := <-event_queue

switch ev.Type {
case termbox.EventKey:
switch ev.Key {
case termbox.KeyArrowUp:
changed = t.mergeUp()
case termbox.KeyArrowDown:
changed = t.mergeDwon()
case termbox.KeyArrowLeft:
changed = t.mergeLeft()
case termbox.KeyArrowRight:
changed = t.mergeRight()
case termbox.KeyEsc, termbox.KeyEnter:
changed = true
default:
changed = false
}

if !changed {
goto Lable
}

case termbox.EventResize:
x, y := termbox.Size()
t.initialize(x/2-10, y/2-4)
goto Lable
case termbox.EventError:
panic(ev.Err)
}
step++
return ev.Key
}

func (b *G2048) clear() {
next := new(G2048)
Score = 0
step = 0
*b = *next

}

func (b *G2048) Run() {
err := termbox.Init()
if err != nil {
panic(err)
}
defer termbox.Close()

rand.Seed(time.Now().UnixNano())

A:

b.clear()
for {
st := b.checkWinOrAdd()
x, y := termbox.Size()
b.initialize(x/2-10, y/2-4)
switch st {
case Win:
str := "Win!!"
strl := len(str)
coverPrintStr(x/2-strl/2, y/2, str, termbox.ColorMagenta, termbox.ColorYellow)
case Lose:
str := "Lose!!"
strl := len(str)
coverPrintStr(x/2-strl/2, y/2, str, termbox.ColorBlack, termbox.ColorRed)
case Add:
default:
fmt.Print("Err")
}
key := b.mrgeAndReturnKey()
if key == termbox.KeyEsc {
return
}
if key == termbox.KeyEnter {
goto A
}
}
}

func main() {
var game G2048
game.Run()
}

注意:创建源文件 2048.go,输入以上内容。

执行效果

运行代码 go run 2048.go 可启动游戏:

Go 语言实现 2048 游戏「中篇」

2021年5月10日 00:00

矩阵旋转操作是为了将其它三个方向的移动都转换为向上的移动操作。向下、向左、向右转换为向上操作时,数组需要进行翻转操作参考正文代码。

执行代码

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main

import "fmt"

type g2048 [4][4]int

func (t *g2048) MirrorV() {
tn := new(g2048)
for i, line := range t {
for j, num := range line {
tn[len(t)-i-1][j] = num
}
}
*t = *tn
}

func (t *g2048) Right90() {
tn := new(g2048)
for i, line := range t {
for j, num := range line {
tn[j][len(t)-i-1] = num
}
}
*t = *tn
}

func (t *g2048) Left90() {
tn := new(g2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-j-1][i] = num
}
}
*t = *tn
}

func (g *g2048) R90() {
tn := new(g2048)
for x, line := range g {
for y, _ := range line {
tn[x][y] = g[len(line)-1-y][x]
}
}
*g = *tn

}

func (t *g2048) Right180() {
tn := new(g2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-i-1][len(line)-j-1] = num
}
}
*t = *tn
}

func (t *g2048) Print() {
for _, line := range t {
for _, number := range line {
fmt.Printf("%2d ", number)
}
fmt.Println()
}
fmt.Println()
tn := g2048{{1, 2, 3, 4}, {5, 8}, {9, 10, 11}, {13, 14, 16}}
*t = tn

}

func main() {
fmt.Println("origin")
t := g2048{{1, 2, 3, 4}, {5, 8}, {9, 10, 11}, {13, 14, 16}}
t.Print()
fmt.Println("mirror")
t.MirrorV()
t.Print()
fmt.Println("Left90")
t.Left90()
t.Print()
fmt.Println("Right90")
t.R90()
t.Print()
fmt.Println("Right180")
t.Right180()
t.Print()
}

注意:创建源文件 martix_rorate.go,输入以上代码。

执行结果

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
origin
1 2 3 4
5 8 0 0
9 10 11 0
13 14 16 0

mirror
13 14 16 0
9 10 11 0
5 8 0 0
1 2 3 4

Left90
4 0 0 0
3 0 11 16
2 8 10 14
1 5 9 13

Right90
13 9 5 1
14 10 8 2
16 11 0 3
0 0 0 4

Right180
0 16 14 13
0 11 10 9
0 0 8 5
4 3 2 1

注意:执行 go run martix_rorate.go 后,输出如上。

使用 Termbox 绘制数据流

2021年5月7日 00:00

Termbox 提供一个最小化的 API,允许程序员编写基于文本的用户界面。在 Linux 操作系统有基于终端的实现,基本思想是对所有主要终端和其他类似终端的 API 上的最大的通用功能子集进行抽象,以最小的方式进行。小的 API 意味着它很容易实现、测试、维护、学习。

重要函数

下面我们简单介绍下比较重要的函数:

函数介绍
termbox.Size()获取 Console 的尺寸
termbox.SetCell(x, y, ch, fg, bg)用于设置字符单元属性,其中 x 表示所在行,y 表示所在列,ch 是要设置的字符,fg 和 bg 分布表示前景色和背景色
termbox.Flush()同步后台缓存。Flush 方法一般用于将后台的处理输出到界面中。如重新绘制一个界面
termbox.Init()在使用 Termbox 进行程序开发时候,我们需要先使用 termbox.Init 方法来初始化
termbox.Close()当不再使用 Termbox 任何功能时候,使用 termbox.Close 来关闭对 termbox 引入
termbox.PollEvent()用于等待键盘事件的触发并返回事件,无事件发生时则会无限等待

绘制代码

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
package main

import "github.com/nsf/termbox-go"
import "math/rand"
import "time"

func draw() {
w, h := termbox.Size()
termbox.Clear(termbox.ColorDefault, termbox.ColorDefault)
for y := 0; y < h; y++ {
for x := 0; x < w; x++ {
termbox.SetCell(x, y, ' ', termbox.ColorDefault,
termbox.Attribute(rand.Int()%8)+1)
}
}
termbox.Flush()
}

func main() {
err := termbox.Init()
if err != nil {
panic(err)
}
defer termbox.Close()

event_queue := make(chan termbox.Event)
go func() {
for {
event_queue <- termbox.PollEvent()
}
}()

draw()
for {
select {
case ev := <-event_queue:
if ev.Type == termbox.EventKey && ev.Key == termbox.KeyEsc {
return
}
default:
draw()
time.Sleep(10 * time.Millisecond)
}
}
}

注意:创建源文件 random_output.go,输入以上代码。

执行代码

1
go run random_output.go

注意:执行以上代码,就可以在终端中看到五彩缤纷的数据流啦,如果想退出程序需按下ESC键。

运行效果

效果如下:

如何用 Python 表白

2020年3月19日 00:00

快到情人节了,作为技术宅男,杜老师教大家如何通过 Python 给女神表白。其实 Python 可以做很多事情,通过其强大的库能实现各种效果,今天杜老师准备了一段很简单的代码,感兴趣的小伙伴可以试一下!

表白代码

1
2
3
4
5
import time
words = input('Please input the words you want to say!:')
for item in words.split():
print('\n'.join([''.join([(item[(x-y) % len(item)] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(12, -12, -1)]))
time.sleep(1.5);

注意:不需要安装任何库;仅支持英文字母的输入;单词间需要加空格;单词越多,持续效果越久!

运行效果

点击播放效果:

asciicast

新版本 Memos 说说页面部署代码分享

2024年10月21日 00:00

在柚子兄的帮助下,杜老师终于完成了 Memos 的版本升级。Memos 是真的糟糕,动不动 BREAKING CHANGE,前后对 API/S3 做了大量改动,严重影响了日常的使用,强烈建议在不影响使用的情况下升级版本。

特性

  1. 显示用户头像;

  2. 显示用户昵称与平台用户名;

  3. 支持大图显示;

  4. 可一键至说说广场进行评论。

效果

正常的浏览效果如下图:

夜间模式的浏览效果如下图:

代码

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
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/style.css" rel="stylesheet" type="text/css">
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/highlight.github.min.css" rel="stylesheet" type="text/css">
{% p center logo large, 点图片可放大! %}
<section id="main" class="container">
<div id="memos" class="memos">
</div>
</section>
<script type="text/javascript">
var memos = {
host: 'https://s.dusays.com/',
limit: '10',
creatorId: '1',
domId: '#memos',
username: 'penn',
name: 'Teacher Du',
}
</script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/lazyload.min.js?v=17.8.3"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/marked.min.js?v=11.1.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/view-image.min.js?v=2.0.2"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.min.js?v=2.30.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.twitter.js"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/highlight.min.js?v=11.9.0"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.2.0/memos/js/memo.js"></script>
<script>hljs.highlightAll();</script>

注意:如果不是 Volantis 主题需删除{% p center logo large, 点图片可放大! %}所在行。

使用

请根据需求修改对应的内容:

参数说明
host域名
limit每页显示条数
creatorId用户的 ID
domId显示位置
username广场的用户名
name昵称

Puock主题修改备忘录

2024年10月16日 16:05

作为一个写博十余年的老博主,实在是没有精力折腾各种新东西。但近期博客程序被入侵事件让我不得不换掉了使用很久的Flat主题。

本来想在后台随便找个官方推荐的主题凑合用,但那些主题基本上都是歪果人设计的,对中文排版支持不太友好,所以又重新找了款国人开发的主题,也就是本站正在用的——Puock主题

这款主题美观大方,功能强大,一次性解决了我很多痛点。可以说是立即部署、立即使用。

但使用了几天后,还是发现有需要调整的地方。现在记录一下,免得后面忘记了。

一、评论者URL跳转问题

主题模板设计的功能是:评论者如果留了URL的,则进行base64加密,然后通过一个中转页面进行二次确认,再进行跳转。

我对这个功能的态度是:完全不需要。

博友互访留下URL,并且清晰地展示在前台,我认为是非常重要的,加密再跳转极其影响用户体验。对于那些发广告的评论,我是一律删除就完事了,所以并没有这个需求。关键是,经过测试,部分URL加密后无法正常跳转,而是会跳到我博客首页,这完全让人摸不着头脑。

由于本人对代码几乎一窍不通,看了半天也没找到哪里能关掉这个功能。

开始把go.php里的代码丢给“文心一言”去分析,并根据AI指引修改里面的代码,试图取消加密,直接调转,但无果。

之后采取笨方法,直接用全文搜索,搜出了包含“go.php”这个关键词的页面opt.php,路径位于:

主题模板文件夹下的 /inc/fun/opt.php

相关代码为:

//跳转链接

function pk_go_link($url, $name = &#8221;)

{if (pk_is_cur_site($url)) {

return $url;

}$url = PUOCK_ABS_URI . &#8216;/inc/go.php?to=&#8217; . base64_encode($url);

if (!empty($name)) {

$url .= &#8216;&amp;name=&#8217; . base64_encode($name);

}return $url;

}

这段代码丢给AI,让他改为不加密,但AI弄了半天,不成功。

我看了下代码,还是采用最笨的方法,将$url =后面的内容改为了$url,也就是左右相等,替换后如下:

//跳转链接

function pk_go_link($url, $name = &#8221;)

{if (pk_is_cur_site($url)) {

return $url;

}$url = $url;

if (!empty($name)) {

$url .= &#8216;&amp;name=&#8217; . base64_encode($name);

}return $url;

}

再次刷新运行,完美解决。

二、屏蔽键盘左右键翻页功能

这个问题是博友S发现的。

在单篇文章页面,使用键盘左右键可以实现上一篇、下一篇的快速切换。

看起来很美好,但这里有个“致命”BUG,当浏览者在评论框里输入文字时,不小心使用了键盘左右键来调整内容,此时页面会马上切换到上一篇或下一篇,直接导致整个评论表单输入的内容全部丢失。

当我打算去官方开发者博客留言反馈这个问题时,结果光是写那条留言就反复写了五六次——官方竟然复刻了这个问题,也就是说跟我博客运行环境是没有关系的。

在等待官方修复这个BUG之前,我尝试自救。

跟文心一言沟通多次,并没有给出有效的解决办法。

无奈之下,找到了chatgpt,让他给我写一个屏蔽键盘左右键的插件,修改一次后,解决问题。

现在,我的博客将暂时屏蔽键盘左右键,按下时会弹出对话框,虽然也有一定影响,但总比吞掉辛辛苦苦敲下的文字强吧。

10.18更新:

在GitHub提交issue后,网友hausen1012回复说遇到同样问题,并给出了相关的代码。

经测试,删除主题模板下/assets/dist/js路径中puock.min.js文件以下代码即可取消左右键翻页功能:


{
key: "keyUpHandle",
value: function() {
var a = $(".single-next-or-pre");
a && (window.onkeyup = function(t) {
var e = null;
switch (t.key) {
case "ArrowLeft":
e = a.find("a[rel='prev']").attr("href");
break;
case "ArrowRight":
e = a.find("a[rel='next']").attr("href")
}
e && (window.location = e)
}
)
}
}

10.22更新:

感谢博友老何提醒,由于直接删除上述代码,会导致评论回复功能不可用(我猜是keyUpHandle这个功能还关联了其他事件)

忍不住又折腾了一下,经过chatgpt的分析,把上述代码修改为下面的代码:


{
key: "keyUpHandle",
value: function() {
var a = $(".single-next-or-pre");
var commentBox = $("#comment"); // 获取评论框

// 定义事件处理函数
var handleKeyUp = function(t) {
var e = null;
switch (t.key) {
case “ArrowLeft”:
e = a.find(“a[rel=’prev’]”).attr(“href”);
break;
case “ArrowRight”:
e = a.find(“a[rel=’next’]”).attr(“href”);
}
e && (window.location = e);
};

// 绑定事件
if (a.length) {
window.addEventListener(“keyup”, handleKeyUp);
}

// 解绑事件的函数
this.unbindKeyUp = function() {
window.removeEventListener(“keyup”, handleKeyUp);
};

// 监测评论框的焦点事件
commentBox.on(“focus”, () => {
this.unbindKeyUp(); // 当焦点在评论框上时,解绑键盘事件
});

// 可选:在评论框失去焦点时重新绑定事件
commentBox.on(“blur”, () => {
if (a.length) {
window.addEventListener(“keyup”, handleKeyUp); // 重新绑定事件
}
});
}
}

希望不会再衍生出新的BUG。

迭代幂运算/重幂的介绍与其Python代码实现

2024年10月16日 05:29

数学中的迭代幂运算/重幂是什么?

迭代幂运算(重幂)是数学中的一种运算,涉及到反复进行幂次运算。它是超运算序列的一部分,该序列延伸了加法、乘法和幂运算。在迭代幂运算中,一个数自乘多次,直到达到指定的次数。

一个数a迭代幂的高度n通常表示为:tex_7f275feba9caa33491cc739d97613e41 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,也就是把n写在a的左上角,(也可以记作:a↑↑n)这表示a被迭代n次。

例如:

  • tex_809d19495ee2ad967edb956694773d96 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (简单恒等式)
  • tex_b2971689df7256a7c315e159e8dceca6 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (a自乘一次)
  • tex_185fcc3b7fe6daf47068d87ffd22f670 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (a的幂次为a自乘)
  • tex_a932b7bb96225dc665bbe571f816002a 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,依此类推。

在迭代幂运算的上下文中,tex_b3ef97b6eba2428ee919c02c89d2c9ea 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 通常未定义或没有普遍共识。然而,一些数学惯例建议对于任何 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 tex_2f1f5ed0eeff6d95cf9b145624dfb6af 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,类似于在幂运算中对任何非零的 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 tex_5c135adeedf02dca7953a9719fb38fa2 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的情况。

迭代幂运算示例

让我们评估 tex_a5f6729c6edbc3df5dae3c81efe128b2 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (读作“2迭代到高度3”):

tex_c3974a6b51c4029486462ba28d7f5c17 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
tex_38f3272f3cc8a02e84ceed576663756c 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
因此 tex_a79a23ebbcc28f19e40a7b5604f3e748 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机

迭代幂/重幂运算的通用性质

  • 非交换性:迭代幂运算不是交换的,这意味着 tex_2bb7d37b96ba358da2a2c8024d02fe57 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
  • 增长速度非常快:迭代幂运算增长非常快。即使是小数也会因为幂运算的快速增长而导致非常大的结果。

迭代幂运算/重幂在基础数学中较少见,但在某些高级数学领域中发挥作用,特别是在涉及极大数的领域,如大数理论和计算机科学中。

用 Python 计算迭代幂运算

以下是两个计算迭代幂运算的Python函数。第一个使用递归,第二个使用迭代。

在两个函数中,我们在开始时添加了对 n = 0 的检查。如果 n 为 0,则函数返回 1,否则继续处理。这种方式使函数能够按照任意数的迭代幂高为0时为1的惯例处理 n=0 的情况。

递归函数计算迭代幂

递归函数:此函数将自己调用,n 的高度递减1,直到达到1,此时返回基数a。这就实现了从上到下构建指数链的效果。

@lru.cache(None)  ## 缓存函数
def tetration_recursive(a, n):
    if n == 0:
        return 1
    if n == 1:
        return a
    return a ** tetration_recursive(a, n - 1)

递归计算迭代幂的函数理论上可以进行尾优化。在尾递归中,递归调用是函数中的最后一个操作,这样某些编译器或解释器可以通过重用相同的堆栈帧来优化调用堆栈的使用。这可以通过消除每个递归调用的额外堆栈帧需求来将空间复杂度降到 O(1)。

然而,当前的递归实现并不是尾递归的,因为递归调用嵌套在一个幂运算中:

return a ** tetration_recursive(a, n - 1)

这里,幂运算依赖于递归调用的结果,所以在完成当前调用之前必须计算出结果,从而阻止了尾递归优化。

迭代函数计算迭代幂

迭代函数:此函数使用 for 循环遍历高度 n,通过在每次迭代中更新幂运算的结果,来从下至上计算结果。

def tetration_iterative(a, n):
    if n == 0:
        return 1
    result = a
    for _ in range(1, n):
        result = a ** result
    return result

迭代幂算法的时间/空间复杂度

Python函数计算迭代幂的时间和空间复杂度取决于其递归或迭代实现。让我们分析两种实现。

递归函数的复杂度

时间复杂度:

  • 每次递归调用都会与之前的调用结果进行一次幂运算。
  • 总共有n-1次递归调用,所以该函数被调用了O(n)次。
  • 然而,像 tex_ad68cb15ab4e6c9d3aa23d421625d67a 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的幂运算需要 tex_e6c0128be5c7d7501ff5a45664d688da 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的时间。
  • 因此,对于较大的 n 值,由于幂次的增长,其时间复杂度会呈指数增长。
  • 这导致总的时间复杂度大约为 tex_61a94ff4b35f50421447e762bcc2b21e 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,有n层,这意味着增长速度非常快

空间复杂度:

  • 由于这是一个递归函数,每次调用都需要堆栈空间。
  • 递归的最大深度为 n,所以空间复杂度为 O(n)。
迭代函数的复杂度

时间复杂度:

  • 与递归版本一样,该函数迭代 n – 1 次
  • 每次迭代涉及计算 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的幂次,这个结果会呈指数增长。
  • 因此,时间复杂度也成为 tex_61a94ff4b35f50421447e762bcc2b21e 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,有n层,因为每一步都是指数级增长。

空间复杂度:

  • 此迭代版本仅需要少量额外空间用于 result 变量等,因此它的额外空间复杂度为 O(1)。
  • 然而,结果本身可能会变得非常大,如果 a 和 n 很大,可能需要大量内存来存储。

由于反复幂次的快速增长,这两种实现的时间复杂度都非常高,对于较大的值变得不可行。递归版本由于调用堆栈的使用空间复杂度为 O(n),而迭代版本的辅助空间复杂度为 O(1),但仍然需要处理极大数,这可能会间接影响内存使用。

英文:Tetration Operator in Math Simply Explained with Python Algorithms

本文一共 1253 个汉字, 你数一下对不对.
迭代幂运算/重幂的介绍与其Python代码实现. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
The post 迭代幂运算/重幂的介绍与其Python代码实现 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  4. 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...
  5. 拔牙后的注意事项(图, 慎入) Care of Mouth after Extraction 昨天又拔了两颗牙, 初步定在5月4号装牙套. 这是牙医诊所给的术后注意事项: 拔完后需要等3-4小时麻醉失效后才能吃喝. 稍微流点血是很正常的. 但是请不要漱口吐出, 因为这会加速流血. 你只要轻轻的含着口水并咽下即可. 如果一直流血, 请拿着纱布(并不是纸巾)放在拔牙处20分钟. 24小时内请不要运动, 术后几小时内回家静静坐着. 12小时内不要吸烟, 喝酒或者喝热饮, 因为这会让伤口流血....
  6. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  7. ChatGPT-4 使用 Math Wolfram 插件解决数学脑筋急转弯问题 这篇文章, 我们看一个简单的数学问题(脑筋急转弯), 并用 Python 解决它. 我们看一下LLM(大型语言模型): ChatGPT3.5和ChatGPT4. 通过 ChatGPT-Plus 订阅(目前每月 20 美元 + VAT增值税), 我们可以启用...
  8. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....

WordPress & Typecho 极简主题 Dear v1.1.0

2024年9月22日 21:11

周末对 Dear 主题 WordPress & Typecho 版本都进行了小更新。主要增加独立的“搜索模板”,并对行距、次要字体等地方进行了小优化。

Dear 主题首页设置页面 id 后,会引用该页面的所有内容和样式,同学们可以对该页面尽情发挥想象力,以满足个性化需求。比如展示订阅地址、社交网站地址等等,也可以贴个封面图作为首页 Banner 等。如下图 Follow Me:WordPress & Typecho 极简主题 Dear v1.1.0-雅余

本次版本主要更新内容:

- 增加独立“搜索模板”
- CSS 样式移至 style.css 文件
- 首页默认显示8篇文章
- 部分样式优化

新版本请从主题发布页面获取 Github 链接:

WordPress 版本Typecho 版本

WordPress 版本 Text Only 和 Writing 主题错误修复

2024年9月7日 10:53

昨晚更新 Paper 主题的时候发现了一处拷贝错误,把旧主题的代码直接粘贴了,部分 PHP 版本没有提示错误,所以没发现。现已对 WordPress 版本 Text Only 和 Writing两个主题发新版本修复,可针对性更新。主要是 archives.php 和 search.php 两个模板文件。

详细可查看主题发布页:Text Only (WordPress)Writing (WordPress)

WordPress & Typecho 极简主题 Paper v1.1.0

2024年9月7日 00:32

Paper 这款纯文本的极简主题得到不少同学的喜爱,应部分同学的要求对主题进行了更新。主要增加独立的“搜索模板”,并对多处负空间进行调整,增加文字呼吸的空间。还修正了”文章归档“模板的一处错误,可针对性更新。

主要更新内容:

- 增加独立“搜索模板”
- 菜单及部分代码调整
- CSS 样式移至 style.css 文件
- 优化多处负空间距离
- 优化评论框样式
- 修复文章归档模板错误

新版本请从主题发布页面获取 Github 链接:

WordPress 版本Typecho 版本

Typecho 纯文本极简主题 Text Only v1.0.0 发布

2024年7月26日 23:58

应朋友们要求,制作了 Typecho 版本的 Text Only 主题,和 WordPress 版本样式上基本保持一致。使用愉快~

主题介绍如下:

Text Only 为纯文本极简主题,黑白配色,对程序极简优化,主题无 JS 和图片文件载入。

主题支持自定义背景、自定义菜单,保留搜索及评论功能;内置文章归档和搜索模板;已作中文字体优化,内置3种字体方案可选。

主题类型:极简 / 博客 / 纯文本 / 单栏 / 自适应 / 免费

提供 WordPress 版本Typecho 版本

主题免费开源,供学习交流,不提供售后支持。如有建议,欢迎评论留言,不喜勿喷。

主题可按授权方式继续随意改造,但望保留我的信息。感谢!

Typecho 纯文本极简主题 Text Only v1.0.0 发布-雅余

Typecho 纯文本极简主题 Text Only v1.0.0 发布-雅余

Typecho 纯文本极简主题 Text Only v1.0.0 发布-雅余

Typecho 纯文本极简主题 Text Only v1.0.0 发布-雅余

Typecho 纯文本极简主题 Text Only v1.0.0 发布-雅余

详细介绍和使用见主题两个版本的发布页面。

WordPress 纯文本极简主题:Text Only
Typecho 纯文本极简主题:Text Only

欢迎提供建议,以便继续完善。

WordPress & Typecho 极简主题 Writing v1.1.0

2024年7月21日 15:10

上个月收到 Github 上面一条 Issue,借周末时间对主题小改动了一下。毕竟不是全职运维,拖拖拉拉一个月才改。

主要更新内容:

- 增加独立“搜索模板”
- CSS 样式移至 style.css 文件
- 部分样式完善

新版本请从主题发布页面获取 Github 链接:

WordPress 版本Typecho 版本

-

小插曲:太不专业了,commit 的时候手一抖,把另外一个主题的文件给替换了,哈哈。

WordPress 纯文本极简主题 Text Only v1.0.0 发布

2024年7月8日 23:18

手痒,又发一款极简主题。这是一款初始化主题,仅提供最基础的页面展示,简洁的样式,简洁的代码,方便后期加工。提供两个页面模板,归档模板和独立搜索页面。较以前主题,对评论区进行了适当的美化。

主题介绍如下:

Text Only 为纯文本极简主题,黑白配色,对程序极简优化,主题无 JS 和图片文件载入。

主题支持自定义背景、自定义菜单,保留搜索及评论功能;内置文章归档和搜索模板;已作中文字体优化,内置3种字体方案可选。力求极简,对程序自带功能进行禁用,若对使用有影响,按需删除即可。

主题类型:极简 / 博客 / 纯文本 / 单栏 / 自适应 / 免费

目前仅提供 WordPress 版本。

主题免费开源,供学习交流,不提供售后支持。既然供学习交流,故也欢迎和我交流。如有建议,欢迎评论留言,不喜勿喷。

主题可按授权方式继续随意改造,但望保留我的信息。感谢!

WordPress 纯文本极简主题 Text Only v1.0.0 发布-雅余

WordPress 纯文本极简主题 Text Only v1.0.0 发布-雅余

WordPress 纯文本极简主题 Text Only v1.0.0 发布-雅余

WordPress 纯文本极简主题 Text Only v1.0.0 发布-雅余

WordPress 纯文本极简主题 Text Only v1.0.0 发布-雅余

详细介绍和使用见主题的发布页面。

WordPress 纯文本极简主题:Text Only

欢迎提供建议,以便继续完善。

❌
❌