普通视图

利用宝塔面板实现 Gitea 代码自动推送

2025年6月27日 00:36

宝塔面板因其使用方便、功能强大的特点,积累了海量的用户基础,尤其对于管理服务器和部署网站应用,通过快速部署和可视化界面,极大地降低了配置门槛。 我日常习惯将本地代码直接映射到宝塔面板的网站目录,修改代码后可以在浏览器上即时预览效果,调试响应极其迅速。同时通过预设的计划任务,每天凌晨自动将服务器上的代…

雷池 WAF 应用防火墙搭建以及常见问题排查

2025年6月24日 12:03

Web Application Firewall 为 Web 应用防火墙,简称 WAF。它通过分析 HTTP/HTTPS 流量,根据预设的安全规则集以及语义分析,识别并拦截针对 Web 应用的恶意攻击,例如 SQL 注入、跨站脚本(XSS)、恶意爬虫、API 滥用、CC 攻击等,可以理解为保护网站的…

CSP-J/S 复赛必备系统 NOI Linux 2.0

2025年10月15日 14:46

CSP 初赛告一段落,复赛即将来袭! NOI Linux 2.0作为NOI系列比赛和CSP-J/S等比赛必备的系统,了解和熟悉相关操作是赛前必备技能。目前正处于系统更换的过渡期,大家一定要注意自己省份使用哪个版本,提前熟悉、提前下载,了解操作环境,更好地应对比赛中出现的一些状况!

从零开始用Linux系统使用笔记

2024年12月9日 22:40

2024.12.12 将标题从 “debian系统使用笔记”改为“linux系统使用笔记” 有一台很破很破的笔记本,用windows感觉卡顿,且无聊。想起两年前尝试玩了几天ubuntu,这次换个debian12玩玩,基本什么都不懂,不懂不怕...

Run Claude Code and Set Up Claude Code Router in Termux(Android)

2025年7月29日 00:00

Learn how to install and run Claude Code in Termux on Android, and seamlessly configure Claude Code Router to flexibly switch AI models for coding tasks. This tutorial covers setup, configuration, and practical tips for boosting development productivity with a powerful, customizable AI coding environment on your mobile device.

偶然修了一台「E舞成名」街机跳舞机的网络故障

2025年10月27日 22:24

本文本来是要写如何偶然修了一台街机跳舞机的网络故障,本来是个叙事故事,结果加上前因后果后就变成了一篇奇怪的散文了。

对付看吧。

只能说自己的书写能力变差了,写内容越写越歪,越写越跑题。

(注:修复网络故障的事件发生于2023年)

我的街机游戏史

我大概小学五年级才敢进游戏厅,那时候已经是1999年了,一年之后本地网吧就遍地开花了。所以我对街机游戏兴趣不大,就算是有电脑和模拟器之后,街机游戏翻来覆去也就那几个合金弹头而已。

跳舞机小时候就更是没玩过了。小时候我应该是比较标准的社恐,主要原因还是小时候的生活环境过于弱肉强食了,把人打到头破血流,或者选择当别人的狗腿子,或者选择自己蹲在角落抠泥巴(被前两种抓到了就要挨揍),三选一。

当然贵也是一个借口,本地街机一直是1毛钱1个币,赛车摩托车跳舞机都是多个币玩一把的。当时我兜里能有5毛钱就算宽裕了,更别说去街机厅的路上被拦路抢劫的概率高得离谱。一个币能把合金弹头X打到第四关,然后全死那,5毛钱我能玩一个星期。打个游戏都抠抠嗖嗖。

再后来网吧火起来之后,街机厅全改为赌博机了。再再后来本地就剩下一个正常点有游戏玩的街机厅,价格是一块钱一个币,这价格实在是太吓人了,但是好处是按键坏了立刻就有人修,没有以前那种机器坏了永远不修纯骗币的情况。但是这价格我实在承受不起,没去过。

再一次进街机已经是2013年了,当时去广州出差,见见网上认识的朋友,基本都是高中生,就在正佳广场楼上看他们打游戏,当时看他们是玩的那个 Konami 的 Kinect 体感跳舞机 Dance Evolution。我当时当然没敢玩,只觉得 Kinect 有意思。结果回去研究了一下,发现 Kinect 除了在 Dance Evolution 上产品化了之外,就只有 水果忍者。微软在 Kinect 上不仅把游戏机和PC分开,而且两边都没做什么开发,甚至还出了一个 Kinect2 ,最后都死了。

后来几年街机音游重新兴起,但我在北京没见过正版的,连太鼓达人我都只在奥体公园地下的游戏厅见到过山寨版(有中文歌却是个优点)。当时在北京的朋友每天坐地铁去长春桥站的金源玩音游,北京那破交通,出门一天几个小时全在地铁里,也就北京土著才有这个心情这么玩。

后来在广州的半年,我也是一个一个以前的广州网友都没见到。没了学生的单纯之后,广州佬基本都是势利眼,没权没势的话生活就没有交集了,人家对你一点兴趣都起不来。

2019年回了黑龙江之后,这地方落后是综合性的,所有方面平均比一般城市落后5年左右,新鲜事物妥妥的啥都没有,5年前是新鲜的玩意在这没了线上支持,也是落灰的废铁。

初次接触E舞成名

我家里人都是那种闲时就无事可做的人。小时候也经常把我一个人反锁在房间里,一锁就是一个寒暑假。现在也是一样,唯独现在难受的是他们,啥也干不了+啥也不会干,一点娱乐手段都不会,现在就只能扭曲的躺在床上用手机刷短视频,一刷就是几个小时。

只不过他们觉得这种生活才是正常的。在老家,所有节假日都得去我外公家,外公家现在只是一个一居室大开间(进屋就是卧室,厨房阳台就是三块落地玻璃墙,只有厕所是单独房间),于是所有节假日都是全天候至少两台手机以最大音量外放短视频,偶尔还要打开电视大音量放电视里的广告。

纯煎熬。

只能出门,又不能远走。

外公家的位置属于全区里老年人最多的区域,虽然有一个高中和一个小学,但是这个高中是全是最差的,生源太蠢完全没有消费力;小学院子里甚至在养鹅,根本看不出来是否还有学生。整个区域出了开几个月就倒闭的大中小饭店之外,连个冷饮店奶茶店都没有。

好在1.5公里之外就是市中心,全市唯一的商圈。有公共自行车的话骑过去也就10分钟。家里人有事同样骑公共自行车的话10分钟也能赶回去。

但市中心也是屁玩的东西都没有。寸土寸金的地方,全都坐起来极为难受的送客椅,就更别说人多的地方外放短视频的人更多。

有个商场的顶楼开了个游戏厅,爬上去看了下,虽然赌博机还在,传统街机(名为月光宝盒的模拟器)只有5台,坏了2太。但店里大部分都是抓娃娃机,非节假日人特别少。

我的原则是,自己能在家玩的东西,就不在外面浪费钱。(但还是玩了合金弹头、俄罗斯方块大师2、魔法气泡2、Shock Troopers 2)

然后发现这家街机厅有个国产的跳舞机,E舞成名,设计很人性化,尤其是,最初的Sega跳舞机踏板是正十字键模式的,映射到屏幕上时上下两个箭头的位置与实际踏板根本不挨着,反直觉的。这个E舞成名的踏板是斜十字的,左上左下右上右下加上中键5个踏板,和屏幕映射是相同的,而且这机器还带有手部感应,有一丁点 Kinect 的味道(此时 Kinect 体感已经灭绝了,Komani 的跳舞游戏的体感已经移动到 NS 和 手机上了)。

也就这么个机会,开始玩 E舞成名 了。

后来还在网上买了个会员卡。
screenshot_on_b85m_by_flameshot_at_2025-10-27_20-48-18

社恐?我现在不是社恐了。我现在只是个单纯的反社会份子。就现在烂短视频烂大街的社会环境,人人都跟精神病一样没事就发癫,别人有什么看法跟我没啥关系。

E舞成名网络版(旧版)

前文也说了,本地实际很落后的。

这街机厅其实也易主多次了,这机器应该是10年前买的,根据店员的说法,当时这个店面甚至都不是现在的老板,不论机器还是店面都易手过很多次

也就是说,这 E舞成名 的机器也是古董,搜了一下,最初的厂家早就没有了,整个产品线被多个厂家接盘的好多次,但现在仍然有线上服务支持,甚至有很现代化的微信小程序。(对比 SEGA/华立 的 maimai舞萌/中二 只有个微信服务号,其页面的设计理念还是20年前的Web设计模式)

前几年官方在猛推 E舞成名升级版 的机台,简单来讲:

(大前提:大量歌曲只有会员才能玩,其他权益不影响游戏性)

旧版只有个一次买断的会员卡,卡片是个NFC卡,绑定微信后,在机器上刷卡玩。想要当会员必须买实体卡。一次性买断制但是店里不一定有卡,卡片价格也可能有很大水分。
升级版是手机扫码,只要有手机微信就能获得会员资格,但是会员是 月费/年费 模式的。订阅制但不需要实体卡

作为玩家我当然是钟爱买断制的。
但是如果让我以开发者的角度考虑的话,维护一个 如此长尾 的项目,当然也会期望一直能有收入,而不是看着账上一直零收入但是天天都要烧服务端的维护费。

断网故障和修复

这机器是个老古董,还能工作就很不错了。其实平时故障也蛮多的。

本身街机厅问题也蛮多的。他们每天下班都把网线拔掉。事实上街机厅关电源也都是直接拔电线。有一阵这跳舞机只要开机就卡死。街机厅当然也是经典的“有问题就重启”,当然没有“重装”和“换机器”这两步。

IMG_1067

IMG_1068

2023年秋天的时候,这机器就突然不能连网了,不论店员如何的“反复重启”和“插拔网线”都没效果。虽然不能连网最多只能造成会员不能刷卡玩会员歌曲,但貌似有会员卡的人还不少,有点影响生意了。

终于有一天,店员决定找线上客服把这问题解决了。

