普通视图

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

徒手造车小游戏玩法

2025年5月5日 23:27

前言

这个游戏的内核是UGC,鼓励玩家去编辑车型,赛道。创建赛道作为关卡,是分享给其他人进行挑战的。
玩法简单,W/S 键保持车身平衡,空格键加速。
内设的关卡是非常简单的,可以用来练手,真正的挑战是玩家编辑后的关卡,可以设置障碍,掉落陷阱等。

现在此项目是一个Demo,意在演示玩法,也不具有分享功能。

演示视频

编辑器演示,文末提供了素材,可供下载使用

车身编辑

  1. 点击车身或者车轮进入编辑界面,使用滚轮可缩放地图。

  2. 点击工具栏中的drag,可以拖动小车的图像,将图像拖动出画布则视为移除。

  3. 点击工具栏中的image,可以导入外部资源,点击空白处,选择需要导入的图片。
    文末提供了两张可供导入的png,当然也可以是任意png格式的图

  4. 点击Resize调整,导入的图像大小,pixel可以调整图像的像素化程度。
    调整完毕,点击Add添加到画布中,如还需要导入其他的图,重复此步骤。

  5. 车身或者轮胎编辑完成后,点击exit 可返回到主界面。
    返回到主界面可以根据需要,调整轮胎的位置。

地图编辑

  1. 点击主界面任意空白处,可以触发地图编辑,进入地编界面。

  2. 点击image,导入地图笔刷,彩虹笔刷在附件或者文末有图片,或者是任意的png,jpg图像。

  3. 在layer层级面板,可以看到已经存在的三条地形,取消show的勾选可以隐藏当前地形,默认都显示。

  4. 点击Eraser笔刷会变成橡皮擦,可以擦掉任意绘制的图案。

  5. 点击Brush开始绘制地形,需要注意的是 layer 层级一览,选中的是第几张图,绘制的就是第几张。

基础操作

使用WS控制车身平衡,W抬起,S下压

出现车厢道具,按Space键,使用,加速前进

翻车,或者掉落陷阱则判定失败

UGC内容示例素材,你可以使用这两张图进行DIY, 或者任意你喜欢的图都可以。

右键下载图片,注意保存为Png结尾。

试玩地址 https://px.vrast.cn

如游戏更新,需要清理本地缓存参考如下:
这个清理缓存与清理网页缓存不同,unity的web程序会直接使用本地存储。
清理方式如下:

秒哒上手:免服务器纯自然语言编写支持前后端的网页项目,自然语言开发成了吗?

2025年3月25日 10:33
这篇文章介绍了百度发布的一款自然语言编程工具,秒哒。秒哒是一款可快速生成和部署Web应用的工具,支持多页面切换、响应式设计及用户登录。秒哒生成过程较快,但自定义能力有限,主要依赖模板。秒哒的优势在于其简便性和快速部署能力,适合非专业开发者和快速原型设计,但不推荐给专业开发者使用。

米家空调伴侣接入HomeAssistant不显示当前温度的解决方法,解决HomeKit空调始终21度问题

2025年3月21日 10:48
这篇文章介绍了米家空调伴侣在接入HomeAssistant时无法显示当前温度的问题,并提供了解决方法。作者之前通过自定义实体解决了该问题,但由于Xiaomi Miot Auto登录问题转到了Xiaomi Home,导致功能失效。为彻底解决这一问题,作者开发了一个新的Home Assistant自定义集成——洪绘空调,用于创建虚拟空调设备并显示当前温度。文章详细介绍了如何安装和配置该集成,并指导用户将其接入HomeKit以实现正常显示和控制。

特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了

2025年2月23日 21:28

2025年1月,美国总统唐纳德·特朗普第二次入主白宫,上任没多久就兑现了一个竞选承诺:结束俄乌战争。不过,这场停战的达成方式,恐怕让不少人大跌眼镜——谈判桌上只有美国和俄罗斯,乌克兰这个直接当事国没份儿,欧洲那些出了力气的盟友也没捞到一张椅子。结果呢?俄美两国一拍即合,停战协议新鲜出炉:土地归俄罗斯,乌克兰的5000亿矿场开发权打包送给美国,债务甩给欧洲,至于荣耀嘛,留给乌克兰自己慢慢品味。

这协议一公布,乌克兰总统泽连斯基的脸估计比冬天还冷。他对外抱怨说,美国其实只给了670亿美元援助,压根不到之前吹嘘的1500亿。可协议上白纸黑字,5000亿矿场开发权已经划给了美国。他试图争取点什么,比如让乌克兰上桌谈条件,至少要求美国保障乌克兰的安全,再不济也给欧洲分一杯羹——毕竟欧洲这些年没少支援战争。可特朗普的回应简单粗暴:签,或者不签,协议一个字都别想改。泽连斯基还想退一步谈谈,特朗普直接笑他是个“小丑”,说当年演喜剧的水平不错,现在支持率却跌到4%,再不同意就赶紧大选,换个听话的上台。

这事儿说白了就是“弱国无外交”的教科书案例。乌克兰夹在俄美之间,既没实力还牌面,又被盟友卖了个干净。欧洲这边也好不到哪儿去,一盘散沙的他们只能眼睁睁看着美国独吞好处,自己还得背上债务的锅。特朗普上台后更是摆明了态度:拜登那摊子事儿(民主党?左派政策?)他不管,他只关心自己的利益。甚至还放话让乌克兰赶紧还钱,不然“你的国家可能就不存在了”。

这场停战,看似结束了炮火,实则暴露了大国博弈的冷酷逻辑。俄罗斯拿回了土地,美国吃下了资源,欧洲当了冤大头,乌克兰则成了最大的输家。泽连斯基或许还想挣扎,但现实已经给了答案——在强国面前,弱国的声音,连上桌的资格都没有。

懂王骂泽连斯基

trump-diss-zelenskyy 特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了 见闻 资讯

特朗普对着乌克兰总统泽连斯基一顿骂,说他就是个喜剧演员,战争就是他的错。

想想看,一个只是勉强算得上成功的喜剧演员——弗拉基米尔·泽连斯基,竟然让美国花费了 3500 亿美元,卷入了一场不可能赢得的战争——一场本不该开始的战争,而这场战争,如果没有美国和“特朗普”,他永远无法解决。

美国比欧洲多花了 2000 亿美元,而欧洲的钱是有保障的,而美国却什么都拿不回来。为什么“瞌睡乔”拜登不要求公平呢?这场战争对欧洲来说比对我们重要得多——我们之间隔着一片广阔美丽的海洋。

除此之外,泽连斯基还承认,我们送给他的一半钱“不翼而飞”。他拒绝举行选举,在乌克兰的民调支持率极低,他唯一擅长的事情就是把拜登“耍得团团转”。

一个没有选举的独裁者,泽连斯基最好快点行动,否则他很快就不会再有国家可言。与此同时,我们正在成功地谈判结束与俄罗斯的战争,所有人都承认,只有“特朗普”和特朗普政府能做到这一点。拜登从未尝试过,欧洲也未能带来和平,而泽连斯基可能只是想让“提款机”继续运转。

我热爱乌克兰,但泽连斯基做得一团糟,他的国家满目疮痍,数百万人不必要地死去——一切仍在继续……

打了三年的俄战争终于要结束了

2025年2月,俄乌战争突然迎来了戏剧性的转折。 这次不是乌克兰的反攻,也不是欧洲的调停,而是美国和俄罗斯直接达成了一份停战协议——乌克兰和欧洲竟然都没有上桌谈判。

美国与俄罗斯的交易:乌克兰被“交易”了?

特朗普上台后,承诺迅速结束俄乌战争。他确实做到了——但过程让全世界震惊。美国与俄罗斯私下谈判,直接敲定停战条件:

  • 乌克兰割让土地归俄罗斯,不再提收复失地的问题;
  • 乌克兰5000亿的矿产资源开发权归美国,但美国只承认给了670亿(泽连斯基声称应是1500亿);
  • 乌克兰的战争债务全部归欧洲承担,无论是军援、贷款还是重建费用;
  • 乌克兰获得”荣耀”——至少官方叙述上它是“为自由而战的英雄”。

至于乌克兰总统泽连斯基,他被要求要么签字,要么下台。他想在协议上稍作修改,例如希望美国提供安全保障,并让欧洲分一部分矿产资源(毕竟欧洲为战争付出了最多),但美国冷冷地拒绝了:“你只能签,不能改。”

特朗普甚至笑称泽连斯基仍然是个喜剧演员,选民对他的支持率已经跌到了可怜的4%,如果不签,那就换一个愿意签的人来做总统。

欧洲被美国出卖了

这次谈判不仅乌克兰被边缘化,连欧洲也被狠狠地“卖”了一次。战争期间,欧洲投入了大量的经济和军事援助,但现在,美国和俄罗斯一纸协议就决定了战后秩序,欧洲的声音完全被忽视。

曾经自诩为“民主价值捍卫者”的欧盟,现在像是一盘散沙,除了抗议之外,根本没有任何实质性的影响力。德国、法国等国家想争取权益,但美国一句话就让他们哑口无言:“你们要么接受,要么自己去和俄罗斯谈。”

特朗普的新外交格局:美国优先,乌克兰自生自灭

MAGA: Make American Great Again,让老美再次伟大!

