0%

依赖问题

由于安装的老版本(humble)ros2, 很多必需包直接安装会报依赖小版本号不一致错误,使用apt install解决是很麻烦的, 于是要用一个比较新的依赖处理工具

1
2
sudo apt install aptitude
sudo aptitude install [package]

在[package]填出问题的依赖,aptitude会弹出建议的一些解决方案,按,.切换到一个降版本的解决方案,yes即可

swap空间不足

已经到了编译这一步了,但是编到最后总是报错

1
C++: fatal error: Killed signal terminated program cc1plus

很搞心态,开新terminal用htop命令一查,cpu内存swap全拉满

这个时候就需要给wsl2扩swap空间, 在 c:\Users\用户名 下找一个叫.wslconfig的文件,找不到就创建一个,填:

1
2
[wsl2]
swap=4GB

填完wsl --shutdown重启一下wsl2, 在wsl的终端free -h可以查看swap分区的大小,当然直接htop自然是可以的

如果rosdep已经初始化过了,还要删掉初始化文件重新初始化一下。执行这个sudo rosdep init会有提示

这个时候再colcon build --symlink-install就万事大吉了

一些感慨

最近学了好多好多东西,有gdb debug, 有rust, 也刷了些题。正在看很有意思的操作系统网课,还有项目组要求看的书…感觉这些事情都忙不过来了,更别说整理成博客。我这个博客网站的archive也一直没好好利用。

不知道我是不是在杞人忧天,但是我意识到最近精神状态欠佳后,自测了双相精神测试,怎么写都是阳性…本来就听说过,症状转移什么的,但是会是我吗?已经,要碎了,但是还在努力把自己收集起来。但也不知道是不是讳疾忌医的心理在作用,医保卡过期了没更新,没拿到新卡不想去看医生…

完全提不起兴致玩游戏,心理上好累又睡不着。大概是最近游戏不好玩吧,大概是没有朋友和我一起玩?大概是游戏打多了忙一忙就觉得游戏好玩了…好多年前我就只有听着Owl City的歌才能睡着了,但那个时候只觉得是自己压力太大。三两年前觉着是实验室事情太多,是画图太累,后来安慰自己年轻人熬熬夜怎么了。

很多年前还小的时候我就总觉着,如果社交上出现一些问题,那个念头就会总在脑子里转动消不去,到了有点影响生活的地步了。我总被这样的思绪叨扰,我没办法解释这种事情,只好跟家长说我头疼。我以为是我性格太执拗,是我太内向,是我表达的方式不对…哦,我该改改总是自我检讨的毛病,所作所为,留予世人评好了
(↑但是这句话也是在自我检讨…哪来的世人啊我嘞个超绝圈子小的缩头乌龟麦子老师哎)

好歹还能感受到朋友的关心,好歹还有兴致吃点什么,好歹今天中午睡得不错。

bash的一些特殊变量表示

似乎这些东西总是偶尔能看到,放到这里方便查阅

$0 - 脚本名
$1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。
$@ - 所有参数
$# - 参数个数
$? - 前一个命令的返回值
$$ - 当前脚本的进程识别码
!! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !!再尝试一次。
$_ - 上一条命令的最后一个参数。如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值。

GCC编译

gcc编译hello.c,指定输出为hello:

1
gcc hello.c -o hello

运行可执行文件:

1
./hello

一个简单的Makefile示例

1
2
3
4
5
hello:hello.c   # 目标文件名:依赖文件列表
gcc hello.c -o hello # 用于生成目标文件的命令序列
.PHONY: clean # 声明伪目标,使用make clean执行clean操作而不是生成clean文件
clean:
rm hello

debug bash脚本

直接输出:

1
echo "function_name(): value of \\$var is ${var}"

可以在脚本shebang列设置需要使用的xtrace选项:

1
#!/bin/bash -x

仅在指定列设置xtrace选项:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
read -p "Path to be added: " $path
set -xv
if [ "$path" = "/home/mike/bin" ]; then
echo $path >> $PATH
echo "new path: $PATH"
else
echo "did not modify PATH"
fi
set +xv