DSC_7917

把机器打开,接上键盘和显示器,决定一看究竟。

然后第一步他们就卡住了。“后台一直无法登录,账号密码输入不进去”

在那卡了半个小时,第一步都进行不下去,就看着电源蹲在地上拿着手机在微信上跟客服驴唇不对马嘴的无限拉扯。我实在看不下去了,决定介入。

当时那几位店员倒是很好说话,一点也不遮掩,直接把他的手机给我看,账号密码也给我看了。

转头我拿过键盘看显示器,瞬间明白店员为啥卡住了。

界面是 Ubuntu 11.04 的底层登录界面,输入完账号 root 之后,输入密码的阶段是不显示 星号占位符 的。但是即使没有占位符问题,店员输入密码后也没成功登录,因为 密码是数字 但 Ubuntu 启动后默认 Num 是关闭的,小键盘不能直接输入数字,而店员一直尝试只用小键盘输入密码。

使用 root 账号登录到底层后,我没看文档,也没有跟客服沟通,上来直接检查了网卡状态和配置文件。 Ubuntu 11.04 这个版本是比较奇葩的,没有传统的 ifconfig 命令,默认 curl 也没有安装,连nslookup都不能用,但是有 wget。

(我也不吐嘈为什么用 Ubuntu 11.04 这种短期版本而不是 LTS 长期版本了。8.04 LTS 过于简陋根本没法用,而 10.04 就是个坑爹的玩意。其实我觉得肯用 Linux 已经很不错了)

检查了一下,这台 Ubuntu 机器有双网卡,两个网卡都是接线状态,route 能看到一条默认路由,ping IP 和 ping baidu 都能通,但是 wget www.baidu.com 时,TCP请求会被 reset

我以为这个 tcp reset 是病根儿,于是想跟店员确认一下这跟网线上游是啥,结果店员说这跟线就插在这一个跳舞机,上游是商场网络,其他连网的游戏机都连的其他线,他们也缕不清,他们甚至自己手机上网都蹭楼下饭店的,自己店里的WiFi只给游戏机用。

(这都什么网络拓扑)

初步怀疑是这跟网线上不去网。但又不像是那种需要界面认证的情况,因为跳转认证一般是劫持 http 请求然后跳转,现在这现象只要是 TCP 请求,不论什么端口,都会被 Reset。

店员又翻出来一个古董台式机,开机插上这根网线后之后,能够正常上网。

翻车啦。

这下我也搞不定了。

把手头所有情况都整理了一下,用店员的微信把所有细节都发给了客服。结果客服让我执行几个shell脚本。执行那几个脚本之前,我用 cat | more 查看了一下脚本对应的内容(没错这系统里连vi和less都没装),结果发现就是几个检查网络状态的脚本(包括ping百度),我说这些内容我都检查过了,刚才不是全都发给你了吗。结果对面执意让我重新执行一遍这些脚本。

我才突然意识到,对面可能根本就看不懂我写的那些什么 ping 能通但是 tcp 不通,他就是只会照着个手册念经罢了。

陪他念完经之后,把所有输出,拍照发给客服,啥问题都没看出来。

本以为到这里就结束了。

结果经文竟有后续。 客服说接下来看另一台机器。

第二台PC

没错这里面不仅仅是一台PC主机,是 两台 !

IMG_1069

仔细观察这里面的玩意后,实际里面是两台主机,一台交换机,一台功放,以及一个连外壳都没有的电路板。

实际游戏并不跑在我之前检查的的那台主机上的。

这回是把键盘鼠标插到机器里的另一个机箱上,但是另一个机箱上只有一个空闲的USB接口。

先插键盘,然后按下指定案件之后,这游戏机最上面的显示器(这游戏一共三个显示器)变成了 WindowsXP 界面。然后客服说检查这台机器的网络配置。

(于是刚才高兴游戏机是用Linux开发的观点碎了一地。当然,本身在Linux上做游戏图形开发本身就很困难,即使是现在2025年有SDL2甚至SDL3这种神器的加成下,大部分开发者也得被Linux的图形开发的性能问题恶心够呛)

店员还犯愁怎么接鼠标呢。我:WindowsXP 要啥鼠标,然后用键盘直接进了控制面板,进网络。

然后就破案了:没有网卡,这就怪不得一直没网络连接了。

但是,破案了但又没破案。

网卡怎么还能没呢,尤其是这主机用的是板载网卡,不是PCI-e网卡,更不是USB网卡,怎么网卡还能没呢。

既想不出来问题怎么出现的,也想不出来怎么解决这个问题。

最后我只能假设可能是硬件过老,网卡的芯片自己坏掉了。解决办法是网上十几块钱买个便宜的USB网卡凑合,但是由于这机器只有一个可用的USB接口,所以可能还得买个USB Hub?反正总比把主机或主板拆下来维修或者更换更划算。

真相的背后还有真相

本来以为这事情就要这么结束了。

结果微信客服那突然来了一句:“开机重启进BIOS看看网络设置”,我还纳闷儿呢这搞什么。

死马当活马医呗。

重启机器,只有最顶端的显示器亮着,不仅如此,图像还是颠倒的,搞不明白怎么回事,是在BIOS里被设置旋转了180度?

进了BIOS,结果界面语言竟是西班牙语。这要是长得和英语很像的法语我还能蒙出来,西班牙语我完全不懂。

问了下店员,店员说店里肯定没人会动这玩意,屏幕上下颠倒也是很久以前的事情了,上次进BIOS可能是几年前,而当时那个员工都离职1年了。

在旋转了180度的西班牙界面上翻了半天,终于找到了语言选项,把语言设置成简体中文,然后进外设标签页,看到集成网卡被设置成了 关闭

又破案了。

(但也更玄幻了)

把集成网卡设置改为启动,重启机器,网络功能就恢复了。

当时已经是晚上接近6点了,马上就没有公交车了。于是我随便聊了两句就走了。(结果还是没有赶上公交车,因为本地公交车并不按时下班收车。花3块钱骑的电动助力车回家)

下一次去街机厅的时候,店员表示很感谢,然后“给师傅来瓶冰红茶”

后续

后来本地的公共自行车没有了,想要去的话走路要很久(我的步行速度是10分钟一公里),坐公交车也需要很久(公交车平均15分钟一班),去的频率大幅减少了。

再后来当时的店员陆陆续续都看不到了。

以前聊天的时候他们说之前都是在其他外市的连锁门店工作过,我以为它们是又被调去其他店面工作了,毕竟本市也不是他们老家。

今年夏天的时候这个街机厅扩营,店面的面积翻了一倍,但是只是加了几个赛车机器和摩托车机器。原来的员工基本上全都看不见了,现在只认识打扫卫生的阿姨。我问阿姨以前那些员工都去哪了,阿姨说:“那些人不是被调走了,是离职了。”

跳舞机也是大部分时间都不连网(没插网线),有时跟前台说一下,他们会给插网线。但有几次直接说连不上网,然后看着几个看着很莽的员工就在那鼓捣网线,一个个牛逼得不行。

瞬间就没有玩下去的欲望了。

The post 偶然修了一台「E舞成名」街机跳舞机的网络故障 first appeared on 石樱灯笼博客.

尝试把树莓派1和小米盒子1改造成游戏机,但是失败了

2025年10月18日 14:28

本文大概只是想讲讲我手中这块树莓派1B的使用经历。小米盒子1只是附带。


我玩树莓派那些事

我2013年的时候买了一块树莓派1B的板子。那时候我只有一台2007年买的奔腾T2130的笔记本,跑虚拟机比较吃力,而且由于是定制显卡所以Linux装上后显卡驱动不起来,这些问题导致没法在家(北京的出租房)用Linux。想要用Linux就只能在公司用公司的服务器。而且由于公司的系统是一个高度魔改的CentOS,公司改了相当大量的内核代码并且安装了大量跨版本的依赖包,只能用来学习Linux基础,嘛毕竟是2004年成立的公司,产品严重依赖Linux内核功能所以就只能一直往里面Merge最新功能,直到后来实在是塞不进去了,全部推倒了从新发布的CentOS7重新搞。

当时树莓派也不贵,就买了一块。说实话没怎么用。因为我没买任何外设,所以所有功能都是纯跑在CPU上的,32位的arm 700Mhz性能基本上只能验证功能上的可行性,一点性能都没有。

screenshot_on_b85m_by_flameshot_at_2025-10-17_19-17-39

IMG_3336

IMG_3337

IMG_3338

IMG_3339

IMG_3342

IMG_3344

IMG_3345

IMG_3346

IMG_3347

IMG_3348

IMG_3349

IMG_3350

(当然,想学 Linux 这个是借口)

当时手中还有个大学时买的罗技C270摄像头(15年了,这玩意到现在还没停产),能拍720p。刚巧当时出租房和公司都用的电信通/宽带通的网络,开DDNS可以用(不知真假的)公网IP互联。在公司摸鱼的时候就用SSH连上家里的树莓派,然后再开小飞机做代理就能完全访问家里的局域网(公司是有上网审计的,但公司主营业务之一也是上网审计,只要不干违法的事情且不影响公司其他同事上网就没问题)

IMG_4279

连上后瞎搞mjpg-streamer,当时调通后拿到的第一张照片刚好是放在窗台上对着窗外拍到的一位路过的美女。(然而当时的照片已经找不到了)

对应 mjpg-streamer 的内容可以参考十多年前的这篇老文章《使用树莓派制作近距离遥控摄像机(无线网卡+摄像头,手机或平板等移动终端控制)》,不过放在现在已经没什么参考意义了。

后来还把树莓派和移动电源和摄像头还有无线网卡组合到一起,把摄像头绑在书包后面,骑自行车上班时拍了一路。

【[远古画质] 北京,2013年某月】 https://www.bilibili.com/video/BV1U9W7zkEm4/?share_source=copy_web&vd_source=bc6d7e4cd2c1f2bba38d19773d2bc1fc