对于特朗普而言,拜登时期的乌克兰政策是个**“无底洞”**,他上台后第一件事就是要求乌克兰偿还债务:“如果不还钱,乌克兰这个国家可能就不会存在了。”

他不在乎乌克兰的独立与安全,也不关心欧洲的利益,他要的只是美国的回报。而这个协议,正是“美国优先”的最好体现:

  • 俄罗斯得到了领土;
  • 美国拿到了资源;
  • 欧洲付出了代价;欧洲要完,俄乌冲突,欧洲就属于打肿脸充胖子那种,这几年啥都贵,一大原因就是欧洲不买俄罗斯的天然气,制造业成本就上去了。
  • 乌克兰的未来被决定了,但没有发言权。
  • 弱国无外交,乌克兰和欧洲的尴尬现实

这一切,仿佛是历史的重演。乌克兰被迫接受现实,欧洲再次成为大国博弈的牺牲品,而美国继续按照自己的节奏推进全球战略。特朗普成功地兑现了他“终结战争”的承诺,但代价是乌克兰的主权与欧洲的信誉。

这场战争的真正赢家,似乎只剩下美国和俄罗斯。美国可谓是赢的盆满钵满,远离战场,又卖武器。俄罗斯也赢得了比战前更多的土地,也是个大赢家,输家只有乌克兰和欧洲。

乌克兰自废武功

乌克兰把自己的命运寄托于美国是错误的,做美国的敌人是危险的,做美国的盟友是致命的。

1991年苏联解体后,乌克兰继承了约1900枚战略核弹头,成为当时世界第三大核武国家。然而,乌克兰在1994年12月5日签署了《布达佩斯安全保障备忘录》,同意放弃核武器,以无核国家身份加入《不扩散核武器条约》。作为回报,美国、俄罗斯和英国承诺尊重乌克兰的主权和领土完整。然而,近年来,乌克兰的安全形势引发了对当初弃核决定的反思。

特朗普2.0的开局,不可谓不“精彩”。接下来,他会怎么玩这盘棋?欧洲会不会咽下这口气?乌克兰又能不能翻身?时间会告诉我们答案。

朝鲜黑客盗取世界第二大交易所ByBit 15亿美元的ETH。

happy-time-trump-elon-putin-and 特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了 见闻 资讯

美俄朝鲜最近都很Happy

新闻/实事/经济

本文一共 2326 个汉字, 你数一下对不对.
特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了 见闻 资讯
The post 特朗普2.0: 乌克兰的命运由美俄决定, 欧洲被卖了 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. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  4. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  5. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  6. 力扣 Leetcode 的刷题利器: 在线调试器和自动代码提示完成 力扣代码调试器 Debugger 最近 leetcode 刷题网站出了一个在线调试器. 个人感觉非常好用. 因为我平时是用 IPAD+蓝牙键盘来刷题, 而在 ipad 上是没有集成的IDE的, 对于调试来说, 只能很原始的让函数退出一个值, 然后尝试不同的输入来发现问题. leetcode在线调试器的好处...
  7. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...
  8. 优化设计 个人主页 并且 PageSpeed Insights 双项 100分 坛子的个人主页 www.tanzhijun.com 不错 很适合个人主页的模板. 而且是手机友好. 于是我照着把 我的主页改了改. https://steakovercooked.com 并且做了几点修改: 0. 使用 google mod_pagespeed 把 JS,...

Delphi编程语言三十周年了!

2025年2月16日 18:55

delphi-30-years Delphi编程语言三十周年了! Delphi / Turbo Pascal 程序设计 计算机 资讯

Delphi最初的版本, Delphi被称为是VB Killer

知道Delphi这个编程语言的估计暴露年龄了。很多人以为Delphi这门程序已经挂了,但实际上没有:IsDelphiDead.com

我最后一次用Delphi是2018年,在我离开一个剑桥初创企业,当时我从2009年到2018年,用Delphi写了超过40万行Delphi代码。其中包括了一些C++还有WIN32内链汇编。

Delphi 30周年纪念日

2025年,Delphi迎来了其发布30周年纪念日。自1995年首次亮相以来,Delphi凭借其高效、稳定的特性,成为众多开发者的首选工具。在这30年间,Delphi经历了辉煌、低谷,如今在全球范围内依然拥有忠实的用户群体。

Delphi的诞生与辉煌

Delphi最初由Borland公司于1995年推出,作为Windows平台下的快速应用程序开发工具(RAD),其前身是DOS时代盛行的“Borland Turbo Pascal”。Delphi以其可视化组件库(VCL)和高效的编译器,使开发者能够快速构建复杂的应用程序。在1999年发布的Delphi 5版本中,Delphi达到了用户数量的巅峰,一度超越了Visual Studio,成为开发者的首选工具。

挑战与低谷

然而,好景不长。在推出Delphi 7之后,Borland公司因内部管理问题和市场竞争激烈,逐渐走向衰败。Delphi的创始人Anders Hejlsberg离开公司,转投微软并开发了C#语言,这对Delphi造成了沉重打击。同时,Java和.NET等新技术的兴起,进一步挤压了Delphi的市场空间。高昂的定价策略也使得许多开发者转向其他工具,Delphi的用户群体急剧萎缩。

重生与发展

尽管经历了低谷,Delphi并未消失。在被Embarcadero公司收购后,Delphi不断进行技术革新,推出了支持多平台开发的版本,如Delphi XE系列。这些版本支持Windows、Android、iOS和Linux等平台,满足了现代开发的需求。在全球范围内,Delphi在巴西、中国、德国、俄罗斯和非洲等地仍然拥有广泛的用户基础。特别是在中国,Delphi在教育领域和企业级应用中依然发挥着重要作用。

展望未来

随着技术的不断发展,Delphi也在积极适应新的趋势。从最初的单一平台开发工具,到如今支持多平台、多设备的综合性开发环境,Delphi始终在追求创新。在未来,Delphi将继续优化其跨平台能力,提升开发效率,为全球开发者提供更强大的支持。

在这30周年之际,让我们向Delphi致敬,感谢它为全球开发者带来的卓越贡献。期待Delphi在未来继续引领技术潮流,为开发者创造更多可能。

聪明的程序员用Delphi

“真正的程序员用C++,聪明的程序员用Delphi”这句话曾在IT界广为流传,体现出Delphi简单、高效等优点。 Delphi最初的版本, Delphi被称为是VB Killer, 在Windows下可以快速开发Native的WIN32/64代码。代码执行效率高因为是编译(Compiled)的而不像VB解释式的(Interpreted)。

Delphi作为Windows平台下的快速应用程序开发工具(RAD:Rapid Application Development),以其简单、高效和功能强大的特点,深受开发者喜爱。与C++相比,Delphi更易于上手,开发效率更高;而与Visual Basic相比,Delphi功能更为强大。因此,使用Delphi的程序员被认为是“聪明的程序员”。

聪明的程序员用Delphi

Delphi(VB Killer)是一种编程语言,它是由Borland公司于1995年推出的。Delphi是一种基于Pascal的高级编程语言,它是一种面向对象的编程语言,它是一种结构化编程语言,它是一种事件驱动的编程语言。也被称为Object Pascal。

英文:Delphi is 30 Years Old!

本文一共 922 个汉字, 你数一下对不对.
Delphi编程语言三十周年了!. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c Delphi编程语言三十周年了! Delphi / Turbo Pascal 程序设计 计算机 资讯
The post Delphi编程语言三十周年了! first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 假期送娃去管弦乐队速成班 (Holiday Orchestra) 两个孩子除了学习钢琴外,还各自学习了第二种乐器:老大学的是大提琴,老二学的是小提琴。这个圣诞节假期,我们为他们报名参加了为期4天的管弦乐队速成班,从早上9点半到下午4点半,中间休息一小时,总费用为229英镑,第二个孩子享受了折扣。 在4天的速成班中,孩子们第一天觉得非常累,特别是下午的2小时以上的排练,他们不停地拉琴,手感非常酸。刚开始他们看谱较慢,一不小心就错过了几个音符,但他们都坚持下来,并在最后一天进行了完美的表演。 管弦乐队分为Strings和Bands等部分。其中,Strings包括大提琴、小提琴和BASS(一种体型较大的乐器,外形类似大提琴)。Bands则包括各种吹奏的管乐器。要加入Upper Strings,需要达到或超过五级水平,而Lower Strings则是面向未达到五级的孩子。因此,参加考级不仅是对学习音乐的一种监督,也能解锁更多的可能性。 在表演当天,孩子们穿着帅气,这是他们的高光时刻。唯一的遗憾是我们坐在正中间,但孩子们被其他孩子挡住了,所以拍照和录像的角度都不理想。表演的厅很大,下次我们应该尝试到二楼从上往下拍摄。 PS:照片是我用单反(加能 EOS 6D Mark II 加大三白70-200mm中长焦红圈镜头拍的) 本文一共 443 个汉字,...
  2. 高大上 CloudFlare Pro CloudFlare CDN 的免费帐号已经很不错了 很多免费的功能, 最主要是 可以无限添加站点 每个站点都可以用上免费的 Universal SSL 还提供网站节流 安全 提速等功能. 往往只需要1个按键就可以 对于大部分用户来说是非常有用和省心的. 我又败家了...
  3. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  4. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  5. 微博帐号被盗 昨天想上微博 才发现 密码怎么都不对 密码不可能记错的 就那几个试来试去没一个对的. 本以为是系统暂时的问题 今天 还是这样于是就用忘记密码找回登陆信息. 改了一个比较复杂的密码. 登陆上 发现 有一私信: 果真 帐号被盗了 也许是暴力破解...
  6. bidvertiser的广告收入: 2年10美元 2013年申请了一个 bidvertiser 的广告 类似 google adsense, 不过是 Pay Per Click 按次点击付费的. 这个月收到了最低付费标准的 10美元 Paypal 并没有扣手续费....
  7. 老婆代购 – 畅购英伦 更新: 全新的 代购网站 畅购英伦 上线了! 求推广, 求转发, 求收藏! 多多使用 多多提建议! 我因为懒 而且还有其它原因 是不愿意做代购的. 我老婆最近在计划做代购的事情 因为老大下个月就上幼儿园了...
  8. 快通过 PAYPAL ME 捐点给我吧 PAYPAL在西方国家 很是流行 国内的山寨PAYPAL就是支付宝. PAYPAL 的好处就是 在英国和银行转帐 免费的. 转帐的速度很快. 几乎是几秒就转到了我的HALIFAX银行. PAYPAL和EBAY还真是一伙的 之前在EBAY上卖 需要交 10%的费用 PAYPAL费用 还有EBAY的上架费....

