0%

我为了清理 bash 和 zsh 的重复历史记录写了个脚本(remove_duplicate_cmds.py),在每次登录的时候(间隔时间超过阈值)都会执行一次,最近每次都会报错,报错信息如下所示,挺烦的,每次我都会手动找出有问题的那一行,然后重新运行,但是这样治标不治本,隔两天又报错,需要想一个彻底解决问题的办法。

1
2
3
4
5
6
7
8
9
10
11
/home/taseikyo/.bash_history 198 -> 198
Traceback (most recent call last):
File "/home/taseikyo/remove_duplicate_cmds.py", line 99, in <module>
main()
File "/home/taseikyo/remove_duplicate_cmds.py", line 95, in main
zsh_history()
File "/home/taseikyo/remove_duplicate_cmds.py", line 76, in zsh_history
for cmd in f:
File "/usr/lib/python3.6/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 3549: invalid start byte

其实就是 .zsh_history 这个文件的编码问题,就算你设置它为 utf-8 编码,它在写历史记录的时候又改回去了就很蠢,网上找的方法说是设置 LC_ALL 和 LANG 为 en_US.UTF-8,其实没啥用,咋办呢,只能每次出错就手动改编码。。。用 vim 打开,使用命令 set encoding 可以看到它的编码是 latin-1,需要改为 utf-8,set encoding=utf-8 就行了。

话说回来,这也是个指标不治本的方法,除非找到它写历史记录的位置,让其以 utf-8 编码打开。都啥年代了,为啥还不改成 utf-8 编码,别人 bash 的历史记录就是,这就是所谓的有得有失?

要是有更好的 xsh 出现,我直接换,zsh 虽说提示方便,但是很多地方不如 bash,明明有的命令存在,给我报错找不到,服了。

之前就听说过 pathlib 这个库,是从 3.4 加入的,由于习惯了 os 的相关操作,一直没有改,今天又查了一下,觉得还是转了,毕竟 pathlib 相关操作确实简单一些。

1
2
import os
from pathlib import Path
  • 判断某路径是否存在
1
2
os.path.exists("foo/tmp.txt")
Path("foo/tmp.txt").exists()
  • 创建文件夹
1
2
3
4
5
6
if not os.path.exists("foo"):
os.mkdir("foo")

p = Path("foo")
if not p.exists():
p.mkdir()
  • 遍历文件夹
1
2
3
4
5
6
7
8
9
10
for file in os.listdir("foo"):
print(file)

p = Path("foo")
for file in p.iterdir():
print(file)

# 根据所给的通配符遍历
for file in p.glob("*(2)*"):
print(file)
  • 判断是文件/文件夹
1
2
3
4
5
os.path.isdir("foo")
Path("foo").is_dir()

os.path.isfile("foo")
Path("foo").is_file()
  • 创建空文件

这个 touch 是不是很熟悉?

1
2
3
p = Path("foo/tmp.txt")
if not p.exists():
p.touch()
  • 打开文件
1
2
3
p = Path("foo/tmp.txt")
with p.open(encoding="utf-8") as f:
f.read()

还有很多好用的方法,具体可以看 pathlib — 面向对象的文件系统路径 官方文档。

做单推死路一条,做 DD 千刀万剐。

最近小伞(缀目日伞)的毕业消息让我刷到这句话,我入坑不久也算是稍微能体会到他们的心情吧。

由于我开始看 V 时间并不算长,将自己的一个入坑经历记录下吧:

从去年底偶然一次刷到心萪直播间,感觉皮好看,整活也有趣就随手点了关注,后面周五直播偶尔看看,那个时候更喜欢看 PUBG 的直播,所以看心萪其实也不多,再后来新科动漫发布公告才知道中之人出事了,当时也没啥感觉,一方面是她自己有问题,另一方面是看得不多;

真正入坑应该是今年三月份心萪复播,从首播到后面基本每周也会看,那个时候真是单推,只看心萪,那个时候觉得日 V 听不懂,也没咋去看;再后面刷到二代目的视频,从评论知道了永远酱,开始了 DD 之旅,这个时候基本只看这两个;由于会一点 PR 所以姑且做了些二创视频,从而加入了心萪水电群,后来一次偶然机会从群里知道了单伶衣。