(请忽视评论区那些自嗨的精神病)

当年我还对视频编码什么的一无所知,就只留下了这么一个编码格式是H.262的远古画质的视频。

当时想调通这一套可是费劲。没有接入点的情况下,想把控制终端和树莓派连起来就很麻烦。而且树莓派的电路设计一直超级缺心眼,它的供电设计,一直没有优先保障主板,且USB接口一直有反相供电的问题。插拔USB设备造成的电压波动基本上100%会导致树莓派重启。输入电流也被压在500mA(201x年USB供电基本都是1A了),这就导致像无线网卡或摄像头这些用电大户(?)在工作的时候可能导致树莓派自己供电不足而重启。

为此专门买了一个同时有外置电源和反相供电屏蔽的USB Hub。这玩意可是非常稀有了。

screenshot_on_b85m_by_flameshot_at_2025-10-17_19-38-29

IMG_6866

用这玩意也就意味着没法插着移动电源用。

IMG_20140503_001825

2013年去广西出差的时候,带的公司的笔记本,散热风扇坏掉了。干活办公开SSH和Word/Excel没事,但是玩游戏或者看视频几分钟就直接蓝屏重启。恰巧客户那边网络炸了,所以一个星期我都只能在酒店发呆。当时就带着树莓派,装了个 OpenELEC 系统,用酒店的电视把《刀剑神域1》全看完了。

DSC_0195

DSC_0202

(之所以是 OpenELEC 是因为,Raspbian系统需要4GB SD卡,而3DS原装的SD卡是2GB的,落灰中。而 OpenELEC 只需要 2GB 的空间就可以安装。当然另一个理由是 Raspbian 图形界面实在太卡)

当时还买过一张跳舞毯。厂家给的光盘当然只包含一个 Windows 32位的游戏端,实际上就是个 Stepmania 汉化版。Stepmania本身是开源的,但是当时官方也只提供 64位 的 Linux 客户端。我当时对交叉编译一无所知,完全搞不懂,就只好把源码都复制到树莓派上然后直接在上面编译,结果编译了一个通宵,第二天早上屏幕上还在滚屏编译,实在是等不起,这性能可能就算跑起来了也够呛能运行(更别提还要跑在图形界面上),就放弃了。(后来在x86的Linux笔记本上编译,没报错直接成功编译并且成功运行,所以说代码里并没有int64这种必须用64位CPU才能编译运行的代码)

screenshot_on_b85m_by_flameshot_at_2025-10-18_01-05-57

再后来配套的亚克力板磕坏了,想要再买发现买不到了,网上只有B+外形的外壳了(后续的树莓派外壳基本也都是B+的)。我最后就只能用个饼干盒子套着用。就开始落灰。

IMG_20150512_152030_hongmi1

IMG_20150512_152103_hongmi1

IMG_20150725_110321_hongmi1

再再后来换了工作,我拿着树莓派当作一个远程控制设备插在公司服务器上当远程控制,即我远程登录到树莓派上模拟用户操作,这样我就不用蹲在服务器旁边干活了。结果老总为了要用墙壁上的电源插座给手机充电,直接把树莓派拔下来扔杂物堆里了。

(除非你已经为领导创造过巨大的收益,否则任何领导没见识过的努力都是狗屎)

再再再后来又换公司,公司搞高度网络劫持,然而用的是一个及其白痴的上网审计,导致大部分HTTP网站都访问不了,那时候HTTPS还没普及,导致想在网上搜资料就只能手机开热点,搜完了再切回公司网络。于是又翻出来插在出租房的联通宽带上,当时还有公网IP,在浏览器里写好规则,在公司翻到家里上网。尤其是那个白痴上网审计只会疯狂的主动探测端口的HTTP协议,小飞机的日志里全是主动探测告警,我还得专门安装个旧版的不会自动封禁主动探测的小飞机。

后来还买过扩展版和传感器模块(温度气压高度光线,但是没有湿度)。没学的时候觉得是魔法,树莓派社区吹得及其玄幻,学会后发现就是从对应API读数据,而且因为都是用Python写的,代码质量还稀烂,所以被社区吹得越来越玄乎。当时我还没转型做开发,没搞明白PHP怎么去抠系统级的API(事实上读不了,PHP-FPM不是干这个的,PHP-CLI又不是跑在Web上的,想以正经方式拿系统信息还是得走系统指令,那就和调用Python没区别了),且想在树莓派1上跑HTTP服务非常吃力,就更别提还没火起来的NodeJS了。实际上这屁事只用Bash应该就能做,只要能处理好从API中提取出来的二进制数据然后转换成人类可读的数据,然后再排版就好了。当然,Bash处理二进制数据和排版都超级麻烦,理所当然社区没人做。去他妈的国内开源社区

IMG_20151019_225300_MiPad

IMG_20151025_002219_MiPad

IMG_20151223_221943

IMG_20171030_192817

后来还买过 315M433M无线模块,想用树莓派做物联网。但是最后因为精力有限,买回来之后一直在落灰,一点都没动过。(后来物联网的发展趋势也是一坨狗屎,一帮傻逼搞紫蜂全死了,最后变成WiFi是亲爹,断网就报废,电饭锅都物联网人工智能)

screenshot_on_b85m_by_flameshot_at_2025-10-18_01-05-26

IMG_20151103_233125

再再再后来我也不在那个公司工作了,北京联通也不再分配公网IP了,手里这个树莓派又开始落灰。我也想过再利用,尝试把这树莓派做成同步网盘(大容量SD卡和U盘已经很便宜了),但是这设备的IO性能是在不够,虽然可以插外置硬盘,但兼容一代的硬盘盒也不存在,更别提之前说过跑Apache和PHP都很吃力了。

最后这树莓派1就正式落灰了。


年轻的时候憋坏了

我这个人,上学的时候憋坏了。早年间上大学从哈尔滨到西安,火车单程42个小时,后来提速后36个小时,但晚点又是日常。当年最多只能用个不到2寸的诺基亚3110c玩马里奥医生,因为屏幕小且九宫格键盘难操作且模拟器限制,只能玩这一个游戏,其他游戏都玩不了。(我也纳闷这大学4年我为什么不买一个俄罗斯方块机呢)

毕业工作后我就买了台3DS,买了两块移动电源。

后来买了台式机之后,老笔记本也开始落灰,我就装了个RetroArch又当作游戏机,在有大电视的合租房客厅里放了一年。结果是没玩,HDMI线超过2米之后要不就是价格登月,要不就是直接花屏。

IMG_20160124_160039_SHOT2SHOT1

而作为控制器的手柄,USB连接线同样没法超过两米;蓝牙又莫名其妙的高延迟。总之怎么样姿势都不舒服。

再后来有了新笔记本(就是那个后来自燃了的戴尔灵越7380),PS2模拟器的性能甚至比有GTX1080独显的台式机还好,经典掉帧场景在这个核显笔记本上竟可以全程60帧。虽然有着8代i7,但跑分和x264这笔记本(都因为散热问题)输给4代i7的,却在这个特别的场景下略微获胜(但是屁用没有,过场动画掉几帧根本不影响游戏性)(更别提Win10会给更低端的模拟器造成明显抽搐的问题,而且3DS模拟器在4代U上能稳定跑,在这破本上启动都费劲)。但最终结果也是一样的,一根又粗又硬的HDMI线扯着笔记本,笔记本还要再插着电源适配器,然后一根USB线连在手柄上,怎么样都不舒服。再再后来这破笔记本自燃了,这场景也自然没有了。

(所以我还是觉得,同样都是走2.4GHz频段,在无线键鼠和蓝牙手柄都出问题的情况下,游戏机无线手柄能做到延迟无感知是一种魔法。当然我也没钱去专门买一个无线手柄适配器,毕竟不适应需求,PC游戏还是坐在电脑显示器前玩,不需要无线)


煎熬后想把树莓派1改造成游戏机

前几年过春节都是在自己家熬夜的,用自己的电脑打一宿的TF2或者100oj。

去年在外公家过夜,但是下午的时候回家了一趟,然后晚上徒步走了3公里到街机厅,玩跳舞机一直玩到人家除夕闭店。

今年过春节时,则是在一个我不怎么熟的大人的朋友家过的。

纯煎熬。

能玩的东西就只有手机和3DS。

倒不是说3DS游戏性不行,而是我在嘈杂且陌生且随时会被打断的环境下,玩不下去那种期望有沉浸体验的游戏。

结果就是一个除夕,歪坐在一个陌生的沙发上,把魔法气泡手游的无尽之塔打到实在打不过,然后又在3DS上打了半宿的PPT(魔法气泡俄罗斯方块),最后结果是坐着落枕了。

邻居家当然是有电脑和电视的,只不过电脑是人家工作用的,别人的工作设备我基本不想碰;电视全是在播放春晚,根本看不得。

那一晚真的是纯煎熬。好在第二天大人们晚上全跑去歌厅唱歌了,我自己回了自己家,才算解脱。

再后来整理物品的时候又翻到箱子里落灰很多年的树莓派1和小米盒子1(还有2台小霸王),遂有了把这俩玩意改造成游戏机的想法。

两台小霸王机当然也是能用的,我还有一张400合1游戏不重复的游戏卡,基本上涵盖所有热门FC游戏。但这些年来我一直是在NTSC模式下以60fps的帧率玩FC的,如今再回到PAL模式的50fps,就显得特别的不适应。

为什么自己年轻的时候没感受到这么大的差异呢,我高中期间是同时玩模拟器和小霸王的啊。


把树莓派1改造成游戏机,但是失败了

思路有多个:

  • 安装个有图形界面的操作系统(Raspbian),然后在里面跑独立模拟器或者RetroArch。
  • 安装 OpenELEC ,然后在里面的 XBMC中 安装模拟器插件
  • 安装 Lakka 或 RetroPie 这种专门(只)跑 RetroArch 的操作系统

首先抛弃方法2。这个方法本来是我道听途说的,真实性不高。OpenELEC 已经停止维护太久了,XBMC也早就改名 Kodi。如今肯定是连不上那古董的插件服务器,就不费那劲了。