使用trap,EXIT模式仅检测退出时状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
trap 'echo score is $score, status is $status' EXIT
if [ -z $1 ]; then
status="default"
else
status=$1
fi
score=0
if [ ${USER} = 'superman' ]; then
score=99
elif [ $# -gt 1 ]; then
score=$2
fi

DEBUG模式可以检测每步状态:

1
trap 'echo "line ${LINENO}: score is $score"' DEBUG

GDB debug

使用友好的GDB debug会话:

1
gcc -ggdb test.c -o test.out

设置核心转储:

1
2
3
4
5
if ! grep -qi 'kernel.core_pattern' /etc/sysctl.conf; then
sudo sh -c 'echo "kernel.core_pattern=core.%p.%u.%s.%e.%t" >> /etc/sysctl.conf'
sudo sysctl -p
fi
ulimit -c unlimited # 使得当前会话解除核心文件大小限制

永久解除核心文件大小限制:

1
2
3
4
sudo bash -c "cat << EOF > /etc/security/limits.conf
* soft core unlimited
* hard core unlimited
EOF

检查核心文件元数据:

1
file core.1341870.1000.8.test.out.1598867712

使用GDB分析核心转储:

1
gdb ./test.out ./core.1341870.1000.8.test.out.1598867712

在GDB会话中,可以使用以下操作:

1
2
3
4
(gdb) bt	# 回溯
(gdb) f 2 # 转到特定帧
(gdb) list # 打印源代码
(gdb) p a/b # 打印变量或表达式

设置apt源

检查Ubuntu的系统版本和代号是否与要安装的源一致
在终端中输入:

1
lsb_release -a

source APT源:

1
sudo bash -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list'

检查source list:

1
cat /etc/apt/sources.list

从源获取包信息:

1
sudo apt-get update

vim技巧

虚拟块模式(选择一块代码):ctrl + q
在虚拟块模式中删除选中:d

设置vim

生成并打开设置文件:

1
2
3
4
cp /etc/vim/vimrc ~/.vimrc
cd ~
ls -a
vim .vimrc

具体设置更改:

1
2
3
4
5
6
7
8
syntax on   " 语法高亮
set background=dark
filetype plugin indent on
set showmatch " Show matching brackets.
set ignorecase " Do case insensitive matching
set smartcase " Do smart case matching
set incsearch " Incremental search
set hidden " Hide buffers when they are abandoned

安装中文语言包和fcitx输入法管理器,其中fcitx-sunpinyin是新安装的输入法

1
2
sudo apt install language-pack-zh-hans
sudo apt install fcitx dbus-x11 im-config fcitx-sunpinyin

编辑/etc/locale.gen文件,找到 # zh_CN.UTF-8 这一行,取消注释

1
zh_CN.UTF-8

编辑~/.profile文件,在文件末尾加上:

1
2
3
4
5
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
fcitx-autostart &>/dev/null

以上代码分别:设置了GTK(GIMP Toolkit)和QT程序的输入法模块为fcitx。GTK和QT是Linux系统中用于创建图形用户界面的工具包;设置了X Window System的修饰符(modifiers),以确保fcitx能够正确地拦截键盘事件;设置了默认的输入法模块为fcitx;设置了fcitx的自动启动,并将启动时的输出重定向到/dev/null,这样就不会在终端中显示启动过程的输出信息

刷新~/.profile在shell中的引用

1
source ~/.profile

刷新字体缓存

1
fc-cache -f -v

重启 wsl2

1
poweroff

重启fcitx

1
fcitx-autostart

打开fcitx的设置页面

1
fcitx-config-gtk3

在输入法中, 选择keyboard_en_us作为首位输入法,之前安装的fcitx-sunpinyin为第二位。
默认的输入法切换键位是ctrl+space,可以在fcitx的设置页面中更改。

这一套完成后,亲测无需将系统语言切换至中文,也可在gedit使用中文输入法。当然如果想在特定编译器中使用中文输入法,或许需要更复杂的配置了。设置IDEA可以参考:monkeywie的博客:wsl2官方gui安装IDEA踩坑记录

试着做一个微信小程序的项目,还不知道会遇到多少坑……

4/26

网页后端体系架构(自下而上):

数据库:存储字段(列)组成的实体集(表)

通过MyBatisPlus将数据库实体集与Java对象建立联系,其中实体集中的字段与Java类中的属性一一对应。

DAO层/Mapper层:提供CRUD的Java方法,处理/提供data object

DO即数据库实体集对应的Java对象。

Service层:统一业务逻辑处理,为不同服务提供可复用的调用接口;为CRUD方法赋予实际业务意义;处理param数据,提供VO对象

将从controller层拿到的param数据转化成DO对象,传至DAO层;将DAO层提供的DO对象转化成VO对象,提供给controller层。

Controller层:分配URL,接受来自页面的请求,向下处理后,拿到返回数据返回页面。

从页面拿到param数据提供给service层,接受service层传递的VO对象给页面展示。

更多关于数据结构层的介绍:https://blog.csdn.net/qq_27022241/article/details/112002345

心血来潮想找几个javascript小游戏玩玩,github上找到了untrusted这个游戏。

3/18

想打开网页直接玩来着,结果网页显示一些资源无法访问。于是按issues里的问题换了源,还是没办法。看来只好搭个本地服务器了。

直接down zip文件到了本地(文件有点大 怕git拉到本地中途出问题),git bash安装了http-server,http-server可以这么启动:

http-server [path]

结果跟网页端一样无法显示…一看报错发现没有编译.js文件出来,这就网上搜一圈看看怎么弄。

下载git bash的时候就看到附带了mingw,结果不能直接用make命令,而是得用mingw32-make,好家伙,然而整完还报错:

Makefile:14: *** File mods/default/intro.js not found!. Stop.

本来以为是下载的时候出了问题,上github一看,人家的描述是会自动生成这个文件,那我这是哪里出了问题?

整了挺久累了,下次再更🕊~

对了!make不能用cmd,会报奇怪的错!git bash就不会。

3/18

在github的issues里找到了这个解决换源,虽然说的是网页问题,但也可以改下载下来的code解决404问题。

Here’s a solution:

  1. Right click and click “Save As…”
  2. Edit the html file that just saved, overwrite jQuery reference <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> as <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script> or other reference you trust.
  3. run the html.

最后就是上面的file缺失问题了,我找到了一个较早的branch,copy了里面untrusted.js的代码并整到本地的对应文件夹

E:\works\untrusted-master\scripts\build

这样就不用make了,虽然感觉可能会出些错,但是我只是想玩个游戏,先这样啦~

对了,别忘了

http-server *:/.../untrusted-master

(*:code所在盘符,…:code所在目录)

终于可以玩了!

这个游戏里用setPhoneCallback蛮多次的,在这里存下这些代码,免得往回翻了。

1
2
3
4
5
6
7
8
9
10
11
12
13
map.getPlayer().setPhoneCallback(function () {
var player = map.getPlayer();
if(player.getColor() == "#0f0"){
return player.setColor("#f00");
}
else if(player.getColor() == "#f00"){
return player.setColor("#ff0");
}
else if(player.getColor() == "#ff0"){
return player.setColor("#0f0");
}

});

在b站看斯坦福CS144作为教程,打算后期跟着《计算机网络 自顶向下方法》(Kurose&Ross版)再过一过。

突然发现看了英文教程再看中文版书有点不理解一些概念用语😂,想看纯英文版的书又怕自己看不懂,纠结了。

3/17

(摘自Kurose&Ross的《计算机网络 自顶向下方法》)

什么是套接字(socket):

套接字说同一台主机内应用层与传输层之间的接口,由于该套接字是在网络上建立网络应用程序的可编程接口,因此也将套接字称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。

什么是传输层的多路复用(multiplexing)和解复用(demultiplexing,多路分解):

多路复用和多路分解是因特网中的基本传输层服务。

从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在多路分解时使用)从而生成报文段,然后将报文段传递到网络层的工作称为多路复用。

将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。

4/22

一个连异或怎么算都记不住的人今天看到了一个神解释:异或=不进位二进制加法

绝了!

这两天感觉做题的速度快起来了!可以一到一个半小时做完一道题(当然是比较简单的题目啦)。

试着做了一点牛客网上的面试题库,发现数据结构这块果然不能一点书不看(之前我是不是飘了?),准备看数据结构书了。

最近发现了力扣的笔记功能,虽然题目集的笔记和题目的笔记是分开的,有点坑,不过还是打算不写博客的时候先记在题目集笔记里,方便之后翻阅整理。

3/2-3/11

(累了,摸会🐟)