她是个很喜欢搞怪的孩子,明明认真唱歌很好听,偏偏唱一半开始搞怪(捂脸),但就是这一点很有趣,后面直播也会看,但是我不玩王者荣耀和守望先锋,所以她播这俩的时候我只是偶尔进来发发弹幕跟她互动,因为是个小 V,发的弹幕基本都会念到并且互动,大概这也是一些坚持不放弃铁粉的原因吧,我不明白这么好的 V 为什么不火。后来她的号突然删除了所有视频,签名头像也都换掉了,我一脸懵逼,去粉丝群问,才知道中之人不想播了,连毕业直播都没有就直接消失了,很难受,也有点不理解,为什么不打一声招呼就这么离开了,这个时候我也算稍微理解了那些毕业视频下面评论单推/DD 的心态了。

说到这里,我常看的 V 也就上面提到的三位,也不算很 D 吧(笑),真正开始 DD 之旅得说到团长的奇迹之夜,从团长那里知道了巧克拉拉,知道了 P 家,从而一发不可收拾,声线神似 Aimer 的团长,日本邓丽君 oto,欠揍机场 kmr,欠揍天使 0g0,电子魔女小伞,温柔天使大姐,清楚担当 nano,黑白角龙 mana 烫,可爱猫猫 serena,封面担当紫桃,还有好人帕里等等。看她们直播也挺痛苦的,一方面老是撞车,需要多开浏览器;另一方面不懂日语,完全靠同传。

就在每天开开心心看她们直播的时候,在 12.1 晚小伞的直播中她透露 12 月底将毕业的消息,瞬间直播间被问号铺满,小伞始终笑着说话,但是每位 DD 心里早已抓狂:为什么要毕业,明明才刚起步,刚因为奇迹之夜而开始火起来为什么要突然毕业?因为小伞有自己的工作,并且很忙,所以一直没有签约,也是因为工作没时间跟 ccll 其他的各位一起联动,她给自己的压力很大,最终决定毕业。

最开始看她的直播其实并没有像其他几位吸引我,主要一点就是觉得她的皮不好看,后来听她唱歌直接把我爆炸,不愧是电子魔女,现在倒是替她感到遗憾,明明新衣服都设计好了,就等做好就可以换掉旧皮,却在这个时候突然毕业,不过转视频势后面还是有机会听到她的歌声算是万幸吧。

今天遇到一个奇怪的问题,明明网络是好的,微信可以登,网页正常打开,TIM 就是登不上,一直显示 00001:无法连接到互联网,重启几次没用,把 TIM 更新到最新版,正好昨天(11-23)更新了,还是无法解决,就是报错。

最后在贴吧找到解决办法,这个 win10 更新 tim 登录超时 帖子中给出了解决办法:

@66666huang:打开Windows powershell(管理员)输入:netsh winsock reset,回车最后重启电脑就ok了,希望能帮到大家

输入命令然后重启就好了。

记得之前遇到什么问题也用过这个命令,查了下:

netsh winsock reset 命令,作用是重置 Winsock 目录。如果一台机器上的 Winsock 协议配置有问题的话将会导致网络连接等问题,就需要用 netsh winsock reset 命令来重置 Winsock 目录借以恢复网络。这个命令可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成的参数错误问题。 netsh 是一个能够通过命令行操作几乎所有网络相关设置的接口,比如设置 IP,DNS,网卡,无线网络等,Winsock 是系统内部目录,Winsock 是 Windows 网络编程接口,winsock 工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口,reset 是对 Winsock 的重置操作。当执行完 winsock 的命令重启计算机后,需要重新配置 IP。

解决由于软件冲突、病毒原因造成的参数错误问题,可能是 TIM 或者其他软件搞的鬼吧。

因为在服务器上 OSv 是使用 qemu 启动的,只要将镜像拷贝到另一个节点使用相同/类似的命令肯定也是能运行的,于是简单做了个测试。

应用为 “api-test”,所有相关的文件都在 osv/apps 目录下,各文件如下:

