Jekyll2024-03-21T09:54:49+08:00/atom.xmlMayx的博客Mayx's Home Pagemayx如何用requests库验证证书2024-03-16T00:00:00+08:002024-03-16T00:00:00+08:00/2024/03/16/ssl-pinning<p>用Python制作的程序怎么样?<!--more--></p>
<h1 id="起因">起因</h1>
<p>之前在抓包某些APP的时候,可能会遇到即使信任了抓包软件的CA根证书也无法抓包的情况,听说之所以遇到这种情况是因为那些APP使用了“SSL Pinning”的技术,可以只信任代码中认为可以信任的证书。不过对于逆向之类的事情我并不擅长,这种问题我也不太会解决。但是不能解决问题我可以创造问题啊,Java的APP我不会写,但是我会用Python写,所以今天来看看怎么样用Python实现类似“SSL Pinning”的技术。</p>
<h1 id="实现方案">实现方案</h1>
<p>真正的SSL Pinning似乎是通过预置网站所使用的根证书或者中间证书来实现的,这样的好处是即使证书到期换了证书也能继续验证。不过我觉得其实没必要这么麻烦,一般Python程序要连接的后端也没必要在浏览器中调用,大不了就自签一个证书,然后自己验证证书就好了,反正中间人攻击重新签的公钥证书的指纹肯定和原来网站公钥证书的指纹不一样,用这一点就可以判断有没有被抓包。 <br />
不过我搜了一下,如果想实现这个功能,首先请求的时候就要获得网站的证书,很多资料都是直接用socket和ssl这两个包实现的,但是在python上请求一般都是用requests,用socket操作有点太麻烦了吧,再问问AI呢?AI给出的回复是:<code class="language-plaintext highlighter-rouge">response.raw.connection.getpeercert()</code>,结果执行了根本没有这个方法,不愧是只会东拼西凑,这应该是ssl库的函数吧……要么可以用<code class="language-plaintext highlighter-rouge">urllib3.contrib.pyopenssl.ssl.get_server_certificate()</code>这个方法获取,但是这个方法不是在发起请求的时候获取的证书,而是直接先访问了一下服务器然后直接获取的证书,这样每次调用接口的时候可能就要请求两次服务器了,感觉不怎么好……后来去Stack Overflow上搜了一下,还真有关于类似这个问题的<a href="https://stackoverflow.com/questions/16903528/how-to-get-response-ssl-certificate-from-requests-in-python">讨论</a>,于是我简单改编了一下,最终效果如下:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">import</span> <span class="nn">hashlib</span>
<span class="n">HTTPSConnection</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">packages</span><span class="p">.</span><span class="n">urllib3</span><span class="p">.</span><span class="n">connection</span><span class="p">.</span><span class="n">HTTPSConnection</span>
<span class="n">orig_HTTPSConnection_connect</span> <span class="o">=</span> <span class="n">HTTPSConnection</span><span class="p">.</span><span class="n">connect</span>
<span class="k">def</span> <span class="nf">new_HTTPSConnection_connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">orig_HTTPSConnection_connect</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">peer_certificate</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">sock</span><span class="p">.</span><span class="n">getpeercert</span><span class="p">(</span><span class="n">binary_form</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">AttributeError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">HTTPSConnection</span><span class="p">.</span><span class="n">connect</span> <span class="o">=</span> <span class="n">new_HTTPSConnection_connect</span>
<span class="k">def</span> <span class="nf">verify_cert_request</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
<span class="k">with</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">r</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">r</span><span class="p">.</span><span class="n">raw</span><span class="p">.</span><span class="n">connection</span><span class="p">.</span><span class="n">sock</span><span class="p">.</span><span class="n">getpeercert</span><span class="p">(</span><span class="n">binary_form</span><span class="o">=</span><span class="bp">True</span><span class="p">)).</span><span class="n">hexdigest</span><span class="p">(),</span> <span class="n">r</span><span class="p">.</span><span class="n">text</span> <span class="p">]</span>
<span class="k">return</span> <span class="n">result</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">verify_cert_request</span><span class="p">(</span><span class="s">'https://www.baidu.com'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">][:</span><span class="mi">10</span><span class="p">])</span>
</code></pre></div></div>
<p>用这个代码就能获取到请求的网站中证书的指纹了,如果不希望其他人抓包,先自己计算一下自己证书的hash指纹,然后在代码中执行逻辑的时候先判断一下请求网站的指纹是不是自己网站的指纹,如果不是还可以考虑一下反制措施?这样就能实现证书的验证了。</p>
<h1 id="后记">后记</h1>
<p>不过Python作为解释型语言,代码不是随便看😂?就算用Cython然后加壳啥的调用的库依然不是加密的,大不了修改依赖的库然后让它返回的结果向正确的凑可能也行?不过这样至少能防止绝大多数抓包的人了。</p>mayx用Python制作的程序怎么样?Luckfox Pico Plus使用体验2024-02-24T00:00:00+08:002024-02-24T00:00:00+08:00/2024/02/24/luckfox<p>开发板还是越小越好啊<!--more--></p>
<h1 id="起因">起因</h1>
<p>前段时间,银行送了我一张满50减50的淘宝不限品类优惠券,但是我一时半会没想好买什么。不知道怎么的就想起在Bilibili上看到的微型开发板Luckfox Pico系列,当时看了视频觉得挺有意思的,这次既然有机会了就可以买一个了吧……不过有这钱去买箱牛奶不好吗🤣。 <br />
最终买的Luckfox Pico Plus开发板,当时的价格是52CNY,加了8CNY的运费,然后用券抵完就是10CNY了。价格看上去挺不错的,不过相比之下还是不如随身WiFi便宜,那个正常买好像也才10CNY,而且整体性能也要比这个好很多,还能用WiFi联网……不过既然买了就玩玩呗,看起来也挺有意思的。</p>
<h1 id="使用体验">使用体验</h1>
<p>从外观来看,整体大小只有一根食指大,因为选了带RJ45接口的板子所以其实不算特别小,而且背面甚至没有焊元件,其实它的SOC RV1103只有不到小拇指指甲盖的大小,很难不相信它其实还能做的更小。</p>
<h2 id="安装系统">安装系统</h2>
<p>刚买来的时候里面有预装的测试系统,不过测试系统几乎把里面的空间都占满了,肯定是不能用的,我去看了看<a href="https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-quick-start">官方的Wiki</a>,官方有提供编译好的BusyBOX、Ubuntu、buildroot以及Alpine Linux,也有可以自己编译的SDK。对我来说我也不愿意整麻烦的事情,所以肯定会选编译好的,至于系统也肯定要有软件包管理器的,另外因为这个开发板只有64MiB的内存和128MiB的存储(虽然可以插TF卡,但是内存还是没法加),系统也不能太大,所以就只有Alpine Linux可以选了。我之前<a href="/2022/03/12/alpine.html">在虚拟机里测试过Alpine Linux</a>,体验还是挺不错的。 <br />
安装方法也很简单,<a href="https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-Alpine-Linux-1">官网的Wiki</a>有详细的说明。不过有一些不太一样的地方,我没有USB转UART串口模块,我有的只是树莓派。所以烧录完系统之后的改密码以及配置网络的过程就得用树莓派来做了,其实这体现了一下树莓派的作用,至少那堆GPIO接口不是当摆设的🤣。用法的话就是首先刷一个树莓派的官方系统到树莓派上,然后在配置里打开UART并关掉树莓派的串口登录,按官网的图接三根线,只要是导线就行,对树莓派来说应该是第8和第10脚分别是RX和TX,第6脚有一个地线,依次接到开发板上,在终端里安装screen,使用<code class="language-plaintext highlighter-rouge">screen /dev/serial0 115200</code>,就可以登录开发板的终端了,如果连接有问题可能是RX和TX接反了,反过来重新插一下就行。之后改密码以及配置网络就很简单,配置好之后连上网线就可以正常使用了。 <br />
不过这个系统有个缺陷,没有配置TF卡,这还是挺重要的,回头有时间可能还是得编译个能使用TF卡的Alpine Linux,或者看看官方愿不愿意编译一个?</p>
<h2 id="使用软件">使用软件</h2>
<p>安装好系统之后就可以用SSH连接了。首先试了一下安装软件,Alpine Linux的软件包管理器apk用法和apt的用法差不多,而且源里的软件也非常多,安装了个Python3试了一下,没有任何问题,安装好pip之后安装python包也没有问题,这样就可以运行我用python写的一些定时任务了。另外我又下了一个<a href="https://github.com/Mrs4s/go-cqhttp">go-cqhttp</a>搭了个机器人试了一下,居然也能正常运行,看来64MiB的内存还可以啊,跑些软件还是绰绰有余的,这么看来的话就可以替代掉我的树莓派了,反正我的树莓派平时除了网口其他的口都没用,运行些定时任务或者QQ机器人又觉得利用的性能太少了,而且很明显的是这个东西显然比树莓派的能耗要小的多,挂在家里挺合适的,不过缺陷可能就是如果哪天我想整个<a href="/2022/03/27/radio.html">电台</a>,树莓派的GPIO接口还能派上用场,这个Luckfox Pico Plus的GPIO可能除了最开始装系统的时候用了一下,之后就再没有用了。 <br />
另外作为在家里装的开发板,内网穿透也是需要的,但是装了个go-cqhttp之后内存就剩下30MiB了,还要考虑定时任务运行时也要用掉一些内存,用frp肯定不太合适,但是用ssh的话又容易断,我想了一下干脆折中一下用autossh吧,如果断了也能自动重连。</p>
<h1 id="感想">感想</h1>
<p>感觉作为开发板,Luckfox Pico Plus相比树莓派来说用途差不多,而树莓派的定位却不太准确,又想当开发板,又想当普通PC,结果作为开发板价格有点贵,尺寸有点大,功耗也有点高;作为PC性能过差,啥也干不了;作为NAS接硬盘也接不了几块,才两个USB3.0口,还要另外接供电,属实是比上不足,比下有余。这款产品我倒是觉得挺不错的,主要是颜值比较吸引我😆,其实还有和这个一样芯片的另外一个开发板,更便宜还带WiFi模块,但是相比之下还是这个好看,所以如果想整开发板我觉得Luckfox Pico Plus比树莓派更合适。</p>mayx开发板还是越小越好啊如何离线安装1Panel2024-02-03T00:00:00+08:002024-02-03T00:00:00+08:00/2024/02/03/1panel<p>Go写的程序感觉离线使用还挺方便的<!--more--></p>
<h1 id="起因">起因</h1>
<p>为了更好的管理服务器,我之前用过几种面板,比如宝塔,小皮,appnode还有<a href="https://github.com/1Panel-dev/1Panel">1Panel</a>之类的,之所以用面板主要还是觉得这种用起来方便一些。有些脑子不合适的人看不起使用面板的人,他们可能用了比如软件包安装,或者源码编译、容器等等,结果一顿操作猛如虎,结果配置还是安装默认的,连调优都没做🤣。 <br />
总之最近正好需要在不能连接互联网的地方安装LEMP的环境,虽然现在的面板很多,但是似乎很少有面板支持离线安装。宝塔好像有付费的离线安装服务,但是我首先不信任宝塔,另外怎么可能给他们付钱呢😆?1Panel虽然官方不支持离线安装,但是社区中有离线安装的方法,不过好像不能使用网站管理的功能……当然经过我的测试,其实是有办法可以使用网站管理的功能,所以分享一下方法。</p>
<h1 id="离线安装1panel的方法">离线安装1Panel的方法</h1>
<p>一般想离线安装的话搜到的文章应该就是<a href="https://bbs.fit2cloud.com/t/topic/386">这篇文章</a>了吧,看起来操作有一点点复杂,不过评论里有个人整了个可以离线安装的<a href="https://github.com/wojiushixiaobai/1Panel-installer">项目</a>,使用起来非常简单,连docker也一起安装了。只是使用的时候稍微有一点点坑,就是它的“–install-dir”参数默认是“/opt/1panel”,但是安装的时候会在这个目录里再建一个1panel文件夹,所以在使用的时候最好手动把参数设置为“–install-dir /opt”。 <br />
安装没什么问题,不过应用商店是空的,什么软件都安装不了,我在社区论坛里找了一下,好像可以把在互联网端1Panel实例中“/opt/1panel/resource/apps/remote”中的文件拷到离线设备中的“/opt/1panel/resource/apps/local”下,然后点更新就可以了,我试了一下确实可以,把镜像导出来再导入到离线设备,直接安装可能会报错,但是重建一下容器就能正常启动了。虽然容器是启动了,但是面板好像没识别到,还是不能管理,而且应用的文件被放在了“/opt/1panel/apps/local”目录下,就算能识别到,文件路径也是错的。看来得让面板认为导入的程序不是本地安装的,而是在线安装的。</p>
<h1 id="离线安装1panel中应用的方法">离线安装1Panel中应用的方法</h1>
<p>我在网上怎么搜,都没有找到现成的解决方法,看来只能我自己研究了😂。我找了一下,面板安装目录下有一个“/opt/1panel/db/1Panel.db”文件,应该是面板的数据库,我用sqlite3客户端打开看了一下,里面的apps表中可以看到应用被导入了,但是key在前面都被加了local,比如openresty变成了localopenresty,我对比了一下互联网端的数据库,除了这一处外,还有resource字段的内容也从remote变成了local。既然是这里有不一样的地方那就把它改成一样的呗,另外这里的字段名既然叫resource,那么肯定和那个目录也有关系,所以就得把“/opt/1panel/resource/apps/local”文件夹下的内容再全部移动到“/opt/1panel/resource/apps/remote”中,把数据库上传然后重启,离线环境中的1Panel也能正常识别了,而且安装后网站标签页也能正常创建网站之类的操作了。 <br />
Nginx(openresty)和MySQL这样安装都没啥问题,但是PHP出现了点问题,因为1Panel的PHP会在线下载扩展来构建镜像的,不是直接使用镜像创建的容器,所以安装会报错。不过既然能看到数据库,我发现有个runtimes表记录了PHP的状态,那么我把状态改成normal就可以了吧,试了一下还真行,改完上传然后重新导入容器,PHP也正常了。另外需要注意的是从互联网端导出的镜像名字和版本必须和离线端一样,不然可能识别不到,至于扩展啥的在互联网端选择好就可以了,离线端不需要修改。 <br />
所有操作完成之后试了试创建网站以及和PHP的连接之类的都可以正常使用了,就可以在内网环境下完全发挥1Panel的能力了。</p>
<h1 id="感想">感想</h1>
<p>无论是Docker还是1Panel,能这么简单的在离线环境下安装我想可能是因为它是Go写的程序吧,能无依赖,静态编译的程序在没网的情况下还是方便啊……另外就是Docker果然也是离线使用的利器,想安什么在互联网准备好直接拿到离线端就能用,真是方便啊。</p>mayxGo写的程序感觉离线使用还挺方便的如何在macOS上玩基于Ren’Py的视觉小说2024-01-20T00:00:00+08:002024-01-20T00:00:00+08:00/2024/01/20/renpy<p>跨平台的游戏移植起来就是简单啊<!--more--></p>
<h1 id="起因">起因</h1>
<p>最近我在玩<a href="https://store.steampowered.com/developer/WingedCloud/">Winged Cloud</a>出的视觉小说,他们家出的视觉小说画风都很不错,比很多其他同行画的好看,另外长度一般都很短,大概1-2个小时就能看完,很适合下班之后闲了看一部,不过我现在已经换了MacBook,要怎么玩呢?他们家的视觉小说基本上都是用的Ren’Py引擎开发的。Ren’Py引擎的游戏本身其实原生就是跨平台的,但是也许是因为我是直接从互联网上下载的,macOS会有些验证之类的?直接运行.app结尾的文件是没办法打开游戏的,双击会显示应用程序无法打开……那该怎么运行呢?</p>
<h1 id="玩法研究">玩法研究</h1>
<h2 id="使用ios版的renpyviewer">使用iOS版的RenPyViewer</h2>
<p>不过看看之前<a href="/2023/10/21/game.html">我在MacOS上玩游戏的经验</a>,对于Apple芯片的Mac来说,可以下载<a href="https://apps.apple.com/us/app/renpyviewer/id1547796767">RenPyViewer</a>来玩。只是经过我的测试发现,RenPyViewer能玩的游戏很有限,因为它内置的Ren’Py引擎版本是7.5.3的,如果游戏用的Ren’Py引擎和这个版本相差不大,或者没有用到新版的特性之类的倒是能正常运行,我试了一下Sakura MMO系列、Sakura Gamer系列等都能正常运行,但只要运行游戏Ren’Py的版本过高或者过低的游戏都会报错,尤其像新出的基本上都是8.0以上的版本了,Python的版本也从2换成3了,显然用RenPyViewer肯定是没法运行的。</p>
<h2 id="使用intel-macos版的renpyviewer">使用Intel macOS版的RenPyViewer</h2>
<p>其实在我发现iOS版的RenpyViewer不能运行一部分Ren’Py游戏之后,我又去搜了一下,在知乎上找到了iOS版的RenPyViewer作者发的文章,介绍了<a href="https://zhuanlan.zhihu.com/p/477696534">macOS如何游玩Ren’Py引擎游戏</a>,其中包含了他为macOS做的RenPyViewer,不过我下载看了一下是Intel版的……不过也许这个里面用的引擎更新一点,一部分iOS版不能玩的这个版本就可以玩。</p>
<h2 id="使用终端运行">使用终端运行</h2>
<p>但毕竟前面两个方法内置的引擎版本是固定的,能玩的游戏也很少,看来得想个通用的办法,毕竟Ren’Py游戏在发行的时候是支持macOS的啊。所以我又看了看,Ren’Py开发的游戏发行之后一般在游戏文件夹里有一个.sh的文件,看起来应该是给Linux系统运行使用的,但是macOS也可以运行.sh的文件啊,所以我就直接在终端运行了它,结果macOS和Linux不一样的地方是所有从网上下载的可执行文件都必须签名,不然就会报移到废纸篓之类的错,关于这个问题,我看网上说的好像是执行<code class="language-plaintext highlighter-rouge">xattr -r -d com.apple.quarantine <path></code>就可以,不过后来我也忘了是出什么问题,最后是手动一个一个给每个可执行文件加的权限,最终倒是也运行起来了。</p>
<h2 id="手动修改app文件">手动修改.app文件</h2>
<p>不过每次运行要是用终端那不是很麻烦嘛,另外既然游戏里面明明有.app的文件,为什么会运行不了呢?后来我看了看,发现Contents/MacOS文件夹下的文件并没有可执行权限,我猜可能是和这个有关系?加了可执行权限之后倒是没有报应用程序无法打开的错了,但是还是不能运行,点开之后在Dock栏跳了几下就消失了……然后我就去看了下那个可执行文件,发现就是一个Shell脚本(后面的版本换成可执行文件了)里面定义了几个ROOT变量,一个是和脚本同级的目录,一个是和.app同级的目录,还有一个是Contents/Resources/autorun目录,这么看来正常情况下因为游戏是跨平台的,游戏肯定不会在.app里面,在外面的话……看现在macOS权限管的这么严格,让它读取.app外面的文件估计不太行,肯定只能读取.app里面的文件,至于Intel macOS版的RenPyViewer我看了一下好像原理差不多,是把游戏目录用软链接映射过去的,所以才能在不直接获取.app外面的文件下运行。之后我又参考了一下其他直接在macOS发行的Ren’Py游戏,感觉也差不多。所以解决方法也很简单,要么把游戏文件放到Contents/Resources/autorun目录下,要么做个软链接放过去,我觉得单个.app管理起来会方便一些,所以就直接把游戏文件全部移动进去了。试了一下,总算可以正常运行了。而且多试了几个,基本上都没有问题。 <br />
但有些Ren’Py游戏连.app都没提供,我不知道SDK默认生成分发版的时候会不会包含macOS上用的.app文件,不过也有可能是发行的时候只针对Windows所以删掉了,对于一些非官方汉化版很有可能是汉化的人给删掉了。对于这种情况,可以先搞清楚这个游戏使用的Ren’Py版本,然后去Ren’Py官网下载对应版本的SDK,把SDK中的renpy.app复制出来,然后按照上面的方法把游戏拷进去就可以正常运行了。 <br />
另外macOS上还有一些坑,比如说Windows的文件名是不区分大小写的,但是macOS是区分的,有时候他们写脚本的时候文件名和程序里可能有些比如CG之类的大小写不一致,结果图片不能正常加载,这种情况就只能用unrpa解包然后把对应的图片名改成正确的才能运行了,当然Ren’Py提供了忽略错误的功能,但是不知道为什么只有英文模式下有,中文下就没有……这种情况还得先切换到英文才行。</p>
<h1 id="总结">总结</h1>
<p>总的来看,以后如果想在macOS上玩Ren’Py游戏,优先应该用游戏自带的.app最好,把Contents/MacOS下的文件添加可执行权限,然后把文件全部移动到Contents/Resources/autorun下。不过旧版的Ren’Py基本上都是只有x86_64的可执行文件,新的才有两种都支持的,如果是用的Apple芯片的Mac,最好先看看可执行文件是不是通用的,如果不是优先应该先试试iOS版的RenPyViewer,毕竟原生运行肯定要更省电一些,如果不能运行再用上面的办法。</p>mayx跨平台的游戏移植起来就是简单啊年终总结2024-01-01T00:00:00+08:002024-01-01T00:00:00+08:00/2024/01/01/summary<p>接下来,就是长跑的时间了……<!--more--></p>
<h1 id="2023年过的怎么样">2023年过的怎么样?</h1>
<p>至少今年我顺利毕业了,而且也有一份还可以的工作能让我赚点钱,比年初的预期已经好了很多,从总体上来看还算不错吧,另外还有一个很重要的原因就是我早晨抽卡抽到UP角色了😂,所以状态还可以。 <br />
不过从我写博客的次数可以看出来,今年我探索新事物的动力也不怎么高了,其实吧我的工作也不怎么忙,算是965的程度,平时也没什么加班之类的,但我每次回到住所之后就只会躺在床上看看视频和打游戏(视觉小说)而已,而且经常就玩到很晚,导致我晚上睡觉的时间还很短,可能也就6个小时多。也就是说我平时我晚上玩的时间可能就要7个小时多了。另外这对我的影响还是挺大的,最近我在玩osu!mania,前段时间我打的水平应该算越来越好吧,但是最近脑子不太好使了,打的效果越来越差了,还有最近幻视(看错字)的情况比之前发生的概率高了不少,还挺令我头疼的…… <br />
不过这可能和我未来的打算差不多,我本来就想在赚够我一个人一辈子花的钱之后就不再继续工作了,不过要是到那个时候我还是像现在这样黑白颠倒,不能好好吃饭的话可能一辈子也花不完我赚的那些钱🤣。 <br />
不过总的来说可能就是因为我没啥照顾自己的能力吧,所以说明明是挺不错的环境但是过的就像那些997的人一样🥲……像这种问题还是应该考虑解决一下才行。 <br />
至于在2023年发生的事情倒是还挺多的,令人印象最深刻的大概就是AI了吧,自从ChatGPT出了之后各行各业都开始搞LLM了,而且正是因为LLaMA这种东西的出现,国内的AI才会五花八门吧,只是LLM对我的影响可能还是不太大,后来发现大多数问题我自己就能解决,我解决不了的问题问它也没法解决,而且需要我写文案的时候很少,大多数情况并不需要生成一堆废话。</p>
<h1 id="未来的打算">未来的打算</h1>
<p>就和上面提的一样,我的目标就是赚够我一个人一辈子花的钱,所以接下来的日子很可能会是一成不变的,工作日上班,下班了玩电脑,休息日睡觉,节假日回家了🤣,而且未来的10年里很可能都是这样,没有更多的计划了。 <br />
但是看环境我猜应该会比往常有更多不可预料的情况吧,最近在这个世界上各种各样的事情越来越多了,我想接下来的一年里可能会有更多情况发生,说不定就是世界末日呢😆,至于会不会影响到我可能也只能到时候才知道了吧,不过对我来说最好还是别发生对普通人影响特别大的事情,比如手头的钱全变成废纸啥的,如果真出现那种情况,最好能提前发现然后全部转成黄金或者USDT之类的最好吧,如果没有这样做的话……反正大家的起点可能就差不多了吧,不知道到时候会发生什么样的事情。</p>
<h1 id="总结">总结</h1>
<p>总的来说,过去一年里倒是没那么差,至于未来会更差还是更好也很难说,至于过去的一年里到底发生了什么我也记不太清了,现在的我只能说一些没什么营养的废话填充这篇文章了🤣。</p>mayx接下来,就是长跑的时间了……如何在Linux容器内运行Android?2023-12-24T00:00:00+08:002023-12-24T00:00:00+08:00/2023/12/24/android<p>原生运行Android肯定比虚拟机好!<!--more--></p>
<h1 id="起因">起因</h1>
<p>前段时间我在树莓派上安装了<a href="/2023/12/10/openfyde.html">openFyde</a>,后来发现原来它的ArcHero安卓子系统是基于anbox开发的,和ChromeOS的安卓子系统有一些区别,至于区别在哪我也不是特别清楚。不过既然它的安卓子系统和Linux直接安装的没啥区别,那不如我试试看在普通的Linux上安装容器化的安卓系统效果怎么样?</p>
<h1 id="试用waydroid">试用Waydroid</h1>
<p>最开始我测试的是<a href="https://github.com/waydroid/waydroid">Waydroid</a>,因为听说anbox的升级版就是Waydroid,据说性能比anbox强,所以想试试看,安装挺简单的,执行个脚本之后用apt就能安装。不过我的测试平台是Ubuntu Server 20.04LTS,Waydroid之所以叫这个名字是因为它要基于Wayland显示服务器运行,可我是无界面的系统要怎么用它啊?Waydroid好像没有无头模式这种东西,不过我搜了一下weston实现了Wayland协议而且支持无头模式,用法也很简单,安装好weston之后执行<code class="language-plaintext highlighter-rouge">weston --backend=headless-backend.so</code>就可以了。 <br />
不过默认安装好的Waydroid不能运行ARM架构的程序,似乎是因为libhoudini之类的库是有版权的,所以不能直接集成,不过还好有人开发了一个<a href="https://github.com/casualsnek/waydroid_script">工具包</a>,可以给Waydroid安装包括libhoudini在内的多个因为版权等原因不能直接在项目里使用的程序,而且操作起来也很简单,体验还不错。 <br />
至于怎么查看界面,因为是无头模式启动的所以没有界面,只能通过adb查看,不过我试了一下scrcpy不知道为什么不能用,但是用Airtest就能看到界面,就挺奇怪的……还有就是分辨率很低,不过这个应该改weston的启动参数就可以改分辨率了吧,但因为后来发现Waydroid不能开多个实例感觉有点废物就没有在继续研究了。 <br />
不过总的来看,如果是在桌面版的Linux上,而且界面是使用Wayland协议的效果应该会比较好,好像Ubuntu22.04以上的系统默认会使用Wayland,在这个系统上面使用Waydroid效果应该比在Windows上使用WSA的效果还要好。毕竟这可不是虚拟机运行,而是使用容器技术原生运行的,如果有机会的话还是值得一用的。</p>
<h1 id="试用redroid">试用redroid</h1>
<p>因为Waydroid不能开多个实例,所以我搜了一下有没有类似技术而且能开多个实例的,结果就找到了<a href="https://github.com/remote-android">redroid</a>。安装也很简单,执行几个命令修改下内核模块然后直接用docker pull个镜像就可以用,而且这个切换版本比Waydroid简单,Waydroid想换别的安卓版本要自己整镜像,不然就只能用基于Android 11的LineageOS,redroid可以按镜像的版本号选择希望使用的安卓版本,而且我测试了一下,redroid是可以使用scrcpy连接的,看起来效果还不错。 <br />
但是我试了一下运行一些ARM的安卓程序会出现闪退的情况,我以为是因为没有ARM兼容库的问题,但是文档上写的镜像里面已经自带了libndk……这么看来可能是因为libndk的兼容性不太行啊,另外libndk好像是给AMD的CPU使用的,我用的CPU是Intel的,Intel应该用libhoudini才对,然而我找了半天也没有找到怎么让redroid使用libhoudini……真是令人失望啊。</p>
<h1 id="总结">总结</h1>
<p>看来在容器内运行Android系统的需求还是太少了,很多问题都没人解决……不过想想也是,那些搞云手机的大多直接拿真机运行Android,用兼容层的性能损耗也很大,而服务器级别的ARM芯片也不便宜…… <br />
另外就是使用Linux的人也很少,而且像那些在Windows上玩安卓游戏的人都是用的虚拟机,性能也都够用了,毕竟那么高功率的桌面端CPU怎么样都比超低功率的手机CPU强啊,所以容器内运行Android的需求比较少可能也很正常吧……</p>mayx原生运行Android肯定比虚拟机好!rpi4-openfyde的使用体验2023-12-10T00:00:00+08:002023-12-10T00:00:00+08:00/2023/12/10/openfyde<p>什么样的系统用户体验更好呢?<!--more--></p>
<h1 id="起因">起因</h1>
<p>最近玩树莓派感觉有点玩腻了,毕竟我不是搞硬件的人,树莓派的GPIO接口对我来说毫无意义,当作PC或者服务器的话性能又太差了,兼容性也不太行(这么看来新出的树莓派5一样对我来说毫无意义,和4B一样都是垃圾)。但是毕竟那个东西也挺贵的,闲置也不太好,因此我想在上面装上适合普通人使用的系统,然后送给家里的人使用。</p>
<h1 id="系统的选择">系统的选择</h1>
<p>首先服务器版的系统肯定不需要考虑了,谁会用一个满是命令行的系统啊,在我看来普通人使用的系统只能在Windows, MacOS, Android, ChromeOS里面选了,任何GNU/Linux发行版的桌面版在我看来都不太适合普通人使用,<a href="/2023/05/22/rpi-win.html">Windows之前已经试过了</a>,可以说基本上没法用,就是纯粹的垃圾。MacOS显然还没有什么方案可以安装(至于仿MacOS的TwisterOS对于普通人来说使用难度也很大,安装软件都是难事),Android虽然也不是不能用但是作为桌面端系统效果还是不太行,所以我觉得可能也就只有ChromeOS可以考虑一用了。 <br />
不过官方的ChromeOS要支持的设备才能刷,树莓派显然不在其中,要么就刷ChromiumOS,但是那个要登谷歌账号,在国内使用也不太好。幸好国内有一家对ChromeOS做了本地化的公司,开发了FydeOS,我看了一下如果想在树莓派上安装,就只能安装FydeOS for You,但那个是收费的,每年要120CNY,太贵了,我肯定是不会考虑的。还好,还有一个替代品,那就是openFyde,两个系统我也不太清楚有什么区别,可能是云服务有所不同吧?对于树莓派来说,安装<a href="https://github.com/openFyde/overlay-rpi4-openfyde">rpi4-openfyde</a>就可以了,另外想要安装的话最好选文件名中包含“archero”的那个,才能使用Android子系统。</p>
<h1 id="安装与使用体验">安装与使用体验</h1>
<p>第一次安装的时候我是直接把镜像用Raspberry Pi Imager刷进去的,我以为它和其他的树莓派系统一样刷进去之后再配置其他东西,结果并不是,那个镜像是个安装包,想要用的话需要先格式化TF卡,然后找一个U盘把系统刷进去,然后把U盘和TF卡都插入树莓派才能安装,就和安装ESXi一样。 <br />
安装之后拔掉U盘重启就可以创建用户使用了,首先作为浏览器为基础的系统,我平时用浏览器可能也就是看看Bilibili吧,之前我使用树莓派官方系统的浏览器看Bilibili效果非常差,看看装了openFyde的效果怎么样?结果令人失望,效果还是一样的差,主要应该还是没有硬件解码的问题吧……树莓派4B的GPU好像只支持硬件解码H264,而树莓派5更是卧龙凤雏,只支持H265,真是有够逆天。这么说来FydeOS for You可是要每年120CNY呢,这个水平的性能他们有自己测过吗?就这样也能收费吗?至于其他不涉及视频的网页倒是还算流畅,不过毕竟GPU很垃圾,有一些特殊情况还是会卡。 <br />
除了浏览器之外,可能用的比较多的就是Android子系统了吧,要是想轻度办公的话应该需要一个Office,用浏览器的Office也不太好,所以先安装个WPS Office试试看,这个从Fyde的应用商店里就能直接安装,还挺方便的。不过安装好之后效果感觉不太行,首先这个Android子系统居然不支持滚轮,复制粘贴都要像手机那样长按,而且很多时候比如新建文档,它会开两个窗口,原来新建文档的窗口不会关掉……这可不像是能让人用的样子啊……而且整体使用也比浏览器卡,使用起来并不顺畅。另外输入法也不是默认开启的,要在设置里设置,体验也不太行。 <br />
我试了一下那个应用商店,上面的应用要么就是网页链接,要么就是Android程序,要么就是浏览器插件,Android程序从我用了WPS Office来看不怎么抱有希望了,放网页链接的我感觉有点无语😓,其他系统的浏览器都能把网页当作应用,这个系统反倒是直接当超链接跳过去了……至于浏览器插件,那个只要是能安装浏览器就都能用吧,没啥特别的。 <br />
虽然普通人可能用不上,这个系统还有一个Linux子系统,具体是什么Linux我没细看,不过好像是使用容器启动的。我试了一下效果还行,只是不知道为什么不能使用全部内存,我使用的是8GiB的树莓派,但是分配给Linux的只有6GiB,存储也是分配的,默认10GiB。明明都是Linux系统为什么ChromeOS要限制子系统的资源呢?</p>
<h1 id="总结">总结</h1>
<p>总的用下来,树莓派4B的性能可能真的就只能看看网页了,连视频都不能流畅播放,安装Android应用效果也很差,不过有时候限制多并不是一件坏事,毕竟对普通人来说如果这个性能让人不要抱有更多的希望,反倒是提高了用户体验呢。虽然如果是用比如Ubuntu之类的系统能做的事情应该更多,但很多情况不是普通人应该关心的事情,尤其这个芯片还是ARM指令集的,即使某些应用提供了Linux版也不一定能在树莓派上安装,尤其这个安装很多时候也不是双击就能搞定的,openFyde至少能做到真想安装Android应用的时候双击还是能安装的,卡虽卡了点,但是一般情况不会出现让普通人看了会看不懂的情况,已经算很不错了。 <br />
因此,我觉得如果让普通人使用树莓派,安装openFyde是最好的选择了。</p>mayx什么样的系统用户体验更好呢?在MacBook玩游戏的各种方法2023-10-21T00:00:00+08:002023-10-21T00:00:00+08:00/2023/10/21/game<p>我倒要看看是谁在说Mac打游戏是疯子😡<!--more--></p>
<h1 id="起因">起因</h1>
<p>自从<a href="/2023/02/03/mbp.html">用了MacBook Pro</a>以后,我用我以前Windows笔记本的次数越来越少了。虽然性能可能比不上,但是安静和超长续航的体验还是相当不错的。但是我也不是完全不玩游戏的人,有时候闲了也有打游戏的需求,那我如何在不使用Windows系统的情况下打游戏呢?</p>
<h1 id="在macbook玩游戏的方法">在MacBook玩游戏的方法</h1>
<h2 id="原生游戏">原生游戏</h2>
<p>一般来说如果想发挥MacBook的全部能力,那自然是完完全全为Mac设计,不需要任何转换等方法的游戏最好了,这类游戏一般在Mac App Store就能找到和下载,只是绝大多数都不是免费的,我也就下过一款<a href="https://apps.apple.com/us/app/ibreakout/id1582094533">TouchBrickOut</a>的打砖块游戏,这是真真正正为Mac设计的,不仅原生还要Touch Bar。当然对于大多数游戏来说不会为Mac专门设计,毕竟Mac的游戏玩家比较少。但是能在Mac上原生运行的游戏除了为Mac设计以外,就是开源游戏了。毕竟源代码都有了,想在哪里编译都可以。对于我玩的游戏来说,有几款正好符合这一点,比如<a href="https://github.com/ppy/osu">osu!lazer</a>,还有之前玩过的<a href="https://github.com/k4zmu2a/SpaceCadetPinball">三维弹球</a>。</p>
<h2 id="ios游戏">iOS游戏</h2>
<p>因为M系列芯片基于ARM架构,所以我的MacBook也可以玩iOS的游戏。这类游戏一般也能直接在Mac App Store上下载到,比如我玩过的<a href="https://apps.apple.com/us/app/%E8%8D%AF%E6%B0%B4%E5%88%B6%E4%BD%9C%E5%B8%88/id950654598">药水制作师</a>。但其实有很多iOS游戏在Mac App Store上都搜索不到,应该是开发者设置了规则不允许在Mac上使用。对于这类游戏可以在<a href="https://decrypt.day/">Decrypt IPA Store</a>上下载,并且使用<a href="https://github.com/PlayCover/PlayCover">PlayCover</a>安装。对我来说,我一般玩<a href="https://decrypt.day/app/id1423525213">公主连结Re:Dive</a>,以及一些模拟器,比如<a href="https://apps.apple.com/us/app/xp3player/id1064060287">XP3Player</a>和<a href="https://apps.apple.com/us/app/onsplayer/id1388250129">ONSPlayer</a>(其实这两款软件可以在Mac App Store上下载,但是都要花钱……所以我就去网上找的ipa文件然后在PlayCover上安装了)</p>
<h2 id="使用rosetta-2的x86游戏">使用Rosetta 2的x86游戏</h2>
<p>在M系列芯片出来以前,其实也有不少Mac上的游戏,但是这类游戏可能在M芯片的Mac出来之前就已经开发好了,想让开发者为M芯片做适配显然不大可能。不过macOS有Rosetta 2可以让开发者不需要任何改动的情况下就让游戏在M系列芯片Mac上运行。这类游戏非常多,基本上在Steam和Epic Games上下载的游戏都是x86的,像我用的Epic Games Launcher以及在上面下载的游戏<a href="https://launcher.store.epicgames.com/zh-CN/p/while-true-learn">while True:learn()</a>都是这样的,不过我玩的这些对性能要求都非常低,所以即使用了转译,但是玩起来并不会卡。</p>
<h2 id="基于脚本的galgame游戏">基于脚本的Galgame游戏</h2>
<p>很多Galgame都是用一些专用的脚本引擎工具写出来的,例如T Visual Presenter、NScripter还有Ren’Py等等,因为是脚本,所以通常来说很容易跨平台,毕竟它们没有太多依赖系统本身的东西,只要能写出对应平台的解析器,脚本都能运行。像上述提到的XP3Player、ONSPlayer还有<a href="https://apps.apple.com/us/app/renpyviewer/id1547796767">RenPyViewer</a>就可以运行很多基于脚本的游戏。不过很多Ren’Py游戏都有发行macOS版本,所以一般不需要安装RenPyViewer。只是有可能它们都是基于x86开发的,可能需要用Rosetta 2转译……</p>
<h2 id="在网页上运行的游戏">在网页上运行的游戏</h2>
<p>浏览器作为跨平台最强的解决方法,自然游戏也不例外,能在网页上运行的游戏也很多,像RPG Maker MV制作的游戏基本上都可以在浏览器上运行。我看到有一个<a href="https://amemei-lists.top/posts/49e03169/">网站</a>就收集了很多这种游戏,他们之前还把游戏放在了GitHub上。不过Github对<a href="https://docs.github.com/zh/site-policy/acceptable-use-policies/github-sexually-obscene-content">Sexually Obscene Content</a>内容是不容忍的,所以他们在GitHub上的东西就消失了……不过我搜了一下还有一些漏网之鱼,<a href="https://github.com/jjbR18">这个账号</a>还有这样的游戏可以玩🤣(有效性只限我写文章之前的时间,说不定哪天被GitHub发现就没了)。其实对于这种网页上可以运行的游戏来说,最好下载下来,虽然RPG Maker MV的游戏可以在线玩,但是加载那么多资源,尤其这些文件还是在境外,对国内玩家非常的不友好😆,所以如果想在Mac上玩,可以下载下来,然后在终端那个目录下执行<code class="language-plaintext highlighter-rouge">python3 -m http.server</code>,就可以打开 <a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a> 下开始游戏了。不过Safari的效果不太行,很多游戏连声音都没有,想玩还是下载Chrome之类的浏览器比较好。</p>
<h2 id="使用wine游玩windows游戏">使用Wine🍷游玩Windows游戏</h2>
<p>除了相对比较原生的办法,不太优雅的办法就是用基于Wine的各种东西了。其实我之前不太想在MacBook上使用Wine的,因为一般如果是Linux系统在ARM芯片上运行的话需要用QEMU User模式模拟x86,然后再运行Wine,效率极其低下,还不如用虚拟机呢(虽然听过Crossover,不过我当时以为它是按这种方式的,而且还要收费😂)。不过macOS不太一样,它有Rosetta 2加持,效率比QEMU User模式高太多了,虽然是两次翻译但是毕竟有黑科技还算是能玩。尤其是前段时间出的Game Porting Toolkit,据说很厉害,所以前几天我根据<a href="https://www.applegamingwiki.com/wiki/Game_Porting_Toolkit">这个教程</a>安装了一个,编译的时候第一次听到我的MacBook风扇转😂。试了试效果确实不错,找了个Unity3D的游戏可以满帧率运行。虽然很不错,不过我又去网上搜了搜,发现我是**,有个开源的软件<a href="https://github.com/Whisky-App/Whisky">Whisky</a>不需要编译任何东西,就可以使用Wine和GPTk,而且配置也很简单,还能使用DXVK,而且因为是已经编译好的,不需要安装依赖,也不需要源码之类的东西,我通过上面教程安装的大小要4个多GiB,但是这个就只要1个多GiB,还不需要考虑乱七八糟的东西。 <br />
经过我的实测,GPTk(其实就是D3DMetal)兼容性更好一些,效率也更高,但是占内存很大,DXVK似乎效率低一些,但是占内存比较小,因为我的MacBook只有8GiB内存,而且我玩的游戏在哪个上面都能跑满帧率 <del>(反正3A大作我也不可能在MacBook上玩,估计M2的水平也玩不了……不如说我基本上不玩3A大作🤣)</del> ,所以我在玩游戏一般还是会用DXVK多一些,除非打不开才会用D3DMetal。</p>
<h2 id="使用虚拟机游玩windows游戏">使用虚拟机游玩Windows游戏</h2>
<p>因为我的MacBook只有8GiB内存,而且硬盘也只有256GiB,跑虚拟机压力实在是太大了,我以前试过<a href="https://github.com/utmapp/UTM">UTM</a>,但是玩不了游戏,随便什么游戏都会卡的动不了,当然也可能是UTM的显卡驱动不太行,不过现在的话我也不想尝试其他虚拟机了,所以我只能说强烈不推荐使用虚拟机玩游戏。</p>
<h2 id="云游戏方案">云游戏方案</h2>
<p>这种方案直接就不在本机运行了,流畅程度全看网络和连接的主机性能。我以前也写过一篇<a href="/2021/09/28/cloudgame.html">关于云游戏的体验</a>,在这里就不多赘述了。</p>
<h1 id="感想">感想</h1>
<p>这么看来MacBook玩游戏的方法挺多的嘛,谁说一定要Windows才能打游戏呢?我觉得说在macOS上打游戏的人是精神病的人自己才是精神病吧,谁也没有说买MacBook就是专门拿来打游戏的,那些人就是觉得买Mac亏,估计还很穷吧🤣。 <br />
顺便一说,有个叫<a href="https://www.applegamingwiki.com/wiki/Home">AppleGamingWiki</a>的网站上记录了一些比较大的游戏在M系列芯片上的兼容性,如果真的有想在Mac上打游戏的想法,也可以去这个Wiki上参考一下。</p>mayx我倒要看看是谁在说Mac打游戏是疯子😡在树莓派4B上安装Ubuntu以及各种操作2023-09-24T00:00:00+08:002023-09-24T00:00:00+08:00/2023/09/24/rpi-ubuntu<p>明明在普通的电脑上也能完成这些操作……😥<!--more--></p>
<h1 id="起因">起因</h1>
<p>自从上次我给我的树莓派4B-8GiB内存版<a href="/2023/05/22/rpi-win.html">安装了Windows11</a>以后,我感觉这个东西上是真的鸡肋,速度慢而且兼容性还差,指令集有缺失连很多需要用到加密库的软件都不能正常运行……后来我就重装了一个ESXi-Arm Fling,但是装这个也有个问题,就是它不能使用TF卡存储东西,我还特地为了Windows买了个64GiB的TF卡,结果装虚拟机还用不了😂,U盘我也只有一个32GiB的,ESXi-Arm Fling如果想要正常的存储配置信息就至少需要占用掉3*4GiB的空间,这样虚拟机就只能使用20GiB的空间……真的全都是垃圾,20GiB能开几个虚拟机啊,开了也没啥能用的。所以这个树莓派就一直在吃灰。 <br />
后来我又想整点活,想着干脆安装个Ubuntu好了,反正放着也是吃灰,也错过了最佳卖树莓派的机会,就用起来吧,安装Ubuntu的时候居然也是各种碰壁😓,一开始我用树莓派镜像烧录器,闭着眼睛直接选了Ubuntu Server系统,我还以为它可以像安装树莓派系统那样第一次启动的时候让我设置密码,结果烧录完之后引导就直接让登录了,我连密码都不知道要怎么登录啊😥,网上搜了一下有默认密码,输进去之后显示需要让我更改密码,结果这个需要更改的密码怎么设置都不能生效😰,后来去Ubuntu官网看了一眼才知道原来需要在烧录中选择高级设置,手动设置密码才行……网上这些教程都是垃圾,这个软件也一样🤬,啥提示都没有,不看文档就只能靠猜了😢。 <br />
最后终于把Ubuntu安装好了,可以开始整活了😁。</p>
<h1 id="用树莓派整点什么">用树莓派整点什么</h1>
<h2 id="整点fm电台">整点FM电台</h2>
<p>安装好Ubuntu后我最先想干的事情还是整<a href="/2022/03/27/radio.html">FM电台</a>,毕竟这真的就是树莓派唯一和其他设备不一样的地方了啊,于是我就编译了一下<a href="https://github.com/miegl/PiFmAdv">PiFmAdv</a>并运行,结果不知道为什么一运行树莓派就直接死机……于是我退而求其次,选择了<a href="https://github.com/markondej/fm_transmitter">fm_transmitter</a>,这个倒是能运行,不过操作和树莓派3B区别相当大,首先编译得要用<code class="language-plaintext highlighter-rouge">make GPIO21=1</code>,然后杜邦线也要插到第40个接口,具体如下图打x的位置:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>,--------------------------------.
| ooooooooooooooooooox J8 +======
| 1ooooooooooooooooooo PoE | Net
| Wi 1o +======
| Fi Pi Model 4B V1.4 oo |
| ,----. +---+ +====
| |D| |SoC | |RAM| |USB3
| |S| | | | | +====
| |I| `----' +---+ |
| |C| +====
| |S| |USB2
| pwr |hd| |hd| |I||A| +====
`-| |---|m0|---|m1|----|V|-------'
</code></pre></div></div>
<p>CPU和GPU也全部需要定频运行,另外设置频率不能超过93 MHz……我调了半天才能正常运行……还有就是不像之前PiFmAdv那个项目可以使用立体声,感觉树莓派4B还不如3B…… <br />
不过我写着写着感觉好像不太对劲,看了一眼我上次写电台的那篇文章的时间比PiFmAdv最后一次更新还要早,看了一眼提交发现人家已经把问题解决了,难怪我运行不起来,原来是代码没用最新的🤣,刚刚更新了一下代码之后再运行已经没有任何问题了,立体声啥的都能正常使用了。不过Makefile还是没改……aarch64的系统运行依然会出问题😥……其实改起来也很简单,把Makefile里面的两个参数换成:</p>
<pre><code class="language-Makefile"> CFLAGS = $(STD_CFLAGS) -march=armv8-a -ffast-math -DRASPI=4
TARGET = pi4
</code></pre>
<p>就可以正常编译了。</p>
<h2 id="整点大语言模型llama">整点大语言模型LLaMA</h2>
<p>因为我的树莓派有8GiB内存,之前我在我的8GiB内存的<a href="/2023/04/05/ai.html">MacBook Pro上跑LLaMA</a>都没问题,那在树莓派上跑个LLaMA应该也没问题,所以就想试试看。跑起来非常简单,把<a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a>拉下来,然后直接编译就行了,但是实际跑起来速度非常慢,大概1token要1-2秒……根本用不成,不过现在的llama.cpp已经非常完善了,支持各种各样的硬件加速,无论是在我的MacBook上,还是用N卡、A卡,甚至手机使用OpenCL似乎都可以进行硬件加速。这些都能得到很不错的速度,那树莓派呢?树莓派用的好像是博通的叫什么VideoCore的显卡,我搜了一下,貌似没有办法使用OpenCL……不过搜的过程中发现似乎可以<a href="https://qengineering.eu/install-vulkan-on-raspberry-pi.html">装Vulkan</a>,虽然llama.cpp不能使用Vulkan,不过ncnn框架似乎可以使用Vulkan,跑个waifu2x也算不浪费这个树莓派的GPU啊,只是安了半天发现不连接屏幕貌似安了也识别不了……所以还是算了吧……</p>
<h2 id="整点qemu-kvm-windows虚拟机">整点QEMU-KVM Windows虚拟机</h2>
<p>当时我在树莓派上安装Windows11的时候听说在虚拟机上运行的效果要比裸机安装效果更好,我听到之后认为这是胡说八道,哪有虚拟机比裸机运行效果好的啊,不过树莓派嘛……说不定会有因为驱动不完整之类的情况,毕竟如果是在虚拟机里安装系统外面的Linux系统可以使用无线网卡,而直接安装Windows是不能使用无线网卡的,所以这次我也打算试试看,反正树莓派上使用虚拟机是可以使用KVM加速的,所以试试也没关系。 <br />
安装QEMU也很简单,直接执行:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager qemu-system-arm qemu-efi-aarch64 seabios vgabios
</code></pre></div></div>
<p>就可以了,安装系统的话也很简单,首先去下载Windows所需要的驱动<a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/">virtio-win</a>,然后下载Windows ARM版的安装光盘,这个去MSDN I tell you下载就行了,之后下载一个VNC客户端用来连接虚拟机的屏幕,然后创建硬盘:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>qemu-img create <span class="nt">-f</span> vhdx <span class="nt">-o</span> <span class="nv">subformat</span><span class="o">=</span>fixed system.vhdx 30G
</code></pre></div></div>
<p>准备好这些以后就可以启动虚拟机了,启动的命令如下:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>qemu-system-aarch64 <span class="nt">-M</span> virt-2.12 <span class="nt">-smp</span> 4 <span class="nt">-m</span> 4G <span class="nt">-cpu</span> host <span class="nt">-enable-kvm</span> <span class="nt">-bios</span> /usr/share/qemu-efi-aarch64/QEMU_EFI.fd <span class="nt">-device</span> ramfb <span class="nt">-device</span> qemu-xhci,id<span class="o">=</span>xhci <span class="nt">-usb</span> <span class="nt">-device</span> usb-kbd <span class="nt">-device</span> usb-mouse <span class="nt">-device</span> usb-tablet <span class="nt">-k</span> en-us <span class="nt">-device</span> virtio-balloon <span class="nt">-device</span> virtio-rng <span class="nt">-device</span> virtio-blk,drive<span class="o">=</span>system <span class="nt">-drive</span> <span class="k">if</span><span class="o">=</span>none,id<span class="o">=</span>system,format<span class="o">=</span>raw,media<span class="o">=</span>disk,file<span class="o">=</span>system.vhdx <span class="nt">-device</span> usb-storage,drive<span class="o">=</span><span class="nb">install</span> <span class="nt">-drive</span> <span class="k">if</span><span class="o">=</span>none,id<span class="o">=</span><span class="nb">install</span>,format<span class="o">=</span>raw,media<span class="o">=</span>cdrom,file<span class="o">=</span>win10.iso <span class="nt">-device</span> usb-storage,drive<span class="o">=</span>drivers <span class="nt">-drive</span> <span class="k">if</span><span class="o">=</span>none,id<span class="o">=</span>drivers,media<span class="o">=</span>cdrom,file<span class="o">=</span>virtio-win.iso <span class="nt">-device</span> virtio-net,disable-legacy<span class="o">=</span>on,netdev<span class="o">=</span>net0 <span class="nt">-netdev</span> user,id<span class="o">=</span>net0,hostfwd<span class="o">=</span>tcp::3389-:3389 <span class="nt">-vnc</span> :1
</code></pre></div></div>
<p>然后就能像正常安装Windows系统那样安装了,其中需要注意的一点是安装的时候会读不到硬盘,需要加载光盘中的驱动,其他缺失的驱动光盘里基本上都有,直接安装就行。另外第一次重启前最好把<code class="language-plaintext highlighter-rouge">-device usb-storage,drive=install -drive if=none,id=install,format=raw,media=cdrom,file=win10.iso</code>删掉,安装好之后可以打开远程桌面,就可以直接使用树莓派的IP去连接Windows系统,还能有完整的分辨率和音频支持。 <br />
既然装好了虚拟机,那么我就应该验证一下虚拟机是不是真的比物理机安装效果更好了。具体怎么验证呢?我又找了一个树莓派4B-4GiB内存版,在上面安装直接安装同版本的Windows ARM版,然后把两个树莓派的频率都调为1.8GHz,在两个Windows系统上下载了7-Zip ARM版,跑一遍基准测试,结果裸机安装的总体评分为6.1GIPS左右,虚拟机是5.1GIPS左右,这很明显裸机还是更强嘛,虚拟机唯一的优势就是可以用无线网络罢了,说到网络我也测了一下这个速度,在同样使用有线网络的情况下,虚拟机因为用的是user模式效果很差,连50Mbps都跑不到,而裸机可以超过100Mbps。至于qemu怎么使用其他网络模式我也不太会,整起来好像还挺麻烦的。总的来看树莓派安装QEMU-KVM运行Windows实在是不怎么样……一样是个垃圾。</p>
<h2 id="让树莓派运行x86程序">让树莓派运行x86程序</h2>
<p>既然安装了QEMU,那就该玩玩跨指令集的东西了,当然跨指令集是没办法使用KVM了,而且树莓派不像MacBook的Rosetta 2那样有硬件加速,效果肯定会非常差,不过我已经做好了觉悟,还是想整个玩玩。怎么整呢?非常简单,只要运行</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>qemu-user-binfmt
</code></pre></div></div>
<p>就好了,那到底是什么软件让我想大费周章的让树莓派运行x86程序呢?其实是一个叫做<a href="http://cdn.ouapi.com/postjson_linux.zip">postjson</a>的接口测试工具,似乎是拿Go写的,但是没有开源,也没有ARM64的二进制文件,所以就只好用QEMU啦,试了一下还真能运行,而且就像Rosetta 2那样直接当作原生的程序运行就可以,效果挺不错,不过CPU占用非常高,一运行一个CPU核心就占满了😂,也就是勉强能用的水平吧。</p>
<h1 id="感想">感想</h1>
<p>搞了这么多东西之后发现树莓派除了那个FM电台不能在普通电脑上操作其他不是和普通的电脑一样吗🤣?那买树莓派还有什么意义,不如买个二手手机,不过有了树莓派就感觉越垃圾越想挖掘它的作用,这可能就是它存在的意义吧🤣。</p>mayx明明在普通的电脑上也能完成这些操作……😥关于卫星通信的一些看法2023-09-06T00:00:00+08:002023-09-06T00:00:00+08:00/2023/09/06/satellite<p>卫星通信也许并不困难😁<!--more--></p>
<h1 id="起因">起因</h1>
<p>前段时间,华为出了一款可以打卫星电话的手机——Mate 60 Pro。我虽然对华为不怎么感兴趣,对于它能把3年前的芯片卖到7K+CNY的营销水平也不感兴趣,但是对于卫星通信我还是挺感兴趣的,所以今天我就想说说我了解到的一些关于卫星通信的东西。</p>
<h1 id="关于卫星通信">关于卫星通信</h1>
<p>其实卫星通信在我们身边非常的常见,最常见的应该就是GNSS了,现在不仅手机可以通过卫星来导航,连各种各样的物联网设备也可以做到。不过这和卫星电话还是有点区别,因为卫星电话是双向通信,但是导航卫星是单向通信,手机通过卫星广播的位置信息以及一些信号差分等方式来计算出当前的坐标,所以连接导航卫星并不需要很长的天线,因为它不需要发射信号。 <br />
和这个类似的还有卫星电视,虽然卫星电视也不需要双向通信,但是可能因为它带宽比较大,然后稳定性要求比较高?所以大多需要一个接收锅来接收卫星信号。不过也许我说的是错的,以前在智能手机不太流行的时候有一种能在小型设备上观看的卫星电视,叫做CMMB,那个就是在手机上拉出一条天线就可以看电视了,不过我不太确定这个是通过卫星还是通过地面中继的方式工作的,也许两个都有?我记得这个似乎在房间里面也能收到信号,不太确定这小小的天线是不是真的能连接到卫星。 <br />
除了这些之外,还有一些搞业余无线电之类的人可以从国际空间站上通过SSTV之类的方式发送比如在太空中拍的图片啥的,不过我不太了解这些😂,就不多说了。 <br />
至于双向通信可能日常遇见的比较少,可能比较常见的就是有些电视台会使用卫星来转发信号之类的,还有就是打国际长途的时候似乎也是通过卫星来转发的。当然做这些操作的设备一般天线都非常大。 <br />
小的倒也不是没有,有些比较高级的车上面会搭载车载卫星电话,在紧急救援的时候就可以使用,当然普通的卫星电话也不大,只不过一般都会带折叠天线,价格倒是也还好,便宜的也有2K多。除了卫星电话之外可能最知名的就是星链了,那个也是使用的是卫星锅来上网,不过因为是近地卫星,而且数量众多,所以速度要比通讯卫星的速度快得多。 <br />
除此之外我之前还看过一位大佬<a href="https://blog.aoaoao.me/p/amateur-satellite/">用卫星和世界各地的人通信</a>,不过那个天线比较大,还要手动操作😂。</p>
<h1 id="关于华为卫星电话的看法">关于华为卫星电话的看法</h1>
<p>综上所述,华为新出的卫星电话能不使用外置天线就能使用卫星电话似乎确实挺厉害的?不过因为我没用过普通的卫星电话所以不太清楚,如果普通的卫星电话不需要转手机来寻星,那华为的卫星电话可能算不了什么,毕竟那么大个直板机,把自己当天线也不是什么难事。不过如果普通的卫星电话也需要瞄准卫星才能通信,那华为应该还是有点水平的。 <br />
我看过几个这个手机拆解视频,不过到处都没有看到明显的天线痕迹,卫星电话应该需要一个比较大的天线吧……那它能把天线藏到哪里呢?我想那个巨大的均热板会不会是天线呢?本来就是铜的,当个天线可能也是正常的吧,不过我毕竟在云,也不能完全确定😂。
至于在智能手机上增加卫星电话的功能……其实我觉得这是个莫名其妙的行为,可能主要还是为了营销,从价格上来说,3K买个卫星电话+3K买个SOC是骁龙8gen2的手机(例如红米K60 Pro)也比华为Mate 60 Pro便宜,而且灵活性和手机性能都更好,我不知道增加了这个卫星电话功能对手机成本的增加到底有多少,如果很多的话我想除了脑子有病的厂商才会去干这件事,毕竟绝大多数的情况都用不到卫星电话,很多时候没有移动信号的时候同样也接收不到卫星信号,比如埋在废墟中或者在电梯中等,除此之外还只能使用中国电信的SIM卡才能使用,还要开通套餐,还只能使用天通卫星,去远一点的海上旅个游是不是又得买别的卫星电话😅。当然如果成本很低,比如确实就是均热板另外加个芯片就能用那我觉得还行,就是销售价格太贵,不过是公司想多赚点嘛,这能理解😆。 <br />
至于有些人说的布局6G那就更扯了,如果真的6G是卫星网络,那不可能不加天线,我相信没人会想瞄着卫星上网吧,而且卫星网络无论如何都没办法做的比地面基站更快,总不至于6G比5G还慢吧🤣。</p>
<h1 id="感想">感想</h1>
<p>卫星通信看似高级,不过本质其实就只是和飞的比较快(同步卫星可能不需要考虑这个吧……),离得比较远 <del>(几万公里其实还挺远的🤣)</del> 的无线电台通信罢了,再简单点,拿个激光笔都能和几公里外的人通信,所以这真不是啥难事,想想人类都能和飞了不知多远的旅行者1号通信,是不是觉得其实还好呢?</p>mayx卫星通信也许并不困难😁