事实上现在想在网上搜树莓派1的资料已经很少了,就更别提树莓派基金会搞了一堆幺蛾子之后名声都臭掉了,现在还做树莓派资料的基本都是 外国营销号,没啥正经玩意,搜什么关键字都是一群人复制粘贴的垃圾(有一种百度比谷歌遥遥垃圾的领先感)。本身就追求开放的老粉肯定不会在这一根歪脖树上吊死,直接去 Linux on Arm 这种大领域玩去了。

用了几个AI工具搜了一下(百度、豆包、必应、秘塔,排名不分先后),基本上给出的答案都类似:

screenshot_on_b85m_by_flameshot_at_2025-10-17_21-58-02

screenshot_on_b85m_by_flameshot_at_2025-10-17_22-35-22

看起来还行?

Raspbian 方案

首先刷了 Raspbian 试了下。甭说模拟器了,只要进图形界面,分分钟整个系统卡到无响应。我专门是了下最新版的 Raspbian 和 自己电脑里保存的 2013 年的旧版 Raspbian ,结果是一样的。

这个配置跑一个图形界面操作系统实在是太勉强了,再在上面跑其他东西,还是算了。

RetroPie 和 Lakka

这俩方案我已经记不清前后顺序了。记忆里2013年的时候用过其中一个(另一个当时肯定没诞生),只记得当时那个很漂亮的仿PS3/PSP的系统界面(因为邻居家有台PS3)。

现在在装回来,只感觉到莫名其妙的超级卡顿。

RetroPie 方案

其中 RetroPie 又叫 EmulationStation ,看着很像是对 RetroArch 的重度套皮。不仅如此,所有对非模拟器的设置,全部都会先退出这个图形界面,然后调用Raspbian提供命令行风格的配置界面,配置完成后再重新启动 EmulationStation。这一套白痴操作下来,整个系统直接就炸了。

DSC_8108

屎山设计。

Lakka 方案

Lakka 则简介多了,看介绍,Lakka应该是直接把 OpenELEC 减掉大部分功能,只保留图形功能支持,然后在里面启动 RetroArch。

和 RetroPie 不同。RetroPie 是做加法,屎山;Lakka 是做减法,仅保留需要的内容。

缺点就是需要基于RetroArch之外的第三方功能基本没戏(但是把Samba这种功能塞进RetroArch是有可能的)。

Lakka跑起来后,首先是着跑 FC/NES,结果是卡顿得不行。

除了QuickNES核心之外,其他模拟器核心都是卡到爆炸,60fps最多只能跑到一半,30帧。

DSC_8111

这跟AI给出的答案完全对不上。还 SFC/SNES呢,连 FC/NES 都不行

试着给树莓派超频,结果是只要动树莓派的频率设置,就完全不启动。超频失败

最后勉强用 QuickNES 跑起来松鼠大战1,能将就着维持到60fps。

把耳机接上显示器/树莓派之后,又发现根本没声音,看了一眼,发现音频输出是null。手动把音频输出更改为 HDMI 或者 3.5mm 之后,游戏瞬间又卡得没法玩了。

RetroArch 的小插曲

当年在树莓派上跑RetroArch,也是我第一次RetroArch这个应用的渠道。

后来也想过在旧笔记本上安装这个操作系统,但是旧笔记本的性能可以跑Ubuntu这种功能正规操作系统,性能都绰绰有余,没必要专门安装专用操作系统,直接再在Ubuntu上安装RetroArch就好了,但是玩瘾没那么大,想玩直接上台式机,旧笔记本大部分时间在落灰。

再后来把整体操作系统环境从Win7迁移到LinuxMint时,在笔记本上使用过一阵RetroArch,结论是: RetroArch安装在专门用于游戏的机器上,或者给无经验者作为综合模拟器使用,用户体验还行;但是对于有经验的用户,在PC上使用窗口环境的模拟器的用户体验更棒。

于是之后再也没用过 RetroArch 玩游戏。

OpenELEC

本来没指望再用 OpenELEC 的,但是心理很别扭,总觉得以前不是这样的。

把 OpenELEC 重刷进去,发觉连操作菜单都卡顿得不得了。每个选择操作都能卡顿1秒以上。

啥情况?CPU缩肛了?

按理说菜单这些内容都是加载到内存的,就算SD卡因为放置太久有IO性能问题了,也不至于影响到菜单操作。

选了个 H.264的视频,播放起来倒是很顺畅,但我又用不着这玩意看视频。(尤其是现在大部分视频都是Webrip或Web-DL的,都需要手动选字幕,旧版的OpenELEC字幕能力太弱了,更别说操作还这么卡顿)

DSC_8112

DSC_8113

我电脑里当然是存着2013年的 旧版 OpenELEC 的。

刷了当初的旧版,依旧的性能问题。

看来树莓派是指望不上了。

想当年家里亲戚有过一台从单位搬回家的1988年产的 COMPAQ 486,只有486MHz主频和16MB内存(MMX指令集都没有),在DOS下用Nesticle模拟器也是能玩大部分NES游戏的(只要Mapper支持就行)(在Win95下开声音会掉帧)。

(暂时不想为了验证是否是SD卡的问题再买新的SD卡。手里的旧卡都一堆了,线上在用的只剩下3DS的卡和一个相机的卡,也都是偶尔开机)

(事实上固态存储长期不通电不擦除不读写导致性能下降的问题目前很严重且无解。PC端的冷数据还是用机械硬盘或者光盘存储更安全,SSD只适合做系统盘。但是这个情况在移动设备和移动存储上怎么做都绕不开)


小米盒子1

与树莓派1装在一个袋子里的还有个小米盒子1。

IMG_6867

IMG_6871

IMG_6876

话说小米这破品牌,当年我竟然还因为他曾把一个停产的产品在网站上多放了几个月页面,就夸了一下,当时绝对是脑子没有被门挤出屎。

(都是年轻时犯下的错)

小米盒子1这玩意,配置可比树莓派高太多了。

screenshot_on_b85m_by_flameshot_at_2025-10-17_22-04-44

(纸面参数甚至比我的旧笔记本还高)(但是别忘了这破玩意是精简指令集)

于是也想拿出来试一试。

思路很简单:小米盒子1内置的是魔改的安卓4.4系统,所以只要:

  • 安装安卓版本的 RetroArch 或其他模拟器
  • 使用任何可行办法将游戏ROM复制到小米盒子中,或使用USB OTG访问U盘
  • 使用内置蓝牙模块与PS4手柄DS4配对连接,或使用 USB OTG 有线连接PS4的DS4手柄

首先用遥控器把小米盒子1重置到出厂状态,然后连网,希望通过网络把文件复制到小米盒子中。

结果,只要一连网,小米盒子1就炸了。整个操作界面强制更新到了一个作坊风格的净是推广内容的界面,所有功能入口都没有了。用文件管理器,所有APK文件均被提示禁止安装。

DSC_8106

没办法只能用遥控器重新重置。

这回用USB OTG插U盘把好用的文件管理器和RetorArch安装包复制到小米盒子上,然后安装。

然后尝试连网,期望通过自己安装的文件管理器把游戏ROM复制到小米盒子上。

(之所以一直要连网,是因为 RetroArch 默认不带任何模拟器核心,需要连网才能下载对应的模拟器核心才能运行)

结果连网之后,不仅界面炸回山寨风格,而且隐藏了所有应用的入口,刚才安装的文件管理器和RetroArch在界面看不到了,完全被隐藏。

没办法只能再次用遥控器重新重置。

这回决定完全不连网,RetroArch的问题先搁置,大不了等会在路由器把抓包把小米盒子的所有网络请求全封掉,只放行 RetroArch 的请求。或者干脆不用 RetorArch,使用其他独立模拟器。

然后尝试用小米盒子的蓝牙配对手柄或者键盘,结果是:小米盒子除非小米自己品牌的外设之外,其余任何设备都不识别。

最后直接把手柄插在USB OTG上,依旧不识别。

封闭的垃圾!!!


开放的东西越来越封闭

本身表面上树莓派这玩意是个很新奇很开放的东西,但是实际上树莓派基金会是由博通建立的,芯片也是一直用的博通最便宜的垃圾。本身博通这公司有多烂就不用解释了。

只是没想到 卡片电脑 这个概念能在那个时间段突然爆发。之后树莓派除了换了几代SoC之外基本没任何改良,但由于名声在外,其他同类型产品都没能撼动这个破烂的地位。

然而树莓派5登场后,卡片电脑这个概念终于或许是大抵确实是好像死了。

天下苦 Intel x86 久已,但 arm 却不是来拯救大家的。

很可惜资本主义下,开放指令集根本没法发展。

没钱寸步难行。

而像小米之流的更是打着开放的名义把用户当牲口,成功培养出了很大一批的“有问题就刷机”但实际上只会在特定网站上下载自己都不知道里面是啥玩意的东西往手机里装的年轻韭菜。自由即吃饲料,自由即当牲口。

vlcsnap-2025-10-18-01h22m50s403

vlcsnap-2025-10-18-01h25m28s409

看手里一堆一堆的塑料电子垃圾,最后的结局都是换个5块钱的不锈钢铁盆。

“我们”是商品。

The post 尝试把树莓派1和小米盒子1改造成游戏机,但是失败了 first appeared on 石樱灯笼博客.

Chromebook折腾之2025

2025年3月5日 14:40

最近淘了一台洋垃圾Chromebook,折腾了一段时间,目前已经基本在日常使用了。在折腾过程中查找了许多的网上资料,解决了不少中文环境使用ChromeOS的问题,这里就分享一下Chromebook的选购和软件安装。

ChromeOS是什么

ChromeOS是Google从2009年开始开发的项目,可以简单理解为在Linux内核上运行的,以Chrome浏览器作为桌面环境,主要功能也是运行Web应用程序的一个操作系统。在之后,该系统也支持了运行Android应用程序,以及通过容器运行Linux程序,这样一套组合下来,我们就获得了一个原生支持运行Android应用,Linux应用和Web应用的系统,这比在Windows下面折腾Linux子系统,Android子系统要流畅得多。

目前为止,想要运行ChromeOS有两种方式,第一种就是购买ChromeBook,也就是搭载了ChromeOS的笔记本电脑或者触屏电脑。第二种方式,Google在2022年发布了ChromeOS Flex,让用户可以在经过认证的设备上安装ChromeOS Flex,包括一些Mac电脑也是支持的。

而想要激活ChromeOS,你需要有可以顺畅访问Google服务的网络。如果你没有这个条件,来自中国的fydeOS它是一个本地化的ChromeOS,内置了本地化定制和国内可以使用的网络服务,感兴趣可以去他们的官网看看。

Chromebook适合谁

ChromeOS最初设计出来也主要是方便云端办公,提供简单、快速、安全的环境,因此它更适合于对于性能没有要求,而希望简单吗体验的人。比如说:使用在线文档的文字工作者,得益于Google doc,飞书文档,语雀等文字和表格类在线工具,Chromebook简单的功能以及比较长的续航是一个性价比比较高的选择。除此之外,对于性能没有要求的开发者和数码极客或许也会考虑由于一台自己的Chromebook。

最新的Chromebook有两档标准,普通的Chromebook,以及Chromebook Plus,普通的Chromebook可能只搭载Intel Celeron处理器以及4GB的ROM, Plus也只是它性能的两到三倍。目前Chromebook在国内没有销售,通过天猫国际等平台平台购买的新机器一般也都比较贵没有性价比。对于普通用户国内平台在销售的平板电脑或者笔记本都比它有性价比的多。

而对于我所说的极客用户来说,在闲鱼淘一台洋垃圾Chromebook可能是一个比较有性价比的选择。比如我这台Lenovo Duet5,骁龙7C,8GB内存,256GB存储,13寸的OLED屏幕,搭配触控笔加键盘,支持平板模式和桌面模式,只要不到1500块钱,相比于iPad,看起来还是有点性价比的。

Chromebook选购指南

再次强调一下选择Chromebook需要保证有能够激活Google服务的网络环境。不具备的可以考虑fydeos,以及他们的Fydetab Duo设备。

在淘设备的时候,因为我们可能买到的是2019年或者更早发布的设备,我们需要关注设备的自动更新到期时间(简称AUE),所有ChromeOS设备都能够借助于Chrome浏览器几乎同步的更新节奏收到Google的定期更新。因此决定购买之前可以在Google的这个页面看一下该产品型号的AUE日期。

其次,电池健康度也是选择二手Chromebook产品时候值得关注的信息。本身购买Chromebook就是为了优秀的能耗和续航体验,电池不行这些就没办法完全达成了。购买前最好和商家沟通让对方打开「关于 ChromeOS > 诊断」界面并提供截图,可以在这个界面中清楚地看到当前设备的电池寿命、循环计数等信息。从这里可以大概预估该设备之前的运行时长,并且电池寿命高于90%应该是比较好的。我在这里就踩到了坑,因为是专门的二手商家,说了是库存设备,并且说没法激活设备不愿意提供截图导致我收到的设备实际上电池已经循环过了300多次,电池寿命只有86%,同时因为运行时间过长oled屏幕也有一点烧屏了。

最后,屏幕这块OLE屏幕可以让卖家把屏幕亮度跳到最低拍照这样也能看到一部分屏幕的缺陷,以及全白页面拍照测试等。关于型号的话,考虑到Android应用的兼容性,我选择的是ARM芯片的Duet设备,如果更加关注Linux应用的兼容性或许可以考虑X86芯片的设备。设备的型号这块,除了我提到的Duet,Google推出的Pixelbook Go, Pixelbook也是可以考虑的型号。

最后的最后,实际购买之前可以考虑使用现有设备刷如ChromeOS Flex或者fydeOS体验一下再做决定。

ChromeOS 初始化

ChromeOS本身的内核是Linux,但是为了安全,我们是没办法在上面安装Linux应用的,同时Android应用的安装也必须通过Play store才能安装,因此如果想要获得系统的完全控制权是需要开启开发者模式的。开启开发者模式后可以直接安装Android APK文件,同时也拥有了Root权限,可以在系统做修改,比如安装类似Mac下面homebrew的chromebrew工具等。但是代价是,每次启动电脑都会先跳出一个60s的警告页面(可以跳过),而在普通模式和开发者模式之间切换,所有的系统数据都会被清除,需要提前做好备份。

在我体验完开发者模式之后,决定还是回到安全模式。对于大部分人也都不需要开发者模式,我们通过Linux子系统开启Linux子系统的开发者模式,也就可以通过ADB来安装Android应用。因此如果想要开启开发者模式可以查看网上的资料。 初始化,可以通过家庭的软路由,或者手机上面开启Clash作为代理服务,在连接完网络后,修改网络中的代理服务,把手机或者软路由作为Chromebook的代理服务器,从而可以激活服务。同时要系统更新和安装Linux子系统需要稳定的翻墙服务,不然可能会失败。

ChromeOS初体验

ChromeOS内已经内置了一部分Web应用,包括了Google全家桶和一些工具应用。在未连接键盘鼠标前是平板模式,连接了之后为桌面模式。

以上为桌面模式,打开两个应用平铺,左下角为应用列表。

以上为平板模式的桌面

很多场景也可以通过浏览器进行,对于一些提供了PWA的网站,可以点击地址栏的安装按钮,这样就会生成一个桌面图标方便下次使用。也可以在Chrome应用商店安装扩展程序。

因为登录了Google账号,Chrome浏览器上安装的扩展程序,一些设置,书签等也都会同步过来。

同时ChromeOS还支持与Android手机连接,能够对手机进行简单的控制,包括手机的静音,地理位置权限开关,控制手机的热点并连接上网,查看手机最近的照片,打开的Chrome标签页等,如下图所示。

对于中文输入,Chrome内置了拼音输入法,如果使用双拼的话可以考虑使用fydeos提供的真文韵输入法,不过真文韵输入法没有软键盘,在平板模式还是没法使用,另外真文韵在Linux应用也无法使用,解决方法后面再说。

配置Linux子系统

Linux系统模式是未开启的,需要首先到「关于 ChromeOS 」中开发者部分开启,最新版本默认安装的是Debian 12,因为需要到Google的服务器上下载Linux镜像文件,这个过程可能非常慢,我这里差不多半个小时才完成。

有了Linux系统,我们首先需要安装中文环境,执行如下命令安装中文字体:

1
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei fonts-noto-cjk

Linux上面是没法使用系统的输入法的,我们需要安装Linux的中文输入法,我这里就是安装的fcitx5,可以使用如下命令安装:

1
sudo apt install zenity fcitx5 fcitx5-rime

安装之后在 /etc/environment.d/ 文件中创建一个im.conf文件,并且写入如下内容:

1
2
3
4
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx

之后手动打开fcitx5,并且配置好自己的输入法选项就可以在Linux中使用应用了。

除此之外,就跟正常使用linux一样,安装的Linux应用如果是有桌面图标的也会在Chrome的应用列表中展示,同样对于deb文件,也可以直接在chrome的文件管理器中直接点击安装。

现在ChromeOS也支持了安装多个容器,也就是说可以运行多个不同的Linux,感兴趣的可以看看这位博主的这篇安装ArchLinux的文章

安装微信

微信算是每个人都必须有的通信工具了,在ChromeOS中有两种方式可以安装,一个是安装到Android子系统,直接在Google play下载就行了,另一种则是安装Linux版本的桌面微信。

但既然有这么大的屏幕,当然是桌面版使用体验更好了。我这里介绍一下在我的Debian12下面安装arm版本的微信的过程吧,因为微信的有一些依赖系统内是没有的组件需要安装。

1
sudo apt install libatomic1 -y && wget -O libwebp6.deb https://security.debian.org/pool/updates/main/libw/libwebp/libwebp6_0.6.1-2.1+deb11u2_arm64.deb && sudo dpkg -i libwebp6.deb

除了这个之外还缺少一个libtiff5,debian12上面已经有libtiff6了,我们创建一个链接就可以了。

1
sudo ln -s /usr/lib/aarch64-linux-gnu/libtiff.so.6 /usr/lib/aarch64-linux-gnu/libtiff.so.5

之后我们应该就可以使用Linux版本的微信了。

另外还推荐在Linux子系统安装stalonetray,这样就可以展示Linux的软件的托盘,比如去查看输入法状态,和切换输入选项等。可以参考这篇文章

对于Linux直接在Chrome点击deb文件安装的应用,虽然安装完了但是有可能点击图标打开的时候总是在转圈却打不开,这可能是因为程序出错了,可以在命令行中手动运行,这样错误日志就可以查看了。

配置安装非Google play的Android应用

如果想要安装国内的应用,可能很多都无法在Google play商店下载,一种方式是打开ChromeOS的开发者模式,但是那样每次开机就要忍受开机警告。我这里选择通过Linux子系统来安装。

首先打开「关于 ChromeOS -> Linux开发环境 -> 开发Android应用」,将其中的启用ADB调试打开。

点击启用的时候会有如下提示:

并且如果停用的话也会将Chromebook恢复出厂设置,所有数据被清空,使用这个功能需要谨慎。

再打开Linux命令行,执行如下命令安装adb工具。

1
sudo apt install adb

之后打开「设置 -> 应用 -> 管理Google Play 偏好设置 -> Android设置」,这样就进入Android系统的设置应用中了,可以在关于设备中多次点击版本号,开启Android子系统的开发者模式,在然后到系统,开发者选项中打开ADB调试。之后在linux命令行执行如下命令并显示正常就说明配置好了。

1
adb devices

之后就可以通过ADB安装程序了,当然也可以选择使用adb安装一个国内的应用商店,之后通过应用商店安装应用。

ChromeOS的体验介绍

使用了一段时间之后来说,作为一个轻量化的Linux 本来说,这台设备还是符合期望的。Linux,Android子系统都和宿主系统有着很好的深度绑定,使用子系统的应用也和使用宿主一样有着很好的体验。而在我这里一大缺陷为,因为Linux子系统和Android子系统都被划分到了私有网络,因此它们实际上网络是和Chromeos宿主共享的,但是和局域网的其他设备不是在同一个子网里面的,因此类似LocalSend这种工具是不能使用的。这里目前我的解决办法是使用fydeOS提供的fyDrop工具和其他局域网进行文件传输。

这个设备同时还支持通过usb typec接口连接外接显示器,chromeos有着不错的窗口管理,桌面分屏,这些功能都为使用体验加分许多。

如果只是轻办公我感觉这是一台很棒的设备,但是得益于这个性能,想要在这上面做Android开发,去编译程序那就不敢想象了。而至于要不要入坑,还是要你自己决定。

最后照例来推荐一些可以参考的资料:

  1. fydeOS源于chromeOS,这边的中文资料都可以参考:https://community.fydeos.com/t/topic/40986
  2. Chrome 官方的文档: https://chromeos.dev/en/linux
  3. 解锁开发者模式和一些折腾,可以参考这边文章和博主的其他文章: 打造一台适合生产的Chromebook

看完评论一下吧

强大的壳-Shell Script

2024年12月26日 13:45

Shell脚本我们经常会使用,平时自己折腾Nas会用到,工作中为了配置CI会用到,自己的电脑上最近为了配置自己的命令行环境也要使用shell来进行配置。不过之前的shell功力都来自每次使用的时候网上搜索,于是最近就找了一本《Linux命令行与shell脚本编程大全》看了看,看完之后更加感受到Shell的强大,特地写个文章来分享一下。

首先呢,shell它也是一种语言,不过因为使用到的shell环境不同语法会有一些差异,在Linux上我们常用的shell是Bash,在Mac上面常用的shell为zsh,大体的语法相似的。编程语言的基本要素,Shell都是支持的,它支持变量,支持if判断,case选择,循环等结构化的编程逻辑控制,也支持基本的算数运算,同时还支持使用函数来复用代码。 简单介绍一下它的语法,首先是变量。系统为我们已经提供了很多的变量,同时在我们的配置文件中定义的那些变量也是可以读取到的。定义变量语法如下:

1
2
3
4
5
var=value #注意等号两边不能加空格
echo $var #使用的时候前面要加上$符号
echo ${var}

export varb=b #导出成为环境变量

以上方式定义的变量默认是全局的,比如你在一个函数中定义的,外面也能访问,这是时候可以定义局部变量:

1
local local_var=x #只能在函数中使用

除了普通的变量之外,shell中也是支持数组和Map的,当然要bash 4.0以上才能完整支持,使用如下:

1
2
declare -A info # 声明一个map
declare -a array #声明一个数组

而如果只是有这些东西的话,还不至于说Shell强大。而shell中可以直接调用命令以及Linux中的一些程序这才是它的强大之处。在python等其他语言中我们也是可以调用的,但是是都需要通过语言的系统调用才能调用,而shell中则是可以直接调用那些命令,只要这些程序的可执行文件在PATH环境变量中就可以。

而配合Shell的很多特性,又进一步强大了。第一大神器是重定向,重定向支持重定向输入和重定向输出,以下为一些示例:

1
2
3
4
5
6
7
date > test.txt #重定向输出到test.txt文件中,覆盖文件
ls >> test.txt #重定向,但是追加而不是覆盖文件
wc < test.txt #输入重定向
wc << EOF #内敛输入重定向
test a
test b
EOF

因为有了输入输出重定向,我们会有很多的玩法,可以方便的命令的输入写入到我们的文件中,而linux系统中,万物皆为文件,因此理论上可以写入或者读取所有东西。比如,有一个Null设备,我们可以通过以下的命令,来不展示任何运行输出。

1
2
ls >/dev/null 2>&1
ls 1>/dev/null 2>/dev/null

1为标准输出,2为错误输出,未指定的时候默认是把标准输出重定向,这里重定向到null则不会有任何输出,而第一行我们将错误输出又通过&绑定到了标准输出。当然除了这个还有更多的用法。

除了重定向之外的另一大特性则是 管道 。在某些场景重定向已经可以解决了很多功能,但是管道实现会更优雅。管道可以将前一个命令的输出直接传给另一个命令,并且管道的串联没有数量的限制,并且前一个命令产生输出就会传递到第二个命令,不用使用缓冲区或者文件。比如:

1
ls | sort | more

甚至我们还可以将刚刚的输出继续重定向保存到文件

1
ls | sort > files.txt

在很多命令的参数之类的都提供了正则表达式的支持,正则表达式能够让我们更加方便的进行数据匹配,Linux中常用正则为POSIX正则表达式,而它又有两种,基础正则表达式(BRE)和扩展正则表达式(ERE),大部分的Linux/Unix工具都支持BRE引擎规范,仅仅通过BRE就能完成大部分的文本过滤了,但是ERE提供了更强的功能,而有些工具为了速度,也仅仅实现了BRE的部分功能。

BRE支持的语法符号包括,.匹配任意一个字符,[]字符集匹配,[^]字符集否定匹配,^匹配开始位置, $匹配结束位置,()子表达式,*任意次数量匹配(0次或多次),而ERE在BRE的基础上,还支持?最多一次匹配,+匹配至少一次。而它们的更多功能可以参看这篇文章:https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions

有了正则表达式以及许多的处理工具我们就可以做很多的事情了,比如说查找文件,我们可以使用find,查找某个文件夹下面为指定后缀的文件:

1
find . -type f -name "*.java" #find支持的只是通配符,非正则

而配合管道,又可以对find之后的结果进行进一步的处理,比如配合上grep可以进一步对文件的内容进行过滤。

1
2
find . -type f -name "*.sh" |xargs grep "bash" #find 不能通过管道直接传递可以使用xargs或者通过如下方式
find . -type f -name "*.sh" -exec grep "bash" {} \;

对于文本的处理,Linux中又有sed和awk两大杀器,而关于他们的使用已经可以被写成书了。sed全名为Stream editor,也就是流编辑器,通过它可以方便的查找文件内容并替换后输出,awk则是一种模式匹配和文字处理语言,通过他们可以方便的处理文本。比如说我们可以使用sed对一份CSV文件中的手机号码进行打码处理:

1
sed -E 's/([0-9]{3})[0-9]{4}([0-9]{4})/\1**\2/g' input.csv

以上关于命令的介绍只是抛砖引玉,关于他们的使用,我们的电脑中已经给我们提供了详细的介绍,只需要在命令行中输入man commandname就可以了,除此之外,很多的命令也也提供了简单的帮助,只需要输入commandname help, command --help之类的就可以看到。

如果仅仅是语言层面的功能的话,shell相比python是没什么优势的,但是它能够和其他的命令无缝的使用,并且被Mac,Linux,Unix内置可直接使用也是它的一大优势。此外我们还可以通过shell脚本来增强我们的Linux终端,比如说可以定义自己的函数,通过.bashrc引用,可以在终端中直接调用方法名执行。

通过Shell,在Linux下面的体验得到很好的提升,工作效率也可以获得很大的提高,本文只是略微提到其皮毛,希望能够引起你对Shell的兴趣,如果想要更加深入的了解,还是需要去阅读手册或者书籍。

以下是推荐的一些资料可供参考:

  1. Bash脚本编程入门 by阮一峰
  2. Bash脚本进阶指南
  3. Grep,Sek和awk的区别
  4. 《Linux命令行与Shell脚本编程大全》(可以在微信读书中看电子书)
  5. awesome-shell (值得看看的各种资料,也可以去看看别人写的shell脚本)

看完评论一下吧

Linux重装与dotfile整理分享

2024年12月15日 20:05

最近把电脑上面的Linux系统给重装了,同时呢也要配置新的MacBook,就整理了一个个人的dotfile,这里分享一下linux上的我主要使用的软件,以及我的dotfile内容。

什么是Dotfile

dotfile字面意思就是以.开头的文件,在Linux当中就是隐藏文件,我们大家说的一般指的就是配置文件,比如shell的.bashrc.profile文件等。我在整理自己的dotfile的时候参考了一些网上大神的dotfile文件,这里我主要是包含我的shell的一些配置文件,vimgitrime相关的文件。

我的 Dotfile

为了保持Linux和Mac系统的统一, 我将Linux的Shell也换成了zsh,同时为了简单并没有使用oh-my-zsh,只是添加了一些自己常用的aliases

而Vim则使用neovim,它相当于是重新开发的,我想比vim应该代码上面更加高效,毕竟少了很多的历史包袱。另外它的配置文件可以使用Lua进行编写,而不是使用vim script,这样也是它的一大优点。

除了配置之外,还增加了脚本用用于将这些配置文件自动拷贝到对应的目录,使用以下代码判断是Linux系统还是Mac系统:

1
2
3
4
5
if [ "$(uname -s)" == "Darwin" ]; then
 //action for mac
else
 //action for linux
fi

另外呢,对于Mac系统,在初始化脚本中还添加了homebrew的安装,并且通过使用Brewfile在定义需要安装的一些软件,这样在执行brew bundle的时候可以把这些软件都安装上去。

对于Linux的目前还没做啥,都是通过自己手动安装的,不过一些操作也记录到了shell文件当中了。

Linux上的软件

既然写了文章,就顺便分享一下我的Linux上面还在用的软件吧。 首先是Shell,为了跟Mac保持统一,也改用了zsh,如果你也想要设置zsh为你的默认shell,可以执行如下命令并重启(前提你已经安装的zsh):

1
 sudo chsh -s $(which zsh) $USER

编辑器目前在用的有三款,主要在用neovim,同时代码文件还会使用vscode,因为有些场景neovim操作比较麻烦(对于快捷键不太熟悉),最近也在使用阮一峰老师之前推荐过的zed,据说比vscode性能更高,目前体验是对于很多语言的支持是已经内置了,不需要在安装插件,这点是好评的。

