2020年5月

最近入门路由器,突然开始考虑是不是该换掉自己电脑上这个只有2.4G的无线网卡了,然后搜了一下AC7265,发现似乎。。黑苹果有戏了?

苍蝇搓手.jpg

然后当时是为了保险起见,把上一版的Clover备份了一下(在EFI分区中的文件夹名从默认的CLOVER加了个后缀),然后再从新文件夹里的efi文件启动,发现不但背景变成默认的灰色了,就连配置文件都没了。

经过尝试后发现。似乎Clover读取配置文件的位置是硬编码的,只能从efi/CLOVER中读取。而且似乎不从同一位置启动还读不到。

最后的解决方案是,如果要在ESP分区内进行Clover备份的话,需要配置冗余,因为只能从CLOVER文件夹启动。当然如果自己重新从源码编译的话应该可以解决该问题。

  1. 获得一个公网IPv6地址;
  2. 在服务器上监听IPv6端口(记得监听地址是::(等价于IPv4的0.0.0.0)而不是::1(等价于IPv4的127.0.0.1));
  3. ip6tables上给监听的端口(一般是80/443吧)开个洞(可以抄22端口的,一般ipv6的ssh应该是会自动启用的吧);
  4. 可以使用IP:端口名进行测试了。
  5. 如果要使用域名的话,记得添加的是AAAA记录,不用放中括号。

简单流程,仅供排错参考

成品效果参考:http://6.esperz.tk/

最近的破事真的是超级无敌加倍多= = neu6不知道为啥打不开了

本来想给服务器配一个ipv6的站点的,结果不但没配好,还发现服务器登不上去了。。

可以使用ssh <user>@<host> -vvv命令来获取更加详细的调试信息

到网上转了一圈,发现说是TCP的MTU太大,可能因为包截断的原因导致信息丢失,最终的结果就是连不上。

参照这个:http://www.snailbook.com/faq/mtu-mismatch.auto.html

似乎暂时性地解决了?

但是就离谱,用ipv6连接就是不会出现这种问题

=============================================
后续更新

后来似乎发现问题了。。是使用的网络问题
只要使用寝室的移动宽带,铁定卡在debug1: SSH2_MSG_KEXINIT sent这里,然后就连接中断了,换成手机流量(还是移动的)马上就好了
猛男落泪.jpg

决定开头先上一张图来表达我的心情。

不愧是巨硬.jpg

因为巨硬一个神奇的操作,本人在晚上折腾了快一个小时后,才把问题解决。

在写报告的时候,花花绿绿的代码自然是不可少的,充斥着报告主体的源代码,如果是千篇一律的黑色的话,想必观看者会没有一丝的好心情吧。用黑白打印机的guna

结果,今天在写报告的时候发现,居然代码高亮没了。

没了? 没了?? 没了???

而且没的十分彻底,Word里都只提供粘贴文本选项,这说明格式根本就没有被从VS里复制出来。。。

不调字体的报告,简直连自己都不想看啊= =

于是,四处网上冲浪,企图寻找解决方法,期间经历了:

对Visual Studio版本的质疑?(即只有早期版本才自带该功能,VS2015之后的都不能带样式复制)——这显然不现实,几个星期前我还用过这个功能的。

开启HTML格式的带样式复制?——对于C/C++代码来说,并没有用

需要装插件?——名字似乎是叫PowerTools,但是扩展商店里根本找不到这个名字的插件= =

快捷键Ctrl + Shift + C/V?——不存在的,一个是打开什么选项卡,另一个是查看剪贴板

就在即将放弃搜索,寄希望于下一版的更新能够修复这个问题的时候,突然想起了之前因为看到VS16.6提供了对Doxygen的解析功能之后,欣喜若狂地从16.4更新到16.6版本的这件事。

莫非是加了新设置?

无独有偶,就在内外网的有效资源即将搜索殆尽之时,突然注意到,RTF, Rich Text Format富文本一词的出现频率不低。仔细回想,RTF是一种开放的文本格式,带格式的文本很有可能就与这个有关。

带着一丝希望,我打开了VS的选项界面,搜索了一下rtf,竟然真的有结果:文本编辑器-高级。仔细找找,发现其中并没有与RTF有任何相关的关键字,但是有一个在复制/剪切时复制格式文本选项。是不是就是这个?

实践证明,就是它。勾上了以后,再去复制代码到Word里,就有正常的样式了= =

我又回过头去,仔细确认了一下VS16.5和16.6的发行说明,并没有提到跟复制粘贴格式相关的改动。难道这就是尾大不掉?

后记:明明选项名称中是有复制两个字的,但是之前搜索复制的时候出不来,一搜RTF才出来,严重怀疑索引没汉化