如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用)

2025年1月24日 05:10

创建一个 GitHub Pages 站点是一个简单的过程,可以免费为你的个人、项目或组织创建网站/博客。按照此指南开始。

步骤 1:创建 GitHub 仓库

  • 登录你的 GitHub 账户。
  • 点击“新建”来创建仓库。
  • 对于个人站点,命名为 .github.io。
  • 对于项目站点,使用任何有效的名称。

步骤 2:添加你的站点文件

使用以下命令克隆仓库到本地机器:

git clone https://github.com/<username>/<repository-name>.git

创建一个 index.html 文件,包含你想要的内容。这里是一个例子:

<!DOCTYPE html>  
<title>我的 GitHub 页面</title>
<h1>欢迎访问我的站点</h1>
<p>这是我的第一个 GitHub Pages 站点。</p>

或者,你可以使用 README.md(Markdown)作为首页。

## 我的 Github 页面
### 欢迎访问我的站点
THis is my first Github Pages site.

将你的更改提交并推送到 GitHub:

git add .
git commit -m "Initial commit"
git push origin main
how-to-setup-github-pages-static-apps 如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用) Github 学习笔记 小技巧 程序设计 网站信息与统计 计算机 计算机

Github 上启用 Github Pages 的步骤

步骤 3:启用 GitHub Pages

  • 转到你的仓库设置。
  • 在侧边栏点击“Pages”。
  • 在“源”下选择分支(例如,main)和文件夹(如果适用)。
  • 点击“保存”。

步骤 4:查看你的站点

  • 对于个人站点:访问 https://<username>.github.io/。
  • 对于项目站点:访问 https://<username>.github.io/<repository-name>/。

步骤 5:自定义你的站点

要添加主题,请转到 Pages 设置并选择“选择一个主题”。

你还可以上传额外的 HTML、CSS 和 JavaScript 文件以进行进一步的自定义。

为什么 GitHub Pages 是“无服务器静态应用” / Serverless Apps

GitHub Pages 作为无服务器静态应用运行,因为它们直接向用户提供预构建的静态 HTML、CSS 和 JavaScript 文件,而不依赖后端服务器或运行时动态内容生成。相反,这些文件托管在 GitHub 的全球内容分发网络(CDN)上,确保快速有效的交付。

优点:

  • GitHub 提供的免费托管。
  • 不需要服务器维护。
  • 由于 CDN 分布,加载速度快。
  • 简化了静态站点的部署和扩展。

缺点:

  • 仅限于静态内容;不支持像数据库这样的服务器端功能。
  • 高级工作流的自定义需要技术知识。
  • 依赖于 GitHub 的基础设施。

GitHub Pages 的总结

GitHub Pages 是一个令人赞叹的免费托管网站的工具。只需几步,你就可以为你的项目、作品集或个人使用创建一个站点。通过利用无服务器模型,你可以构建轻量、高效且维护最小的站点。

英文:How to Setup and Create GitHub Pages (Serverless Static Apps)

本文一共 587 个汉字, 你数一下对不对.
如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用). (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用) Github 学习笔记 小技巧 程序设计 网站信息与统计 计算机 计算机
The post 如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用) first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 最好的发财策略就是忘记它 在群里我和 @nationalpark 说到我用STEEM换了3000多个 YOYOW的时候我还有点沾沾自喜, 谁知道他一针见血: 听说你是steem换的我顿时心理平衡了 才突然想起来, 我半个月前是拿 500 个 STEEM 换了 将近3300个YOYOW. 今天 STEEM的价格8美元,...
  4. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  5. 英国TESCO超市有偿回收瓶子 前不久, 英国剑桥 Bar Hill 的的 TESCO乐购超市推出了一个回收瓶子的机器, 这机器就在超市入入口出. 只需要把瓶子放进去, 机器自动识别, 然后每个瓶子10P也就是相当于1块人民币. 完成后会给个小票, 买东西可以拿来当折扣用. 如果嫌麻烦, 在回收完成还可以选择捐给慈善机构. 机器非常人性化,...
  6. 面试刷题更像是一种服从性测试 在许多求职者看来,面试中的刷题环节似乎是对技术能力的直接考察。然而,从另一个角度来看,这一过程或许更像是一场服从性测试。 想象一下,当一个公司要求候选人解决复杂的算法问题或设计一个系统架构时,真正的目的并不仅仅是判断候选人是否能完成这项任务。许多时候,公司更关心的是你是否愿意花时间和精力去迎合他们的流程和标准。 为什么这样说呢?从实际工作中来看,绝大多数岗位并不需要员工每天都在解决高难度的算法问题或从零设计分布式系统。相反,工作中的任务更偏向于理解业务逻辑、维护现有系统以及团队协作。那么,为什么刷题依然是很多公司青睐的筛选方式? 答案或许在于,刷题能有效筛选出那些愿意投入大量时间准备,并在面试中展现高度配合精神的候选人。这种配合精神,是公司希望在未来的工作中看到的品质。一旦你通过了这些测试,公司就会认为你是一个值得信赖的员工,一个能遵从流程、适应规则并在需要时投入额外努力的人。 还有就是以前说的:面试刷力扣是大公司过滤的成本较低的方法之一:为啥有名的IT公司的程序员面试都这么难?,可以过滤掉大部分 False Positive,当然也有可能过滤掉人才(胜任工作的求职者)。不过对于大厂来说,招进来一个False Positive的损害要远远比错过一个False Negative大。 此外,随着AI技术的飞速发展,刷题的技术价值正在逐渐降低。像ChatGPT这样的AI工具,已经可以轻松解决LeetCode或Codeforces上的许多高难度问题,并给出清晰的解题过程。这表明,算法题不再是人类独有的技术优势,而是可以被高效地自动化处理的任务。这种变化进一步凸显了刷题在实际工作中的局限性,因为日常工作更多依赖于沟通、业务理解和对系统的长期维护,而不是短时间内解决某个抽象问题。 OpenAI推出o3大语言AI模型。 Codeforces 评分:2727——相当于全球人类程序员编码竞赛中,排名第 175 位。...
  7. 英国 NatWest 银行推出 Reward Current Account 用来交水电费等帐单可以省钱 英国 NatWest 银行推出 Reward Current Account 银行帐号, 每个月需要交会费 3 英镑, 一年则需要36英镑 并不便宜, 但是好处是 只要通过该帐号以 Direct...
  8. 离开 NPower – 在英国选择便宜的电气公司 extraenergy 在彻底离开 谢菲尔得的那一天 和房东一起读了 电表, 公寓里只用电 没有媒气 所以做饭也用电 特别贵. 虽然在 13年底装了 两个电表. 白天一个 晚上 12点到早上7点另一个表, 所以两个计费....

像素艺术家-开发日志

2024年12月6日 16:49

类似的方块游戏特别多,我想着做点差异玩法,前一段时间也有分析过,背包乱斗的玩法与代码,这种玩法还挺上头的。
背包大乱斗与俄罗斯方块(设计篇)
背包大乱斗与俄罗斯方块(代码篇)

目前在制作中的游戏就是从那份分析代码中衍生出来的,重构-重构-就出来了一个新的框架。

对最开始的一版代码进行的优化:

  1. 支持同时存在N张map,并且支持了Map缩放,行列定制。
  2. 拖动两个方块重叠,会直接还原到拖放之前的位置。
  3. 解决了一些微不足道的bug

在考虑是否有必要支持多个地图进行动态的拼接,即多个地图靠在一起,啪叽,融合成一个。
还有个想做的是支持跨地图的砖块拖放,当然这涉及到游戏规则的定制了。

现在这款游戏的状态就像是,创造了世界,但是忘记创造了规则(玩法)。
朋友们有啥想法吗,请畅所欲言,哈哈。

你可以在左下角的猫咪菜单栏点击爱心,打开这个程序,或者访问 https://px.vrast.cn 均可。

清理缓存

