用 Dropbox 实现云同步游戏存档

Steam 云存档 (Steam Cloud) 是一项很方便的功能, 能让你在多台电脑上玩同一个游戏的时候, 无缝云同步游戏存档. 去年年初发布的戴森球计划 (Dyson Sphere Program) 到今天 (2022年2月27日) 为止, 还没有更新对 Steam 云存档的支持. 在他们1月19日发布的“进化的伊卡洛斯” FAQ中里提到他们“仍然在研究云存档部分的功能”. 那如何在官方支持发布前实现云同步存档呢? 用 Dropbox 和符号链接就能做到.

这里假设所有需要同步存档的电脑都有安装 Dropbox 客户端, 并且 Dropbox 同步的文件夹放在了 %HOMEPATH%\Dropbox 目录里.

第一步, 先找到游戏的存档在硬盘里存在哪里了. 对于戴森球计划, 它的存档默认放在了 %HOMEPATH%\Documents\Dyson Sphere Program 里. 对于其他游戏, 默认的存档路径可能会不一样, 除了像戴森球计划一样放在Documents里, 也有可能在 AppData (%HOMEPATH%\AppData\)里. 注意, AppData是个隐藏文件夹, 如果在任务管理器里找不到, 可以在”查看”菜单里把显示“隐藏的项目”勾选上.

第二步, 把装有存档的文件夹移动到 Dropbox 里去. 这里记得先做好备份, 不要因为误操作丢失了存档. 我在 Dropbox 里新建了一个文件夹 Game Saves, 用来存放我所有用 Dropbox 同步的游戏存档.

第三步, 用mklink创建一个从之前的存档保存路径指向 Dropbox 里的新存档保存路径的符号链接. 这里要用管理员身份打开 Windows 命令提示符, 才能有足够的权限. 按下 Windows 键, 输入 cmd, 如下图所示, 在右边的菜单里选择”以管理员身份运行”.

Screenshot of cmd run as admin

在管理员命令提示符窗口里, 输入 mklink /D "%HOMEPATH%\Documents\Dyson Sphere Program" "%HOMEPATH%\Dropbox\Game Saves\Dyson Sphere Program" (假设你和我一样是把存档放在 Dropbox 的 Game Saves 文件夹里, 如果不是的话请自行替换目标路径). 如果成功的话, 会提示符号链接创建成功.

好了, 至此就已经成功地让本地的游戏存档同步到 Dropbox 上了. 之后, 对于每一台想要用 Dropbox 同步游戏存档的电脑, 只需要把它们本地的存档目录替换成指向 Dropbox 同步目录的符号链接即可. 具体来说, 就是把它们本地的 %HOMEPATH%\Documents\Dyson Sphere Program 目录删除(如果有想要保留的存档, 请自行备份), 然后执行上面的第三步, 创建一个指向 Dropbox 的符号链接就可以了.

2020年的最后一笔流水账

一转眼无比漫长的2020年已经接近尾声了, 去年的在西班牙的度过的圣诞假期仿佛就是昨天的事. 在2020年12月31日, 让我在这个已经凉凉的blog里, 记下今年最后一笔流水账.

出国8年多了, 常常被人问起来自哪里. 但当我说是武汉人的时候, 几乎每个人都会接着问”武汉在哪”. 相信今年之后, 我再也不用解释说武汉在北京的南边, 上海的西边, 是长江沿岸的一座大城市了. 就是万万没想到, 我的家乡是以这样的方式再次闻名于世的.

年初的时候, 看着各种真真假假的关于武汉的新闻, 每天都焦虑得不行. 心理医生建议我找点别的事情做, 分散一下注意力. 豆皮, 一只蓝陨石色的边牧, 出色得完成了任务. 从2月2日接回家到现在, 已经快一年了. 从天天调皮捣蛋和老父亲斗智斗勇, 到后来可可爱爱坐在沙发上陪我打游戏, 豆皮长大了许多. 希望未来的每一天, 你都能健健康康, 开开心心!

 

View this post on Instagram

 

A post shared by Doupi The Collie 豆皮 (@doupi.dog)

在 GameShell 上玩仙剑奇侠传

Update (2019-10-08): 之前一个版本的命令完全不能用, 因为写文章的时候我已经基本把游戏都设置好了, 那些命令其实是我想出来觉得应该可以用的. 但我今天不小心把 GameShell 的文件系统弄坏了, 不得不重新刷系统 image, 才发现真的错的很离谱. 现在是更新后的版本, 在 v0.4 image 上亲测可用.

最近入手了一件新玩具 GameShell - 一款外形像 GameBoy, 系统基于 Linux 定制的高可玩性掌机.

GameShell 开箱时和高达模型一样, 零件需要自己用模型剪钳从板件上剪下来, 然后自己动手组装起来才能玩. 组装过程并不复杂, YouTube 上可以找到很多组装视频教程. 需要注意的是好多零件的水口又宽又厚, 不太好处理. 不过就算是我这种模型新手, 拼出来的成品看着质量也还过得去.

言归正传, GameShell 自带的系统 image 里已经装了 GBA, SFC 和 PS 的模拟器. 这些模拟器核心都是通过 RetroArch 加载的. RetroArch 是一个支持多种模拟器核心的前端框架, 功能十分强大. RetroArch 里自带的核心加载器可以直接从网上下载安装各种后端, 而这其中就包括 DOSBox. 当我看到这里, 脑海中闪过的第一个念头就是 – “那不是可以用来玩仙剑奇侠传了?!”

在开始之前, 请一定把 clockworkOS 更新到 v0.3 v0.4! 新版的系统支持 Lima 显卡驱动, 能显著提高系统性能, 降低 CPU 使用率和耗电. 刷机可以用 balenaEtcher, 过程十分傻瓜. 要先刷机再设置的原因是, 刷机之后, 整个 tf 卡的文件系统都会被覆盖, 之前所有的设置都得重新来过.

首先, 要在 RetroArch 里下载 DOSBox 的核心. 把 GameShell 连上 Wi-Fi 后, 从菜单里打开 RetroArch. 在菜单里先选择 Online Updater => Update Core Info Files 更新模拟器核心的索引文件. 然后回到 RetroArch 的主菜单, 选择 Load Core => Download Core…, 找到 DOS(DOSBox), 选择下载. DOSBox 核心就下载好了.

然后, 要去准备一份仙剑奇侠传 DOS 版的文件. 这里请大家自行 Google. 这里假设游戏在本地的路径是 ./Pal95.

最后, 要把仙剑奇侠传复制到 GameShell 里, 并创建启动游戏的菜单项. 回到 GameShell 的目录里, 打开 TinyCloud. 这里可以看到 GameShell 在本地局域网里的 IP 地址(后面的命令里假设这里的 IP 地址是 192.168.1.123), 和GameShell 默认用户的用户名和密码 (都是 cpi).

先把仙剑奇侠传 DOS 版复制到 GameShell 的系统里:

ssh cpi@192.168.1.123 'mkdir -p ~/games/DOSBOX/Pal95/' && scp -r ./Pal95 cpi@192.168.1.123:'~/games/DOSBOX/'

再创建一个启动游戏的菜单项, 并复制到对应的目录下:

mkdir -p ~/apps/Menu/21_Indie\\ Games/20_Pal && echo \'#!/bin/bash\nretroarch --verbose -L ~/.config/retroarch/cores/dosbox_libretro.so ~/games/DOSBOX/Pal95/PAL!.EXE\' > ~/apps/Menu/21_Indie\\ Games/20_Pal/Pal.sh'

回到 GameShell 主菜单, 选择”重载菜单”, 在主菜单重新加载之后, 就可以从 Indie Game 里找到 “Pal” 并进入仙剑奇侠传了. 进入游戏前, 记得去 GameShell 的系统设置里, 选择 Lima 作为 GPU 驱动.

至此, 应该已经可以在 GameShell 里加载仙剑奇侠传了. 但我发现在默认的设置下, 动画的部分会有卡顿的感觉, 模拟器也会时不时死机. 解决的办法是在主机上按 Shift + MENU 键进入 RetroArch 的菜单, 进入 Options => CPU cycle multipler, 把默认的 100 改成 1000, 再把 CPU cycles 改成 3. 然后在同一级菜单里选择 Save Game-options file 把设置保存下来.

最后, 在 RetroArch 的菜单里选择 Controls, 可以调整 GameShell 按键如何映射到游戏里的按键. 要调整的是先把 User 1 Device Type 设置成 Keyboard + Mouse, 把方向键映射到对应的键盘方向键, A 键映射到 Space, B 键映射到 Escape, 就可以实现方向键走路, A 键确定, B 键返回的基本设定了. 同样记得在设置完成后选择 Save Game Remap File 把设置文件保存下来. 下面是我设置好之后的 remap file 内容, 你也可以选择把它传到 GameShell 上去, 在 RetroArch 里直接加载.

input_libretro_device_p1 = "3"
input_player1_key_a = "32"
input_player1_key_b = "27"
input_player1_key_down = "274"
input_player1_key_left = "276"
input_player1_key_right = "275"
input_player1_key_up = "273"