用Linux也有几个年头了,最长碰见的问题就是,不同的程序对于同一套基础软件有着不同的版本需求,比如Python2/Python3,Java8/Java11,以及各个版本的gcc等等。然而,由于太懒一直没有找到一个好的软件版本管理工具。

可是这次在玩Rock64的时候,被mawk活生生地坑了一把,还顺便学会了update-alternatives这个基本命令= =

起因是Rock64的swap虚拟内存。秉持着内存多大,swap就应该有多大的传统思想,看到我4G内存的Rock64只有1G的swap,心里甚是不爽,于是决定修改配置文件来把swap修改到至少2G以上。

由于编写系统的人不同,初始化系统swap的脚本位置也不同。在Armbian的系统下,使用的swap也是压缩的zram,初始化的脚本位置在/usr/lib/armbian/armbian-zram-config

可以看到其中激活zram作为swap分区的函数activate_zram_swap,截取其中的关键部分如下:

# Load zram module with n instances for swap: one per CPU core, $ZRAM_MAX_DEVICES
# defines the maximum, on modern kernels we overwrite this with 1 and rely on
# max_comp_streams being set to count of CPU cores or $ZRAM_MAX_DEVICES
uname -r | grep -q '^3.' && zram_max_devs=${ZRAM_MAX_DEVICES:=4} || zram_max_devs=1
cpu_cores=$(grep -c '^processor' /proc/cpuinfo | sed 's/^0$/1/')
[[ ${cpu_cores} -gt ${zram_max_devs} ]] && zram_devices=${zram_max_devs} || zram_devices=${cpu_cores}
module_args="$(modinfo zram | awk -F" " '/num_devices/ {print $2}' | cut -f1 -d:)"
[[ -n ${module_args} ]] && modprobe zram ${module_args}=$(( ${zram_devices} + 2 )) || return

# Expose 50% of real memory as swap space by default
zram_percent=${ZRAM_PERCENTAGE:=50}
mem_info=$(LC_ALL=C free -w 2>/dev/null | grep "^Mem" || LC_ALL=C free | grep "^Mem")
memory_total=$(awk '{printf("%d",$2*1024)}' <<<${mem_info})
mem_per_zram_device=$(( ${memory_total} / ${zram_devices} * ${zram_percent} / 100 ))

可以看到,脚本获得系统的内存容量,然后按照预先设置好的比例建立好zram的分区大小。奇怪的是,按照脚本设计,zram大小应该是系统内存的一半实际上只有四分之一。

这是为啥呢?好问题。

在我多次修改swap分区比例,并重启测试之后发现,似乎脚本所识别到的内存容量只占总内存容量的一半。在我手动执行了上面的相关代码后,露出了端倪:awk的数据大小有限制。系统所自带的awk,允许的最大整数为2147483647,使用再大的数输入awk,输出的整数结果都不会超过这个数,而这恰好是一个32位有符号整形的最大值。

在网上冲浪后发现,实际上Debian最小化安装版(听名字应该能发现Armbian是Debian家的吧)中,默认自带的awkmawk,查看版本可以发现这玩意还是1996年11月的,怎么想支持64位数据的可能性都不大= =(ps. 查了一下,amd64指令集的提出是2000年,产品最早出现在2003年)

然后就要感谢大公无私的GNU了。作为awk的后继,GNU组织开发了gawk,在实现awk原有功能的基础上添加了大量插件库(虽然我还没用到过),不必多想,64位数据的问题自然早已解决。

安装完gawk后,实际上系统是把/usr/bin/awk最终重定向到了gawk的可执行文件。根据上文表述可以推测,Debian的非最小化安装版本的默认awk不是mawk,而是gawk。这也是为啥只有在嵌入式设备上才容易发生这类问题的原因了吧= =

为什么说是最终呢?观察/usr/bin/awk的指向可以发现,它并非直接指向/usr/bin/gawk,而是指向了/etc/alternatives/awk。这就引出了本文的后半篇内容,update-alternatives命令。(名字又臭又长的,一度以为是ubuntu用户专属命令

update-alternatives是Linux下的一个标准命令。简单解释来说,就是允许在系统中安装同一个软件包的多个版本,并且根据需求修改默认调用软件包版本的版本。比如在本文前半篇中的场景,一个系统中可能同时安装了mawkgawk,两者的基本功能完全一致,到底使用哪一个awk作为默认的这个工作,就可以通过update-alternatives配置软链接轻松完成。

常用命令:

update-alternatives --get-selections # 查看当前所有存在配置的文件(似乎还可以配置程序库)
update-alternatives --config <name>  # 使用交互方式设置该条目的默认配置;如果留空,对当前系统中存在的所有条目依次进行配置