如果之前打开过我这个站点的朋友估计要清理下缓存才能看到最新的开发进展。
这个清理缓存与清理网页缓存不同,unity的web程序会直接使用本地存储。
清理方式如下:

搞明白事情的次序

2024年11月27日 19:54

搞明白事情的次序挺难,刚开始我是打算直接开发射击游戏的,然后直接放web。

直到我晚上洗澡的时候才意识到,如果做web分发,我只能做小体量的游戏。
一来是我也拿不到很多被优化压缩过的资源,网络上的资源虽然是免费的,但普遍尺寸较大,大尺寸我无法负载分发成本。
二来是找资源费时费力,主要是我懒。

现在我更偏向在线上部署一个demo合集,去验证算法,玩法以及渲染相关的一些东西。
如果是射击demo,就直接用一个模型做玩法验证,就如之前制作的俄罗斯方块一样。

说到俄罗斯方块,我将这个demo放置在左下角黑猫警长的菜单栏内了,点击之后会弹出一个模态窗口。
这个窗口会动态加载一个frame,可以直接看到我最新的制作进展。

改动

之前已经制作了方块的添加,放置,障碍判定,用键盘移动,旋转,现在添加了用鼠标拖拽的功能。

优化

相应的算法也进行了优化,之前一张Map有N个节点,这些节点都被创建了。
现在则改为一张背景图,而不去创建这些节点,节约了大量的性能。
原理是通过获取玩家点击的位置,去计算玩家点击的相对点,如下:

1
2
3
4
5
6
7
8
9
10
11
12
public INode GetNodeMouseHitWorldPoint(Vector3 HitPoint) 
{
var colliderSize = new Vector3(Width, Height, 1) * Scale;
var colliderPosLeftDown = RootPosition - Vector3.one * Scale / 2f;

var relPos = HitPoint - colliderPosLeftDown;

var pointX = Mathf.CeilToInt(relPos.x / Scale) - 1;
var pointY = Mathf.CeilToInt(relPos.y / Scale) - 1;

return GetNodeWithXY(pointX,pointY);
}

清理缓存

今天刚好海河也问我了,如果要看最新的进展要清理下本地浏览器缓存。
虽然现在没啥可玩的,哈哈。

背包大乱斗与俄罗斯方块(代码篇)

2024年11月21日 16:31

前一段时间写了一篇 背包大乱斗与俄罗斯方块(设计篇) ,具体的实现思路在这一文中已经讲清楚了,后来我抽空去实现了一版。目前看效果还不错。

已经实现,形状的变换,定位,移动,消除,障碍判定等。
本篇稍微讲一下具体的实现过程,以及如何去优化这个算法。

基于池去实现节点的创建与回收

一开始就基于这个池模板去管理所有数量上较多的对象,后期优化的压力会小一些。

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
public interface IReset
{
void Reset();
}

public interface IPool<T> where T : IReset
{
Stack<T> nodesPool { get; }

T CreateOne<W>() where W : T, new();
void ReturnOne(T item);
}


public class BasePool<T> : IPool<T> where T : IReset
{
Stack<T> _nodesPool = new Stack<T>();
public Stack<T> nodesPool { get { return _nodesPool; } }

public virtual T CreateOne<W>() where W : T, new()
{
if (nodesPool.Count > 0)
{
return nodesPool.Pop();
}
return new W();
}

public virtual void ReturnOne(T node)
{
node.Reset();
nodesPool.Push(node);
}
}

分离算法与表现

我们的算法是需要适应不同的场景的,如果基于一套UI或者3D/2D渲染,混写代码,就会导致这个代码复用性低,迁移起来费时费力。

TileInfo.cs 作为管理单个形状( 物品) 渲染信息的最小单位。我们并不需要在这里书写任何如何去渲染的逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TileInfo :  IReset
{
public List<GameObject> Cubes = new List<GameObject>();
public GameObject Tile;
public Color BaseColor;

public void Reset()
{
BaseColor = Color.white;

if (Cubes.Count > 0)
{
for (int i = 0; i < Cubes.Count; i++)
PrefabPoolManager.GetInstance().PushGameObjectByType(PrefabPoolManager.PrefabType.Cube, Cubes[i]);
Cubes.Clear();
}
PrefabPoolManager.GetInstance().PushGameObjectByType(PrefabPoolManager.PrefabType.Tile, Tile);
Tile = null;
}
}

将这个逻辑放到一个单独的Render脚本中,这样处理现在我们已经将渲染画面的功能完全隔离到了 BlockRender。
如果我们有3D的画面,就可以写一个3DBlockRender 或者是 UIBlockRender ,只需要抽象出接口做新的实现即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BlockRender 
{
public TileInfo UpdatePreSelectNode(PreSelect node, LogicMap map)
{
return UpdateTile(node, node.Shape, node.x, node.y, map);
}

public TileInfo UpdatePreSelectNode(PreSelect node, IShape shap, LogicMap map)
{
return UpdateTile(node, shap, node.x,node.y,map);
}

...

至此我们已经完成了基础逻辑,他包含一个通用的池实现,与一个通用的渲染层。

核心算法

一般来说游戏的业务逻辑复杂度都不高,真要说复杂的,那肯定是渲染逻辑。
这段放置图形的代码,就是背包大乱斗最复杂的业务逻辑了。

通过当前节点的相对点加图形的数据结构中存储的x与y值,就可以推算出逻辑节点的坐标。
注意这边的逻辑节点,需要配置map的信息,比如map的位置信息与缩放进行一个定位,才能换算出真实坐标。

当然下面的代码并没有添加,是否这个位置有阻挡或者已经被占用的判定,由于我们的玩法尚未定型,则将这个判定放到了渲染层,在最后的演示中,你可以看到如果两个图形有重叠部分,重叠部分的区域会变成红色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public INode PlaceShape(INode node,IShape shape) 
{
node.Shape = shape;

//解析data
var data = shape.Data;
var rows = data.GetLength(1);
var columns = data.GetLength(0);

for (int y = 0; y < rows; y++)
{
for (int x = 0; x < columns; x++)
{
if (data[x, y] == 0)
continue;

INode usedNode = GetNodeWithXY(node.x + x, node.y + y);
usedNode.State = NodeState.CUBE;
}
}

return node;
}

演示

通过空格键可以在左下角创建出方块,wasd去移动,qe可以转换方向,再次空格键可以放下方块。

页面有9M大小,加载较慢。演示地址 : 点我转跳

我尝试在下方加载了一个 iframe ,如果能正常显示的话就不用再转跳到上面的链接了。-

现在上面的演示地址失效,我用来放置游戏demo,当然这个demo也是用如上算法,欢迎参考,关注。

背包大乱斗与俄罗斯方块(设计篇)

2024年11月19日 13:53

前段时间背包大乱斗身边的同事玩的还挺多的,刚好这几天有空去研究研究,我还专门去看了背包大乱斗的攻略。发现,“啊,这不是俄罗斯方块吗 ?” 又一番研究之后确实,背包大乱斗和俄罗斯方块有诸多相似之处。

玩法分析

在空间规划与摆放方式上,俄罗斯方块是要将各种形状方块合理放置在游戏区域,通过移动和旋转来填满行以得分,背包大乱斗则要在有限背包格子内合理放置装备等物品,考虑其形状、属性和搭配来最大化利用空间;

在决策过程中,俄罗斯方块玩家要在方块下落时快速决策其旋转、移动和放置时机,考虑方块间关系和后续空间预留,背包大乱斗玩家要依据职业、已有物品和游戏局势做出购买、合成等决策,两者都要综合考虑多种因素;

从形状与组合多样性来看,俄罗斯方块有七种四格方块,通过旋转和移动创造多样组合,背包大乱斗有多种装备等,通过合成、镶嵌等形成不同搭配;

游戏的动态变化性上,俄罗斯方块随着方块下落和消除游戏区域不断变化,玩家要随之调整策略,背包大乱斗在游戏中因新物品获取、对手情况变化而使局势改变,玩家也需要及时调整背包布局和策略。

游戏是继承与发展的。背包大乱斗本质上是俄罗斯方块机制的延展,从后者的空间利用、策略决策、形状组合和动态变化中获取灵感,深化空间放置与规划理念,发展出更复杂多样的内容,如物品属性和合成搭配,其动态变化也更具挑战性,给玩家全新体验。

背包大乱斗

代码设计

透过现象看本质,背包大乱斗的核心玩法,其实与俄罗斯方块是一致的,在这个基础之上包装了一个RPG。
当然你要说这个游戏,有着更加丰富的玩法,固然如此。但这些玩法最终都要依赖这个核心的玩法。

说了那么多,想必大家心里都有了不同的实现方案。那么现在我们动手去实现一下这个玩法的核心算法。

从一个二维数组开始

在所有的一切开始之前,要定义一个基础 Map ,我们所有的坐标定位都要基于这个二维网格。
顺便,我们将基础坐标系定在第一象限,方便我们定位与计算。

对应的数据可以表示成这样 (10X10) 空白格用0来表示:

1
2
3
4
5
6
7
8
9
10
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

创建基础单位

一个基础单位,有上下左右,共四种朝向,当然这个基础单位可以任意的长短,这是灵活的,可配置的。

我们用虚线格填充这个基础单位,则有了下图,这样的好处是方便通过数据去描述这个单位长什么样子。

虚线格子用0表示,实线格子用1表示, 结合前面我们提到的,将这个坐标系放在第一象限,并且从下往上,从左至右自增。对于单个方块,我们可以用如下的数据结构去描述,它的不同形态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

010
111


01
11
01


111
010


10
11
10

设计一个运行框架

根据上面的思路我们可以这样去设计程序:

  • 我们的主体就是一张图,其中有N个节点。这个节点有个状态字段,如果不能放置或者被占用则标注之。
  • xy就是节点的坐标,因为我们的节点最终是要存储到一个list内的。
  • ShapeTemplate就是设计的重点,一个图形模板,通常一个图形模板对应多个分形(可以变换的状态)。

实际一个图形,在图中所占用的确切坐标,仅是一个node,根据这个节点定位结合图形的形状,可以轻松的定位到其他几个被影响到的点位。

以上背包大乱斗与俄罗斯方块的玩法分析与代码设计。

2024年推荐7款免费好用的国内外服务器传输工具

2024年11月14日 16:08

很多小伙伴都购买了服务器并且需要在服务器之间进行文件传输。无论是在国内还是跨国界,选择一款高效、安全的服务器传输工具至关重要。

将文件从本地传输到服务器主要使用的是 ftp、sftp 2种协议,下面并对其进行了知识讲解并且推荐几款国内外广泛使用的服务器传输工具,它们各有特点,能够满足不同用户的需求。

国内外服务器传输工具推荐
国内外服务器传输工具推荐

FTP、SFTP 知识科普

1、什么是SFTP?

SFTP,也被称为安全文件传输协议(SSH File Transfer Protocol),属于文件传输协议(FTP)的安全版本,也是SSH协议的一部分,可通过安全 SHELL(SSH) 数据流轻松进行数据传输和数据访问。它提供了一个安全的连接来传输文件,并在本地和远程系统上遍历文件系统。SFTP 中的加密是通过 SSH 连接来完成的,文件可以通过 WinSCP 和 SFTP 客户端进行传输。

2、FTP与SFTP的区别?

  • FTP 不提供在主机之间传输文件的安全通道,而 SFTP 提供了在主机之间传输文件的安全通道
  • FTP 代表“文件传输协议”,而 SFTP 代表“SSH文件传输协议”
  • FTP 使用 2 个通道传输数据,而 SFTP 使用 1 个通道传输数据
  • FTP 允许端口 21 上的入站连接,而 SFTP 允许端口 22 上的入站连接
  • FTP 不提供加密,而 SFTP 提供用于发送数据的加密
  • FTP 使用客户端-服务器体系结构,而 SFTP 使用 SSH 体系结构
  • FTP 具有直接传输方法,而 SFTP 具有隧道传输方法

FTP与SFTP之间的区别
FTP与SFTP之间的区别

3、相对于FTP,SFTP的优点

  • 在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全连接始终安全

  • 可以通过双向的加密通道重定向不通知的TCP/IP端口

  • SFTP协议在安全通道上运行,因此不会传输明文密码或文件数据

系统工具:scp/rsync/sftp

在Linux环境下,scprsyncsftp 是广泛使用的文件传输工具。scp是基于SSH协议的安全复制工具,适用于快速传输单个文件或整个目录。rsync是增量同步工具,特别适用于大文件和频繁更新的数据备份。sftp是基于SSH的交互式文件传输协议,适用于需要文件管理的场景 。

在大多数 Linux 发行版中,scp、rsync 和 sftp 已经默认安装。如果需要手动安装,可根据系统使用以下命令:

# Ubuntu/Debian
sudo apt update
sudo apt install openssh-client rsync

# CentOS/RHEL
sudo yum install openssh-clients rsync

安装 openssh-client 将自动包含 scp 和 sftp,而 rsync 需单独安装。

SCP(Secure Copy Protocol)

SCP 是基于SSH协议的文件传输工具,它简单易用,适合快速传输单个文件或目录。SCP通过SSH端口22进行数据传输,确保了数据的安全性。它不需要额外的配置,但不支持文件夹同步功能 。

SFTP(Secure File Transfer Protocol)

SFTP 同样基于SSH协议,提供了一个安全的文件传输环境。它支持文件夹同步和文件预览功能,适用于需要文件管理的场景。SFTP通过SSH端口22进行数据传输,与SCP相比,它提供了更丰富的文件操作功能 。

RSYNC

RSYNC 是一个强大的文件同步工具,特别适用于大文件和频繁更新的数据备份。它通过 SSH 或专用的 rsync 端口 873 进行数据传输,只同步发生变化的文件,从而节省带宽和时间。RSYNC 的增量备份功能使其成为数据同步的理想选择 。

MobaXterm

MobaXterm 是一个多功能的SSH终端客户端,支持 Windows 和 Unix/Linux 系统。它提供了多标签页、文件管理器、远程桌面、SFTP 和 FTP客户端等功能。MobaXterm 的界面相对复杂,适合有一定经验的用户 。

Termius

Termius 是一个跨平台的SSH客户端,支持 Windows、Mac、iOS 和 Android 系统。它提供了简洁、美观的界面和文件传输功能。Termius 支持端口转发、隧道、远程执行等高级功能,但某些功能需要付费使用 。

OpenSSH

OpenSSH手册页) 是一个开源的SSH协议实现,广泛用于服务器之间的安全通信。它支持SCP和SFTP协议,提供了数据压缩和多种认证方法。OpenSSH是免费的,适用于所有用途,包括商业用途 。

OpenSSH 套件由以下工具组成:

  • 支持系统:Linux、MacOS、Windows下载地址安装教程
  • 远程操作使用 ssh、 scp和 sftp 完成 。
  • 使用 ssh-add、 ssh-keysign、 ssh-keyscan和 ssh-keygen 进行密钥管理 。
  • 服务端由 sshd、 sftp-server和 ssh-agent 组成 。
  • 它提供了代理转发、互操作性、端口转发和强认证等功能。

OpenSSH 由OpenBSD 项目 的少数开发人员开发 ,并根据 BSD 风格的许可提供。

下载地址:OpenSSH Portable Release

WinSCP

WinSCP 是一款专为Windows用户设计的图形界面FTP/SFTP客户端,支持SCP和WebDAV等协议。它提供多种文件传输模式,确保文件传输的正确性,并支持任务自动化和脚本编写,方便批量文件传输和自动化管理。WinSCP还支持AES-256加密,确保文件传输的安全性 。

  • 支持系统:Winodws
  • WinSCP 提供一个图形用户界面和一个集成的文本编辑器。
  • 它具有对文件进行所有常见操作的功能。
  • 它具有脚本和任务自动化的功能。
  • 它支持传输队列/后台传输或传输恢复。
  • 它将让你使用AES-256加密法对文件进行加密。

Dropbear SCP

Dropbear SSH 是一个较小的 SSH 客户端和服务器。 它可以在不同的基于 POSIX 的平台上工作。 这个开源的平台可以用于嵌入式类型的Linux系统,如无线路由器。

  • 支持系统:Linux、MacOS、FreeBSD, NetBSD and OpenBSD、Solaris – tested v8 x86 and v9 Sparc、IRIX 6.5 (with /dev/urandom, or prngd should work)、Tru64 5.1 (using prngd for entropy)、AIX 4.3.3 (with gcc and Linux Affinity Toolkit), AIX 5.2 (with /dev/urandom)、HPUX 11.00 (+prngd), TCP forwarding doesn't work、Cygwin – tested 1.5.19 on Windows XP
  • Dropbear SCP支持X11转发和OpenSSH客户端的认证代理转发。
  • 它有能力从inetd或独立运行。
  • Dropbear SCP与OpenSSH~/.ssh/authorized_keys公钥认证兼容。
  • 它将允许你在编译时禁用一些功能以节省空间。

下载地址

Cyberduck

CyberduckGithub开源地址) 是一款跨平台的FTP/SFTP客户端,支持 Mac、Windows 和 Linux。它支持FTP、SFTP、WebDAV、Amazon S3等多种协议,并提供多语言界面和多种主题。Cyberduck还支持文件夹同步和文件预览功能,方便用户进行文件管理和浏览。

  • 支持系统:MacOS、Windows、Linux

FileZilla

FileZilla 是一款开源的 FTP 客户端,适用于多种操作系统。它支持FTP、SFTP和FTPS协议,并提供断点续传和批量下载功能。FileZilla还提供了日志记录和站点管理器功能,方便用户进行文件传输任务的管理和监控。

  • 支持系统:MacOS、Windows、Linux

总结

Windows 推荐:MobaXterm、FileZilla、WinSCP

MacOS 推荐:Termius

相关链接

23款好用的SSH客户端工具推荐

两种刷新网页缓存的方式

2024年10月16日 10:27

停用缓存

按F12打开浏览器自带的调试工具,注意需要勾选停用缓存,这样就可以使用网站的最新数据。

使用隐私浏览模式

隐私浏览模式可以保证不使用本地缓存的数据,与本地的cookie。所以隐私模式浏览可以获取最新的网站状态。
注意,隐私模式与正常浏览模式是隔离的,也就是切换成正常模式后,如有缓存仍然使用之前的缓存数据。

停用缓存工作原理

程序设计上来说,disable cache 就是一个开关,决定接下来所有的请求是否跳过缓存检测。
通常情况,命中缓存,调用缓存,跳过请求源文件。
勾选后,跳过缓存检测,直接请求原文件。

以下为测试步骤:

  1. 在stype.css文件中添加测试文本
  2. 在尚未勾选停用缓存下进行刷新(点击刷新按钮)
  3. style文件中并未出现测试文本,证明文件尚未更新
  4. 勾选停用缓存后进行刷新,style文件被更新

也有一些不会被缓存的

举个例子:你请求的是 a.html ,在这个html文件上进行的修改,则每次都会被刷新。这个文件并不会被缓存。

完全攻略!如何从零搭建Python私有仓库pypi,并发布包给其它项目组?

2024年10月3日 14:50
Python是一款老少皆宜的编程语言,从开发爬虫,到人工智能,最佳的选择总是Python, 如果是团队之间需要共享一些Python代码,最佳实践就是按照Python的规范封装成pypi包,但有些Python包又不适合发布到公网,于是自建一个存储Python包的仓库,则变得非常必要,本文则从零开始,搭建一个Python仓库,并发布一个Python包,并验证Python能否可以被其它项目正常使用。 创建必要的目录和文件 sudo mkdir -p /opt/pypiserver/auth sudo mkdir -p /opt/pypiserver/packages sudo touch /opt/pypiserver/auth/htpasswd 安装 htpasswd sudo apt update sudo apt install apache2-utils -y htpasswd -v 修改文件权限 sudo chown -R <your_user>:<docker_group> /opt/pypiserver sudo chmod -R 755 /opt/pypiserver <your_user>: 这应该是您当前登录的用户名,可以使用whoami 查看 <docker_group>: 这通常是运行 Docker 的用户组,在大多数系统上默认为 “docker”。 要填充这些变量,请按照以下步骤操作: 确定您的用户名: 如果您不确定当前的用户名,可以在终端中运行以下命令: whoami 这将显示当前登录用户的用户名。 确认 Docker 组:在大多数情况下,Docker 组就叫 “docker”。你可以通过运行以下命令来确认: […]

托管服务器必备技能,为Ubuntu配置ufw防火墙

2024年9月24日 12:14
最近将一台服务器托管到了机房,机房给分配了固定的IP, 但并没有像云服务厂商一样,提供防火墙web面板,防火墙还是要自己搭,不过还好我用的是ubuntu,只需轻松几部,就能启用防火墙。以下是启用防火墙的一些常用技巧和实操命令 首先需要查看防火墙状态 sudo ufw status 默认状态一般都是不开启的, 也就是 Status:inactive 我们可以查看已有的规则 sudo ufw show added 默认没有任何规则 添加ssh规则,并查看 sudo ufw allow 22/tcp 为特定IP设置连接特权 如果你有一台独立的云服务器,可以允许特定云服务器ip的所有连接,这样如果后续玩ufw不小心封了ssh端口,也可以用特定的云服务器ip连上去 sudo ufw allow from your_ip_address 移除特定ip的连接特权(可选) sudo ufw delete allow from your_ip_address 如果想禁止可疑IP的访问,则可以运行以下命令 sudo ufw deny from suspicious_ip_address 拒绝传入链接,允许传出连接(防火墙一般是对传入的连接做限制,传出连接不做限制) sudo ufw default deny incoming sudo ufw default allow outgoing 启用防火墙 sudo ufw enable […]

使用PyEnv加Poetry管理Python版本以及依赖包

2024年9月18日 09:50
在Python开发中,不同的项目需要不同的Python版本,以及与Python版本对应的依赖包版本。 为了简化这个过程,我推荐使用PyEnv加Poetry来管理项目 PyEnv: 用于一键安装各种Python的版本,以及切换Python版本 Poetry: 可以基于PyEnv提供的不同Python版本,为工程创建虚拟环境,在虚拟环境中安装的各类依赖包,都不会影响到其它工程。 首先安装PyEnv curl https://pyenv.run | bash 将PyEnv写入到zsh echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo 'eval "$(pyenv init -)"' >> ~/.zshrc 重新加载zshrc, 查看pyenv命令是否生效 source zshrc pyenv --help 安装目前最新的Python3.12.6 pyenv install 3.12.6 查看可用的版本 pyenv versions python3.12.6的安装位置 cd $(pyenv root)/versions ls 可以看到将刚刚安装的python3.12.6 如果需要安装Python3.11.10,则运行以下命令 pyenv […]

我目前使用的AI服务

2024年9月2日 15:20

过去一年,我利用AI工具进行web开发,见证了AI飞速发展。现在更多关注的是现有工具如何提升工作效率,而非新工具的花样。使用的主要AI工具包括Perplexity、GitHub Copilot、JetBrains AI和OpenAI API等,极大地提升了开发效率。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

给博客加了一个搜索功能

2024年8月24日 18:10

作者首次尝试使用PGroonga搜索插件,但由于中日文搜索需匹配完整词汇而放弃,转向向量搜索,但倚赖AI的嵌入矢量会带来成本和准确度问题。最终选择meilisearch,结合关键词和语义搜索,实现多语言分词、内容推荐和向量数据生成,打造一个综合搜索系统。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

原积薪项目将于近日下线

2024年8月12日 13:00

由于积极性下降、内容质量低、反馈和浏览量不足以及维护成本,我决定下线积薪项目并转向发布Newsletter。尽管喜欢积薪这个名字并会继续推荐优质内容,但这将成为一个具有个人倾向的阅读分享栏目。Newsletter将涵盖政治、经济、开发和设计等多方面内容。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

本站已进化到第三代

2024年8月5日 22:30

新版《可可托海没有海》网站发布,第三版历时三四个月开发完成。新版本取消了Node后端,采用Supabase管理数据库,SvelteKit开发CMS,Remix开发前端。支持多语言、对象存储和AI集成功能。未来计划包括增加登录方式、未登录评论、评论提醒及代码优化。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

什么才是规矩的博客

2024年1月18日 11:00

优秀的独立博客应注重代码规范,如正确的RSS输出、完整的Open Graph信息、提供sitemap等,使服务友好且符合优化需求。同时,对访客友好也很重要,包括做好域名重定向、不添加干扰阅读的动效、适配移动端等。对于非技术人员,建议使用通用博客程序和无服务托管,避免运维问题。内容仍是博客质量的核心标准,但规范代码结构可提升用户体验。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

积薪24年1月更新

2024年1月13日 11:00

2024年积薪迎来性能优化更新,前端升级至SvelteKit 2,预加载数据提升页面跳转速度。后端升级依赖和优化缓存,文章及RSS提取迁移至supabase边缘函数处理。更新后,网站访问速度有所提升,实际体验可能改善。新博客系统计划集成常用功能,支持多语言及外链预览。采用前后端分离架构,项目工程量较大,预计上半年完成。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

连肝两周,积薪8月大更新

2023年8月25日 11:16

这两周我全力开发积薪的新功能,解决了首页内容更新慢的问题。重点是增加旧文章曝光和突出作者特点。现主页推荐文章和新增博客主页,展示作者信息。计划中还包括开发博客公墓功能和继续优化导航。RSS功能已上线,如需摘要输出,请留意站点。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

积薪更新动态: 升级了AI,现在分类和摘要更准确

2023年6月29日 11:16

积薪迎来重大更新:AI接口从百度换至OpenAI,提升文章分类、标签和摘要质量。Cloudflare Workers和gpt-3.5-turbo模型合作,使摘要和分类明显提升。更多详情请参阅《借助Cloudflare Workers打造一个专属OpenAI API》。虽然功能仍在调试中,但改动属正常现象。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

借助Cloudflare Workers打造一个专属OpenAI API

2023年6月29日 09:00

积薪功能包括根据文章内容生成分类、标签和摘要,曾使用百度API,但准确度较差。建议将AI接口迁移到OpenAI上,通过Cloudflare或Vercel方便调用。演示如何搭建专属OpenAI API,配置路由、保障安全。测试时部署到Cloudflare。这样即可获得稳定的、适用于SEO展示的摘要和其他AI服务。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

独立博客导航站“积薪”正式发布

2023年5月31日 19:00

独立博客导航站积薪由个人开发,利用AI分类文章,提供更好的阅读体验。文字传达持久力量,带给读者深度思考。积薪以“堆放的木柴”之意命名,希望文字能穿越时空。开发者计划让流量导向各博客,优化信息展示。拥护理念者可转发推广。愿意留下不一样的网站。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

积薪的技术架构

2023年5月30日 18:00

积薪是独立博客导航站,通过自动抓取与人工推荐分类,为作者和读者搭建流量通道。采用Nest.js后端,MongoDB数据库,SvelteKit前端,实现了100%SSR网站,并通过Cloudflare进行部署,性能优化包括缓存机制。该项目帮助作者克服对后端开发的恐惧,深入了解前后端开发流程,展示了技术架构与操作方法。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

给 WordPress 添加一个 RSS 友链阅读器

2024年9月6日 22:31

前情提要

前不久在 jeffer 的一篇文章看到写了一个wp的rss阅读插件,有点小心动。其实早在去年就和 thyuu 交流过这个wp的友链rss功能,当时老哥很快搞定了,还分享了实现代码。当时对rss不是很感冒,基本就是在友链页面翻翻经常逛的那几个,想着也不是每个人都有这个就感觉有点没必要,而且可以直接去看友链的公共聚合之类的,就没弄。直到现在,用了就感觉,欸 好像还挺方便的。

实现

需求是这样的:在wp原生链接基础上,读取不同分类链接中的 link_rss 数据然后解析为自定义 stdClass 返回并储存到 wp_options 表中(方便后期排序等操作),通过不同的链接分类,可以读取不同分类下的rss数据集,通过设置链接显示状态(visible)来限制已订阅链接。

基本理念就是读取和解析xml文件,不过这大千世界,rss种类也很多,面对多种数据结构需要手动去兼容返回。刚开始直接就问了kimi给了一套方案,用php自带的simplexml扩展来解析数据,试了 能用,不过需要自己手动兼容rss类型,就相对比较麻烦。后来想起 thyuu 之前用的wp原生功能 fetch_feed 能自动解析,效果感觉比 curl 好使..

后面尝试了两种不同输出的效果,虽然大差不差但还是wp原生的用起来更稳定(貌似),后面把数据缓存到 wp_option 表了,并挂载更新到了原生链接操作hook(增删改均可同步更新对应分类),添加 wp_schedule 定时清理所有分类缓存任务。

效果

综合效果还是不错的,如图。

一些请求被分割,一些请求失败(底部)

问题

主要有两个问题,一个是rss 抓取时间过长,另一个是抓取成功率问题。

  • 抓取时效性
  • 抓取成功率

关于 rss 抓取时效方面,从拉数据到缓存50+的链接需要反应大概2分钟左右。我问了kimi很多解决方案,什么异步、分块、多线程等等,效果都不太理想。

抓取成功率方面,我试了下当链接超过一定量时就会出现抓取失败的情况,有些报错是数据没完全接收。针对这一情况,首先尝试了 curl_multi 多线程处理,基本没效果。然后尝试将rss链接集分块请求处理,效果不理想。

综上所述,目前还是用的默认 fetch_feed 做的分块请求处理。有没有大佬来指点一二,这种数据应该怎么处理以性能最大化?

闲聊

tmd我前几天手贱给笔记本换硅脂,中毒了去看什么硅脂视频,tmd就是一坨大便艹。换完直接屏幕闪屏,一旦请求gpu上来就开始闪,以为gpu核心出问题了,换核显结果一样。。网上搜了一圈发现可能是显示器线材问题,于是外接显示器最后发现是笔记本显示器的问题。。。这tmd百思不得其解

最要命的是,换了硅脂,笔记本发热降频???我tmd合着搁着绕圈子呢,何况之前根本不降频,温度比这更高高负载时间也比这更长,我干,到底什么原因。我现在就怕这核心被我搞了,但按理来说我拆装非常小心所以不应该啊,哎日了狗,黑神话也搁置了,全怪自己手贱啊,非要去换sb硅脂,这就叫没事找事!!

在网游中进行位置同步的那些事儿

2024年8月16日 17:11

计划赶不上变化,前天与Unity小伙伴发过邮件,今天就有机会来做专题分享了。思来想去想去也没想到什么好主题,那就将之前发的一些文章整理下做一个专题。
本期专题就叫《在网游中进行位置同步的那些事儿》希望对准备做多端同步的小伙伴以及正在做的小伙伴一点启发。
行文匆忙,定有不周。如有错漏指出还请您不吝指出,必当认真对待。话说到这,下面开始我们的正文吧。

基于条件进行位置同步

在网游的移动同步中,我们需要思考同步的频率,是固定周期好还是根据条件判定好? 如果只是开发一个demo这当然是固定频率去同步比较简单。
但是在正式的产品开发中,面对大用户的接入,就需要严格控制乃至减少现在数据包的 大小以及频率。
这时候就要结合周期同步以及条件同步进行优化,让客户端的发包量进一步的降低。

假设我们现在就在开发一款MMO,我们先列一下几种位置同步的【条件】:

1
2
角度是否变更
位置是否变更

在固定的周期内(如15hz)会检测两个条件是否超出一定的阈值,如果超过定量则在该周期内同步一次。
服务器则根据当前同步的角度预测计算帧当前角色可能的位置,通常的计算方式如下:

1
预测玩家当前位置 = 上个包的位置 + (服务器当前时间 - 上个包的时间) * 上个包的移速 * 上个包移动朝向

如果是这种做法,当前移动速度为6m/s :

1
2
3
4
客户端刷新周期250ms,延迟为200ms,服务器得到当位置的最大误差为: (0.25s + 0.2s) * 6m = 2.7m   每秒4个包
客户端刷新周期100ms,延迟为200ms,服务器得到当位置的最大误差为: (0.1s + 0.2s) * 6m = 1.8m 每秒10个包
客户端刷新周期50ms,延迟为200ms,服务器得到当位置的最大误差为: (0.05s + 0.2s) * 6m = 1.5m 每秒20个包
...

以此类推,稍微优化一下也用不了那么多包,如果【条件】没有变更的话是不需要持续在周期内同步。
也就变成了每帧判定【条件】是否变更,如果没有变更则无需同步。
否则走默认的周期检测,检测周期也就可以改为更长时间,如 1s 同步一次当前位置,这样相应的发包也会减少。

条件的改变频率

在此基础上可以知道延迟固定的最大误差为 0.2s * 6m = 1.2m ,那么现在基于此应该去尽量少的发送数据包,也尽量少降低误差。
如果【条件】改变的频繁会大幅增加发包的数量,甚至可能每帧都产生一个包,如玩家在原地绕圈的时候会更多。
就比如我,玩游戏就有闲着没事手原地搓摇杆的习惯,顺便一问你也有这种习惯吗?还有就是原地切个枪什么的。

此时增加【条件】的冗余可以减少当前发包的数量,如 增加 角度/距离 变更的判定范围。
实际上这样做的效果并不好,原因是【条件】太容易满足。

基于误差累计替换【条件】(航位推算法DR)

前面有说到服务器预测当前物体,在计算帧的坐标是基于 运动朝向 + 物体坐标

那么在我们的检测代码中可以做两次计算,在客户端先预测服务器使用的当前物体预测位置。

1
2
客户端代码:
服务器的预测点 = 上次同步给服务器的坐标 + 运动方向 * 同步结束后累计的时间(当前时间 - 上次发包时间)

然后计算当前物体实际距离与 预测服务器得到的当前物体位置 之间的距离大于一定的值,如同步的精度为0.2m那就是

1
需要需要同步 = Vector3.Distance(服务器的预测点,当前的实时位置) > 0.2m

如果当前位置与服务器预测的位置误差控制在一定的范围内则不需要同步,否则的话就立即同步一次。
这里需要注意一下,如果玩家从静止状态第一次进入运动状态是需要立即告知的,反之亦然。
没有立即同步的话,你的好兄弟与你联机时候只会看到你全屏漂移,然后问你一句,你飞够了吗?

上面的做法,好处是误差可以控制在一定的范围内并且尽量的少发送同步包;比如误差控制在0.2m范围,如果发送的包超量再适当的增加此范围。

弱网多人联机表现优化

这里讲一下我的思路,收到服务器同步包的时候,用包里的位置与现在的实时位置做一个向量的减法,这样就能得到一个误差值。
这个误差值,我们在后续的x帧内给他缓慢的补上,让画面减少抖动。
除此之外,还可以用一个同步的误差值进行容错,后续的x帧内并没有完全消除误差的情况下,等下一次的移动中继续补上他的误差。
当然如果这个误差值过大,则还需要立即将其拉到消除误差的点位。毕竟我们不能因为要画面而去牺牲手感。
可能你也遇到过在射击游戏中明明看到敌人了,却射不中,大概就是此类问题的表现了。

言归正传,下面用代码做个演示。玩家每次收到的Pack结构如下:
position是此刻当前物体处在位置,angle为运动方向,speed为0则物体进入idle。

1
2
3
4
5
6
public class PlayerStatePack
{
public float speed;
public Vector3 position;
public int angle_deg;
}

下面是模拟服务端延迟的实现,fluctuation用来模拟网络抖动:

currentTime = Time.time + Ping / 1000f * 2 + Random.Range(-fluctuation * 2/1000f , fluctuation * 2/1000f );

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Update()
{
for (int i = 0; i < packLst.Count; i++)
{
if (packLst[i].BeSend)
continue;

if (packLst[i].currentTime <= Time.time)
{
packLst[i].BeSend = true;
ReceivePack?.Invoke(packLst[i]);
}
}
}

客户端接收消息实现如下:通过ReceivePack函数订阅模拟服务器下发的Pack, 在该函数内做一个向量的减法,获取当前客户端所处与服务器同步过来的位置之间的误差,
有了此向量,那后面就可以通过插值逐渐修正到一个趋近正确的位置,一定程度上抹平网络波动引起的误差。
在 ApplyPoint 函数我做了一个当前误差的差值与角度差值,这样效果会好一些。

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
public void OnMove(float passTime,float step,Vector3 pos,float angle)
{
...
}


private void ReceivePack(PlayerStatePack item)
{
Debug.Log("其他玩家收到同步包");

modifyOffset = item.position - transform.position;
localPositon = transform.position;
localAnlge = transform.eulerAngles.y;
...
}

public float timeTakenDuringLerp = .2f;