输入法在使用Fcitx5,输入方案则是使用了Rime,Rime的配置则是参考了雾凇拼音,而我主要使用小鹤双拼。

其他还在使用的软件包括:

项目开发: Android studio

截图软件:Flameshot

启动器: ULauncher, 使用简单,支持的插件数量也比较多

文档搜索: Zeal doc,mac 上面dash的window和linux平台开源版本,支持dash的文档。

文件同步: Syncthing

局域网文件传输: LocalSend

聊天软件: Weixin, telegram

文档和博客编辑: Obsidian

网页浏览器: Edge

Linux 开启zram

我的电脑已经有32G的内存了,大部分时候是够用的,但是编译Android系统的时候就不够用了。因此需要想办法,一种方式是弄一个swap空间,但是swap的速度不是很快,经过查询资料了解到现在linux已经有了一种新的虚拟内存技术,也就是zram,它主要功能是虚拟内存压缩,它是通过在RAM中压缩设备的分页,避免在磁盘分页,从而提高性能。

而想要启用它其实很简单,在我们的Ubuntu中,只需要首先关闭原先的swap空间,编辑/etc/fstab文件,将其中的swapfile条目注释掉。之后调用如下命令:

1
sudo swapoff /swapfile

如果你本来就没有设置swap,那就不需要做上面的操作,直接安装zram-config:

1
2
3
sudo apt install zram-config
systemctl enable zram-config //设置开机启动开启zram的服务
systemctl start zram-config //启动zram服务

之后可以调用如下命令验证:

1
cat /proc/swaps

我们在系统监控里面也能看到,不过还是swap。 以上方式开启的zram为物理内存的一半大小,当然也是可以修改的。 修改/usr/bin/init-zram-swapping文件中的mem大小即可。

如果对于我的dotfile感兴趣,可以查看我的repo, 地址为: https://github.com/sangmingming/dotfiles,其中我提到的初始化脚本为script/bootstrap文件。

看完评论一下吧

威联通NAS购入初体验以及设置记录

2024年10月29日 21:57

之前是用树莓派连个两盘位硬盘盒运行一些服务,由于它的稳定性加上容量不够,一直想弄一个NAS,趁着双十一到来,就入手了威联通的NAS,本文介绍 一下购入的抉择以及NAS的初始化和相关的设置。

缘起

NAS这个东西知道了很多年了,一直想要搞一个,迫于家里花费的紧张,之前一直是使用一台树莓派4B,其中刷了Openwrt系统,挂载了两块盘的硬盘盒,其中开启了Webdav, Samba,Jellyfin相关的东西。不过因为Jellyfin挂载阿里云盘速度不太理想,有不少视频还是下载到自己的硬盘里面的。同时内,硬盘也出现了拷贝大文件就出现问题,需要重启硬盘盒和系统的问题,这个后续会继续说。

DIY NAS硬件或者成品的NAS也关注了有挺长一段时间,迫于以上问题,以及文件越来越多,当时买的这两块2T的硬盘,容量已经不够用了,想要购买一个NAS的想法更加加强,终于决定今年双十一搞个NAS。

剁手

购买NAS是有两个选择,自己组装硬件,安装飞牛或者黑群晖等NAS系统,又或者购买群晖、威联通等成品NAS。在V2EX发帖求助,以及自己的纠结中,最终在性价比和稳定性等各种因素比较之后,选择入手了威联通TS464C2。

威联通的系统虽然被大家诟病许久,但是它也算是市场上除了群晖之外NAS系统做的最久的厂家了,考虑到文件的安全可靠在文件系统和系统稳定性上面,这两家还是要比国内的新起之辈更加值得信赖的。而我选择的这一款,支持内存扩展,如果以后服务比较多,可以再增加一根内存。4个3.5寸硬盘位加上两个NVME 硬盘位,对于容量的扩展应该很多年都不存在问题了。双十一这块机器只要2000块钱就拿下,而群晖同配置的4盘位差不多要四千,只能说高攀不起。

另外下单了一块国产的NVME 2T硬盘,加入Qtier存储池,希望能提高一些速度。为了拥有更大的容量,经过一些研究,淘宝购入了一块2手服务器硬盘,型号为HC550, 16TB,回来看Smart信息,已经运行了786天,不过其他信息看着都不错。

上电

收到机器,插上硬盘,参照指南开始初始化。威联通提供了比较友好的初始化方法,可以通过网页或者应用对它进行初始化,不过一定要插上硬盘才能开始这一切。

根据指南初始化之后,开始了硬盘的初始化和存储池的设置。之前使用的openwrt中对于硬盘的管理是比较简单的,基本就是实现了基础的Linux功能,把磁盘挂载到指定的目录,硬盘初始化之类的。而QNAP中,“存储与快照总管应用”中,对于硬盘和存储卷的设置则全面,可以设置各种raid的存储池,Qtier,快照,卷等等,也有硬盘的运行情况的显示。我想这就是选择大厂成品NAS的原因,毕竟docker之类的东西大家都很容易做,但是这种积累了很多年的东西不是那么快能够做出来的。

安装软件

在威联通NAS中安装软件可以选择从QNAP的应用中心安装应用,也可以安装Container Station之后通过docker来安装。不过官方的应用中心中的应用中主要是一些官方提供的应用,这个时候我们可以选择第三方的应用中心,这里我推荐一个: https://www.myqnap.org/repo.xml,官方应用商店没有的可以来这里试试。不过这个应用商店中的部分应用是收费的,比如Jellyfin,它提供的版本需要依赖Apache,这个时候你需要去它的网站上面购买,价格还不便宜,当然我是不会去购买的。

除了应用中心安装之外,我们还可以去网上找QPKG文件,比如Jellyfin,我就是使用的pdulvp为QNAP定制的版本,下载地址在:https://github.com/pdulvp/jellyfin-qnap/releases。Jellyfin我不使用官方的docker版本有两个原因,一是使用这个定制版本,可以方便的使用英特尔的集成显卡进行视频的硬解,另一方面是使用docker的化,默认只能映射一个媒体目录到Docker中,想要映射多个目录会麻烦一点,因此使用QPKG更方便。

对于其他的应用,比如FreshRss, VaultWarden则是选择了使用Docker进行部署,Container Station的Docker部署为先写一个compose文件,之后软件会帮助下载相关的容器进行启动,这个有个问题就是创建完compose之后,容器启动起来之后,在web界面上就没法编辑compose文件了,想要编辑的需要用ssh进终端去看,比如我创建的app-freshrss它的compose文件就在/share/Container/container-station-data/application/app-freshrss当中。

另外威联通自带的一些应用,文件管理,QuMagie,特别要说一下QuMagie,它已经可以帮我把相片按照人物,地点,物品等等分类好了,配合上手机App使用流畅很多,再也不用之前那样使用SMB手动同步了。

其他

目前用了这个二手服务其硬盘加上新买的固态硬盘组了一个Qtier池作为主要存储区,家里有块旧的sata固态硬盘就把他搞成高速缓存加速了。原来的两块酷狼硬盘都是EXT4格式,但是插到QNAP上却不能识别,只好放在原来的设备上,新NAS通过Samba访问原先的设备,把文件拷贝过来。

之后把旧的硬盘插上来使用才发现,其中一个硬盘出现了坏道,数量还不少,感觉它应该命不久矣,不敢放什么东西上来了。 而另一块好的硬盘,准备把它作为备份盘,相片,笔记和其他的一些重要文件都定期备份到这个盘上面。因为硬盘数量优先,并没有组RAID还是空间优先,只把重要的文件备份但愿以后不会踩坑。

以上就是这个新NAS的初体验了,后面还要继续增加新的应用,仍然需要摸索,外网访问仍然沿用家里的DDNS和端口转发。目前才用了不到一个星期,还有很多东西没有用到没有涉及,后面有新的体验来再继续写文章分享,也欢迎玩NAS网友一起交流分享,如果有好玩的应用也欢迎评论推荐给我。

看完评论一下吧

解决Ubuntu下Sublime text 3中文输入的问题

2014年3月15日 00:24

好久之前便听朋友说起Sublime Text这款软件很好用,终于这几天有空折腾,把软件给装起来了。用起来确实很不错,写代码很爽。
但是用了一段时间之后,我需要输入中文了,无论怎么切换输入法,都无法切换到中文。

网上搜索了一下,原来这是Bug。找解决方法吧。下面介绍我的解决方案,是大神cjacker解决成功的啦,我只是copy一下,方便大家在遇到这个问题的时候可以方便解决。

 我的系统:ubuntu 13.04
我的输入法:fcitx
sublime版本:3059

理论上支持 sublime text2/3

1.保存代码sublime-imfix.c

/*
sublime-imfix.c
Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
By Cjacker Huang <jianzhong.huang at i-soft.com.cn>
gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
LD_PRELOAD=./libsublime-imfix.so sublime_text
*/
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
typedef GdkSegment GdkRegionBox;
struct _GdkRegion
{
long size;
long numRects;
GdkRegionBox *rects;
GdkRegionBox extents;
};
GtkIMContext *local_context;
void
gdk_region_get_clipbox (const GdkRegion *region,
GdkRectangle *rectangle)
{
g_return_if_fail (region != NULL);
g_return_if_fail (rectangle != NULL);
rectangle->x = region->extents.x1;
rectangle->y = region->extents.y1;
rectangle->width = region->extents.x2 - region->extents.x1;
rectangle->height = region->extents.y2 - region->extents.y1;
GdkRectangle rect;
rect.x = rectangle->x;
rect.y = rectangle->y;
rect.width = 0;
rect.height = rectangle->height;
//The caret width is 2;
//Maybe sometimes we will make a mistake, but for most of the time, it should be the caret.
if(rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) {
gtk_im_context_set_cursor_location(local_context, rectangle);
}
}
//this is needed, for example, if you input something in file dialog and return back the edit area
//context will lost, so here we set it again.
static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context)
{
XEvent *xev = (XEvent *)xevent;
if(xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) {
GdkWindow * win = g_object_get_data(G_OBJECT(im_context),"window");
if(GDK_IS_WINDOW(win))
gtk_im_context_set_client_window(im_context, win);
}
return GDK_FILTER_CONTINUE;
}
void gtk_im_context_set_client_window (GtkIMContext *context,
GdkWindow *window)
{
GtkIMContextClass *klass;
g_return_if_fail (GTK_IS_IM_CONTEXT (context));
klass = GTK_IM_CONTEXT_GET_CLASS (context);
if (klass->set_client_window)
klass->set_client_window (context, window);
if(!GDK_IS_WINDOW (window))
return;
g_object_set_data(G_OBJECT(context),"window",window);
int width = gdk_window_get_width(window);
int height = gdk_window_get_height(window);
if(width != 0 && height !=0) {
gtk_im_context_focus_in(context);
local_context = context;
}
gdk_window_add_filter (window, event_filter, context);
}