好久没写过 blog 了, 如果整个过程中有什么问题, 欢迎留言提问.

复活

aifreedom 的博客又复活了.

7 年间这个博客一直疏于维护, 虽然域名和服务器都还在, 但内容却停留在了 2011 年. 在这个每天都有无数朋友圈新状态可刷的年代, 一个 7 年都不更新的网站大概只有一个下场 – 没人再订阅了.

“订阅”这个词在现在听起来也是那么得过时. 2008年刚创建这个博客的时候, 我还写过一篇文章教大家如何订阅 RSS. “RSS” 这个词现在应该也没人再用了. 看看 Google Trend 就会发现, 其实这个词从 2006 年就开始走下坡路了. 当时用来订阅博客的 Google Reader, 已经在 2013 年因为用户越来越少而被关停.

虽然有 Feedly 这样的替代产品出现, 但取代”在Google Reader上订阅”的, 是”在朋友圈/微博/Twitter/Facebook上关注”. 生活的节奏越来越快, 碎片化的信息不论是生产还是消费都更容易. 今天我无意探讨信息的碎片化是好是坏, 不过它确实让我变懒了.

如果在 Facebook 上花 3 分钟写的东西就能拿到十几条评论和几十个赞, 那在博客里画上一两个小时字斟句酌写一篇只有几条评论的文章就显得那么的”划不来”. 不过从更长远的角度来看, 认认真真写出来博客对自己却更有益处. 所有的职业规划建议里都会说, 写一份技术博客对未来的发展大有裨益. 因为它能让你总结自己的知识, 扩大自己的圈子, 还能建立自己的品牌.

这么多年没写新的博客文章的另一个原因, 是我越来越觉得我写出来的东西要么是所有人都懂的大白话, 要么是在不懂装懂瞎bb. 读自己之前写的东西总觉得幼稚, 偶尔还能发现一些错误. 但反过来想的话, 这也说明我自己有了进步, 能看出曾经的自己有哪些问题. 这也算是写博客的好处之一了!

最后, 预告下会更新的内容. 准备写的第一个系列是关于”智能家居”的, 会讲讲我选择的智能家居平台, 搭配的硬件, 安装的心得(教训), 还有自己开发的插件. 不出意外的话, 这个系列会从 2018 年一直写到 2019 年.

敬请期待.

复活节闲扯:一场激动人心的数学公开挑战赛

本文发表于果壳网 – guokr.com, 转载请注明出处. 商业使用请联系果壳网.

最速降线问题

“想象一个小球,仅受重力,从点 A 出发沿着一条没有摩擦的斜坡滚至点 B。怎样设计这条斜坡,才能让小球在最短的时间内到达点 B?”

这个在数学史上被称为“最速降线”的知名问题,最早是由著名的意大利科学家伽利略(Galileo Galilei)于 1630 年提出来的。他在研究后认为最速降线应该是圆弧,但可惜的是这个答案并不是正确的。时间又过了 60 多年,1696 年 6 月,来自瑞士巴塞尔(Basel,这座城市不仅是数学世家伯努利的故乡,也是欧拉的故乡,有一个由欧拉解决的著名数论问题就是以这座城市命名的)的约翰・伯努利(Johann Bernoulli)在《教师学报》(Acta Eruditorum)上又重新提出这个问题,并向全欧洲的数学家提出公开挑战。这个别出心裁却又十分容易理解的问题吸引了当时全欧洲的数学家,而最后给出了正确解答的人也都是数学史上赫赫有名的巨人。这也让这次挑战成为了数学史上最激动人心的一场公开挑战。

LaTeX 宏包小记 (2): listings

本文及所附代码, 文件在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

新年第一篇 post, 祝所有的读者新年快乐(只是不知道这么久都没有更新, 是否还有读者). 去年一年严格地说只写了2篇日志, 新年赶紧补上一篇吧.

这个 \LaTeX 宏包的介绍系列我会坚持把它写下去. 很高兴地看到周围有更多的同学和老师(对, 最新见到几位听说/用过 \LaTeX 的老师了), 这让我有更大的兴趣和信心继续介绍和普及 \LaTeX 的知识了.

再次警告: \LaTeX 是一个较难上手的软件, 而且在熟悉后可能会使你成为一个完美主义者并再也不愿意使用 Microsoft Word.

言归正传, 为 \LaTeX 实现代码高亮的宏包不可谓不多, listings 是我比较熟悉和常用的一个. 这里稍稍总结一下 listings 常用的参数, 更多的配置选项可以在它的手册里查到.