private void Update()
{
....
var passTime = Time.time - currentPack.CurrentTime;

OnMove(passTime,step,pos,angle);

ApplyPoint(passTime);
}

private void ApplyPoint(float passTime)
{
float percentageComplete = passTime / timeTakenDuringLerp;

if(percentageComplete >= 1.0f)
{
transform.position = RuntimePos + modifyOffset;
return;
}

var offset = Vector3.Lerp(Vector3.zero, modifyOffset,percentageComplete);
transform.position = RuntimePos + offset;

if(percentageComplete*2 >= 1.0f)
{
return;
}
var yoffset = Mathf.LerpAngle(localAnlge, currentPack.angle_deg,percentageComplete*2);
transform.eulerAngles = new Vector3(transform.transform.eulerAngles.x,yoffset,transform.transform.eulerAngles.z);
}

最终效果如下:

移动同步过程中载具平台旋转问题

假设你已经做好的上述的全部工作,现在要追加一个新的功能,让玩家可以在移动的船上游戏,其他的玩家也在不同的船上。
关键是船是有自身旋转的,这时候你会发现前面我们做的功能出现了新的问题。由于船或者移动的平台,他会产生自身旋转。
也就带着玩家一起移动,玩家的坐标在不断的变更。这时候同步的位置也不断的出现变化。
对于这种状态该如何比较好的检出玩家的位移变化呢 ?

刚开始我们可能会认为这个检出的过程应该这样:
需要综合 上一次同步点 与 上一次同步的载具旋转角度与当前载具的旋转角度差值,然后三角函数计算出预测下一个落点。再将这个落点与当前要同步的点进行匹配。如果是一个点就不进行同步。

这个判定的计算非常繁琐,还需要额外记录载具的角度变化,那么有什么办法不看载具信息吗 ?

我们再分析下这个需求,载具平台旋转,子物体跟转,相对静止。
有句话是这样说的,当你不知道解题思路,你把题干抄下来,也是能得分的。
没错,答案就是 相对静止


由于是相对静止(船心坐标O),向量 OA蓝色 与 OA红色 他们的长度是没有变化的。
也就意味着,只需要计算上一次同步的相对位置与当前位置的长度差值。就可以判断玩家是否在载具平台上有位移。

1
bool isMove = Mathf.Abs( lastSyncRelPosition.magnitude - currentRelPosition.magnitude) > 0.01f

当然也可以优化成下面这样,不开方更省一些性能:

1
bool isMove = Mathf.Abs( lastSyncRelPosition.sqrMagnitude - currentRelPosition.sqrMagnitude) > 0.01f

结束语

本期的分享就到这里,朋友们欢迎评论区留言,我们下期再会。

介绍一个多人划线标记功能

2024年3月21日 09:22

想法

灵感来源于某次逛公众号文章的时候,在文章中偶然看到了一个下划线,经过它时还会显示多少人划线标记。感觉这个功能其实对博文也挺方便的,因为都有评论系统,感觉可以通过评论用户信息做一个多人划线标记功能,自己留作标记的同时也方便其他浏览文章的博友发现和标记文章主要相关内容。

众所周知我目前用的平台是 wordpress,所以该功能也是基于 php 环境下进行开发的,由于标记数据储存在本地而非数据库中,可以灵活应用于各类基于php框架的博客系统上(如typecho、zblog、emlog等)。唯一一点是使用了 wordpress 的文章 id 来区分不同文章页面(关于这点其实可以使用加密 location.pathname 发送到后端作为文章别名区分,后续版本可能以此更新 已更新(默认url别名),执行标记后请勿随意修改url:*切换请求标识符(postID)可能导致清空本地记录继而误删远程数据)若使用其他平台需要修改前端请求中的pid参数(现可选携带参数:postId 初始化,默认 location.pathname

功能简介

划线标记功能结构由文章—用户—标记三部分组成,通过wordpress文章id区分:同一篇文章下可以理论上可以存在不限量标记,但同一个用户(md5邮件区分)默认情况下仅能存在3个标记(可携带自定义参数初始化标记)。而同一个标记(内容)仅能在该文章中存在一次(若通过某种手段重复标记某段已存在于远程记录时,后端会返回标记已存在的错误信息),另若当前选中文本在当前段落中存在多个相同字符时,前端会阻止用户提交标记。

本着只要能把功能复现就行的想法,在持续一周左右的时间后正式开始测试,目前该功能已集成到2BLOG主题最新的 #v1.3.9.2 版本中,后续将对其进行持续迭代更新,下面讲下简单实现思路。

实现思路

前端直接用的 getSelection api 执行选中标记操作(之前本想做跨浏览器兼容,后面想想太麻烦,先实现可以用了再说,反正又不是上线的东西 后面可以慢慢迭代无所叼谓),用户信息存了本地cookie(刚开始做的内容储存,后来改为用户本地校验内容)。

后端用的东西基本和我之前那篇实现gpt的思路基本是一致的,都是本地储存。唯一只是多了部分用户校验,因为涉及到用户新增和删除操作问题(毕竟所有人在评论后都可以对文章进行标记或删除)暂时只能先这么弄(虽然目前配置了文章标记次数限制,不过并没有做黑白名单限制)。

WordPress 简单实现 chatGPT 文章摘要

WordPress 简单实现 chatGPT 文章摘要

灵感来源于之前在浏览 HEO 博文时候偶然看到文章前有一段 AI 摘要,第三人称以打字形式来简述文章内容还是蛮酷的~ 于是拟了个把这个功能集成到 2BLOG ...

2BROEAR 21/03/2024 | 3191 views.

用户校验

目前做了两个信息校验,

一个是最基本的邮件mail(明文验证,其实刚开始的方案是有md5来做,后来因为新增了显示标记用户 gravatar 头像的需求所以不得不放弃该方案,取而代之的只能是远程明文对比验证。但是,为了防止出现邮件明文暴露后造成伪造请求的情况,在执行部分敏感操作时必须携带储存在用户本地的 timestamp 时间戳(明文)与储存在远程服务器中的ts(加密,防止远程ts暴露后获取到对应的本地ts明文)进行校验,通过后再放行相关操作。

但ts交互验证有一个明显的坏处就是:如果标记浏览器与执行操作的浏览器环境不同(即本地cookie无相关ts记录)哪怕当前是用户本人操作也无法通过远程ts验证,目前应对这种情况目前做了用户操作提示与浏览器user-agent记录(可查看对比记录),暂无具体替代解决方案。

其他

这个功能目前处于测试阶段,使用过程中有任何bug欢迎反馈哟/doge。(*另附一些常用的初始化参数如下(所有参数值均为默认值!具体参数等内容可前往 github 查看)

// 携带参数初始化
new marker.init({
    static: {
        postId: window.location.pathname, // 页面标识符(可选,文章唯一ID)
        apiUrl: "mark.php", // 后端 mark.php 文件地址(可选,缺省同一目录)
        md5Url: "md5.js", // 用户 mid 初始化 md5 资源(可选,缺省同一目录)
        avatar: "//gravatar.cn/", // 用户头像 cdn(可选,默认 cravatar)
    },
    class: {
        blackList: ['chatGPT','article_index','ibox'], //'', 'chatGPT,article_index',
    },
    element: {
        effectsArea: document.querySelector('.content'), // 可选区域(可配合 blackList 使用)
        commentArea: document.querySelector('#vcomments textarea'), // 评论区域
        commentInfo: {
            userNick: document.querySelector('input[name=nick]'), // 评论用户
            userMail: document.querySelector('input[name=mail]'), // 评论邮箱
        }
    },
});

插件

现已集成插件到 github:

2Broear/marker: a local-storage(php) based original javascript api marking-off plugin. (github.com)

todos

一些預計添加或修復的待辦事項

  • ❓ 約束後端請求頻率,(新增延迟文件锁),修復并發請求失敗但返回已完成問題。问了一圈 gpt 没解决,暂时在前端做请求限制与延时。
    • ❌使用 localStorage 修复了授权用户操作失败(弱网、并发)后再次访问时自动更新本地/远程记录。bug:标记后立即刷新页面会导致本地记录(已记录)无法匹配远程(等待返回)被删除,后续刷新页面后导致远程记录(已返回)无法匹配本地记录(已删除)被删除。(可在切换评论系统后,通过读取本地记录仍可执行标记删除等操作)
    • ✅更新方案(v1.3.9.5):标记或删除后等待远程响应,返回后再写入(补全)或删除(更新)本地记录对应逻辑如下:
      • 新增标记:(未响应,新增本地记录)—>刷新页面(未响应,删除本地记录)—>返回数据(已响应,对比本地记录)—>远程记录中 未找到 本地记录—>新增本地记录
      • 删除标记:(未响应,删除本地记录)—>刷新页面(未响应,新增本地记录)—>返回数据(已响应,对比本地记录)—>本地记录中 不存在 远程记录—>删除本地记录
  • ✅ 修复本地、远程标记请求上限多步验证。
  • ✅ 新增更多自定义初始化携带参数配置。
  • ✅ 新增自定义标记文本注释功能。
  • ✅ 支持多人重复(未注释)标记,并显示(前三)标记用户头像。
  • ✅ 更新UI/UE,更好的适配暗黑模式
  • ✅ 支持 SSE 服务端 api 推流(递增显示标记➕动画)bug: 每次接收数据后输出时未即使更新data
❌
❌