2.安装C/C++的编译环境和gtk libgtk2.0-dev

sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev

3.编译共享内存

gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC

4.启动测试

LD_PRELOAD = ./libsublime-imfix.so sublime_text

正常的话这样是没有问题的。

然后我们在修改我们的desktop文件,使图标也可以使用

sudo vi /usr/share/applications/sublime-text.desktop

先将so文件移动到sublime text的目录

然后按照如下替换(主要是每次执行之前,去预加载我们的libsublime-imfix.so库)

[Desktop Entry]
Version=1.0
Type=Application
Name=Sublime Text
GenericName=Text Editor
Comment=Sophisticated text editor for code, markup and prose
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text' %F
Terminal=false
MimeType=text/plain;
Icon=sublime-text
Categories=TextEditor;Development;
StartupNotify=true
Actions=Window;Document;
[Desktop Action Window]
Name=New Window
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text' -n
OnlyShowIn=Unity;
[Desktop Action Document]
Name=New File
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text' --command new_file
OnlyShowIn=Unity;

看完评论一下吧

编译安装启动器 Synapse

2015年5月9日 08:00

Synapse 是一个类似 Gnome-Do 的语义型启动器(sementic launcher),只要输入部分字符就可以匹配相应的文件或程序,能够有效地提高工作效率 —— 特别是对于 Emacs/Vim 用户来说

synapse.png

网上能找到关于该软件的更多介绍以及安装方法,不过大都是介绍如何通过 PPA 来安装,我不太喜欢这种方式,加上 Debian 因为 Synapse 的不稳定而把它移出了软件仓库,所以我只有选择编译安装了。所以本文只是一篇水文啦,在这里简单地把自己编译过程里遇到的坑分享出来,如果有人也编译安装的话,希望能有所帮助。

源代码下载链接在此

Synapse 的依赖有:

  • libnotify-dev
  • libjson-glib-dev
  • libkeybinder-3.0-dev
  • libgee-0.8-dev
  • libzeitgeist-2.0-dev
  • valac

前面 lib 开头的是 Synapse 依赖的库,从软件仓库安装即可,另外 Synapse 还依赖 gtk 的几个库,但是没记录下来,所以不记得对应的库的名称了。不过这些依赖都在源代码包中的 configure 这个脚本里面写了。在 Synapse 0.2.99.1 (我用的版本) 中,configure 中的依赖列表是这样的:

  • glib-2.0
  • gdk-x11-3.0
  • gtk+-3.0
  • gio-2.0
  • gio-unix-2.0
  • gobject-2.0
  • gthread-2.0
  • gee-0.8
  • json-glib-1.0
  • keybinder-3.0
  • libnotify

除了这些库依赖外,由于 Synapse 是 Vala 语言编写的,还需要安装 Vala 编译器 valac。

在完成以上依赖安装后,就可以进行 Synapse 的编译安装了:

./configure --prefix=/opt/synapse
make
make install

Done!

自定义Git

2014年8月2日 08:00

配置及配置文件

Git可以使用命令

git config

来进行自定义设置,而这些设置,最终都会被写入对应的配置文件中,然后在适当的时候加载这些配置文件,来确定Git被使用时的一些表现。

Git会在三个可能的地方寻找配置文件

  1. 系统级全局配置文件:/etc/gitconfig,对操作系统上所有用户都起作用
  2. 用户级全局配置文件:~/.gitconfig,对用户的所有代码仓库起作用
  3. 代码仓库级配置文件:<repo>/.git/confg,只对当前对应的代码仓库起作用

Git按照上面的顺序依次寻找配置文件并用其设置Git。

第一个配置文件可能存在也可能不存在,在我的Debian上它是不存在的,可以通过命令:

git config --system

来进行读写。

第二个配置文件可以通过命令:

git config --global

来进行读写。

第三个配置文件可以在相应的代码仓库目录下,通过命令:

git config

来进行读写(注意,不带 –global 选项)。

以上命令都是用于在命令行中对Git的某个设置项进行设置,如果需要打开文件直接编辑,除了在编辑器中来直接打开文件,还可以通过命令:

git config -e

来进行。在其后加上 –system 则会打开/etc/目录下的gitconfig;加上 –global 则会打开用户HOME目录下的配置文件.gitconfig;而在某个代码仓库目录下执行且不加 –system 也不加 –global 选项时,则会打开该代码仓库下的配置文件进行编辑。

在配置文件中,以 '#' 或 ';' 开始的的行会被忽视,即这两个符号被用作注释符。

配置文件的内容形式如下:

[user]
    name = linusp
    email = linusp1024@gmail.com
[credential]
    helper = cache --timeout=3600
[color]
    ui = true

被中括号括起的内容被称为Section,其下有许多

xxx = xxx

的内容,其中等号前面的部分就是实际的配置项,后面的则是该配置项的值。要设置某个Section下面的项的值,以Section user下的name为例,可以通过如下命令:

git config --global user.name linusp

Git 提供了很多的可配置项,具体可以执行

git config --help

然后到 "Variables" 一节查看。

配置: Section user

user下的配置项主要是用于在线认证的,比如说Github。

  • user.name

    设置用户名,比如我在Github上的用户名是'Linusp',那么就设置:

    git config --global user.name Linusp
    

    如果公司使用Git进行代码管理,这一步也是需要的.

  • user.email

    设置邮箱,同上,用于认证。

配置: Section core

  • core.filemode

    设置是否检查文件权限,其值默认为'true',对同样内容、名字的文件,如果其文件权限发生了改变,则会认为发生了'修改'。如果要忽略文件权限的检查,可以将该项的值设置为'false':

    git config core.filemode false
    
  • core.ignorecase

    设置是否忽略文件名大小写的区别,默认为'false',即默认情况下是大小写敏感的。在Windows的文件系统上,将这个项的值设置为'true'可能会比较常见

  • core.autocrlf

    设置Git对行尾的换行符的处理方式。这个设置项主要是为了解决跨平台开发时Windows操作系统与*nix系统上换行符不一致的矛盾。其值有三个可能:

    1. true

      设置为该值时,代码仓库里的代码会保证以*nix的换行符结尾,在用户提交时会把Windows的换行符替换为*nix的换行符,但在用户checkout后将会替换成Windows的换行符。在Windows环境下开发但其合作者中在*nix系统下开发的用户可以将'core.autocrlf'项的值设置为'true':

      git config core.autocrlf true
      
    2. input

      设置为该值时,代码仓库里的代码和checkout的结果都会保证以*nix的换行符结尾,如果提交时的文件中存在Windows的换行符,Git会将其替换为*nix的换行符。

    3. false

      设置为该值时,Git不对文件行结尾的换行符进行检测和处理。

  • core.excludesfile

    设置一个文件,文件中包含一些文件名或者正则表达式,代码仓库中被匹配到的文件将会被视为不是代码仓库中的文件,既不会检查其改动,在执行'git add'的时候也会自动忽略它们。

    在代码仓库中建立名为.gitignore的文件能起到相同的作用。

  • core.editor

    设置'git commit'时编辑提交信息的编辑器,如要设置为vim,则:

    git config --global core.editor vim
    
  • core.pager

    设置在执行'git log'等包含大量输出的命令时的分页器,默认为'less',通过这个项可以将其设置为'more',或者设置为空以关闭分页输出:

    git config core.pager ''
    

配置: Section color

该组配置可以让Git在输出时进行着色——默认情况下都是不着色的,而着色有助于阅读,比如在执行'git diff'和'git log'的时候。

以下命令将会使'git diff'、'git log'、'git status'等带输出的命令对输出进行着色。

git config --global color.ui true

当然也可以打单独对某个命令的输出进行着色设置:

git config --global color.diff true

Bash 3.x 与 Bash 4.x中declare命令的区别

2014年7月28日 08:00

问题

今天下午的时候,测试的妹子说我写的脚本出了问题,跑过去一看,出错提示是:

declare: -A: invalid option

我写的脚本里有两处使用

declare -A

分别定义了一个关联数组

一开始很诧异,这你的'declare'和我的'declare'还能不一样了?尝试了一下,还确实是不一样,妹子机器上的'declare'命令压根就没有'-A'这个选项。

Bash 版本

'declare' 是 Bash内建的命令,既然两台机器上的'declare'不一样,那应该Bash也会不一样吧?抱着这样的心理,分别看了下两台机器的Bash版本。

果然,出问题的机器上,Bash版本是3.x,而我的机器上的Bash版本是4.x。在网上搜了一下相关信息,才知道关联数组是在Bash 4.x中才支持的。这就是问题的原因了。

也懒得继续用关联数组了,毕竟要适配不同的Bash版本,工作量还是略大。反正两个关联数组是用来存中间结果的,于是索性写到两个临时文件里去了,稍微多做了一点处理就OK了。

后记

这么短的博客难道不是在凑数吗?

真没有啊!_(:3」∠)_

❌