osv/apps/my-api-test/api.cpp

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
/**
* @date 2020-01-09 17:33:41
* @authors Lewis Tian (taseikyo@gmail.com)
* @link github.com/taseikyo
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
int size = 10, newsize = 20;
char *p = (char *)malloc(size);
for (size_t i = 0; i < size; i++) {
*(p+i) = 'A' + i;
}
*(p+size-1) = '\0';
printf("p: %s\n", p);

p = (char *)realloc(p, newsize);
printf("np: %s\n", p);

return 0;
}

osv/apps/my-api-test/Makefile

1
2
3
4
5
6
7
8
9
.PHONY: module
module: api

api: api.cpp
$(CXX) -pie -o $@ $(LDFLAGS) api.cpp

clean:
rm -f api

osv/apps/my-api-test/module.py

1
2
3
from osv.modules import api

default = api.run("/api")

osv/apps/my-api-test/usr.manifest

1
/api: ${MODULE_DIR}/api

编译命令:

1
sudo scripts/build -j40 image=my-api-test

生成的镜像为 “osv/build/release.x64/usr.img”,将其复制到另一个节点。

然后新建另一个运行命令脚本(qemu 的命令是真的又臭又长):

run_osv_img.sh

1
2
3
4
5
6
7
#!/usr/bin/bash

[ ! "$#" -ge 1 ] && echo "输入镜像路径!" && exit 1

[ ! -f $1 ] && echo "文件不存在!" && exit 1

qemu-system-x86_64 -m 12G -smp 4 -object memory-backend-ram,id=ram-node0,size=2G,host-nodes=0,policy=bind -object memory-backend-ram,id=ram-node1,size=10G,host-nodes=1,policy=bind -numa node,nodeid=0,cpus=0-1,memdev=ram-node0 -numa node,nodeid=1,cpus=2-3,memdev=ram-node1 -vnc :1 -gdb tcp::1234,server,nowait -device virtio-blk-pci,id=blk0,drive=hd0,scsi=off,bootindex=0 -drive file=$1,if=none,id=hd0,cache=none,aio=native -netdev user,id=un0,net=192.168.122.0/24,host=192.168.122.1 -device virtio-net-pci,netdev=un0 -device virtio-rng-pci -enable-kvm -cpu host,+x2apic -chardev stdio,mux=on,id=stdio,signal=off -mon chardev=stdio,mode=readline -device isa-serial,chardev=stdio

运行脚本:

1
2
3
4
5
6
7
$ sudo ./run_osv_img.sh usr.img
OSv 0.54.0
eth0: 192.168.122.15
Booted up in 523.01 ms
Cmdline: /api
p: ABCDEFGHI
np: ABCDEFGHI

和在原服务器运行结果是一样的,实验成功!


制作精良的冒险解谜游戏,整体氛围是比较压抑的(画风+音效),戴耳机玩则更有身临其境的感觉。
整体流程不算长,有些关卡还是蛮有难度的,查了下攻略才过(菜)。像“空气冲击波”那段需要卡好时机,不然就直接被轰成渣。
普通结局是[spoiler] 小男孩被吸进一个“大肉球”,将工厂设施捣烂,最终逃离,然后静静地停留在河边,我本来以为会有后续是小男孩离开肉球,没想到就这样结束了,我其实是没太懂这个结局。 [/spoiler]
隐藏结局是[spoiler] 完成所有14个收集,从场景7打开暗门,输入指令,穿过暗道,最后到达一个控制室的地方,当你拔掉电源之后,你就失去了控制,整个画面变黑,然后回到游戏开始界面,我:?(草) 我一脸懵逼,所以这个结局是逃离了还是没有? [/spoiler]

今天(20/11/2)早上在登录服务器后,发现历史记录没了,如下图所示,从 4 开始是今早开始使用的,而前面的重启网卡以及 ps 命令并不是我所使用的,服了,果然在一个公共服务器就很麻烦。

问了几个可能使用登录我账户的同学,结果他们都说没有,然后我使用 last 命令查看近期登录服务器的账户,发现似乎被重启了(应该不是重启,我每次手动 restart 之后登录记录还在),最早的一条记录是(Sun Nov 1 12:27 - 20:08),所以服务器肯定被动过了。

这个没记录没法查是谁动了手脚,最后没办法在 .myrc 最后加了一条声明,算是防君子吧,但是硬要改你东西的人怎么能是君子(笑

1
echo -e "\033[41;37m【请尊重个人隐私】\n\n如果不是本人(Lewis Tian),请不要随便动本人的东西!否则后果自负!\n如果需要使用本人相关文件、脚本,请先联系本人(taseikyo@qq.com),谢谢合作!\033[0m"

上面一段话会以红底白字的形式打印在屏幕上,还算醒目,只不过可能并没有什么用吧。

今天遇到这个问题,打开应用商店一直“灰屏”,底部有错误代码:0x80131500,搜了一下解决办法,前几个都没用,不过都记录一下,万一以后遇到这些办法有效。

  1. 重置应用商店
    • 管理员 CMD - 输入 wsreset
  2. 使用 TLS 1.2
    • 打开“运行”输入 inetcpl.cpl (“WINDOWS”+“R” 键,输入 inetcpl.cpl)
    • 点开高级往下拉,勾上”使用TLS 1.2”选项,或者点还原高级设置
  3. 关闭代理
    • 设置 - 网络和 Internet - “使用代理服务器”关闭

解决的是第三个,之前为了加速 git clone 设置了代理:127.0.0.1:7890,关了之后就好了。舒服!

参考: