Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Linux重启后进入initramfs导致无法开机的解决方案

发表于 2024-11-14 | 更新于 2024-11-15

最近遇到 Linux 重启后进入 initramfs 导致无法开机的问题,虽然问题没有解决,但是记录一下过程。

通用解决方法

在initramfs命令行接口下,输入如下命令:

1
2
3
4
5
# 使用如下命令查看和识别磁盘、分区或文件系统的信息
blkid

# fsck命令是用于检查和修复Linux文件系统中的错误
fsck -y -t ext4 /dev/sda1

由于无法修复文件系统中错误,linux 还是无法开机。

SuperBlock修复

1
2
3
4
sudo fdisk -l
sudo fsck.ext4 -v /dev/xxx
sudo mke2fs -n /dev/xxx
sudo e2fsck -b block_number /dev/xxx

参考链接

  1. Ubuntu重启后进入initramfs导致无法开机解决方案,by 修己xj.
  2. linux操作系统故障处理-ext4文件系统超级块损坏修复,by zhangatong.
  3. HOWTO: Repair a broken Ext4 Superblock in Ubuntu,by linuxexpresso.
  4. linux 检测SSD寿命,by 高压锅_1220.

Qt_Quick_3D加载3d模型的方法

发表于 2024-11-14

最近工作中使用的一个基于QT开发三维程序中有很多以 .mesh 扩展名结尾的三维模型,搜索了一下,原来是 QtQuick3D 使用的专有三维模型格式。

QtQuick3D 附带Balsam导入工具,用于将常见格式转换为QtQuick3D支持的格式。

Balsam的目的是让可以轻松获取在常用工具(Blender,Maya,或3dsMax)中创建的资源,并在QtQuick3D中使用它们。

通过balsamui导出mesh文件和qml文件。

参考链接

  1. Qt Quick 3D系列(一):加载3d模型,by 喵喵叫的猴.
  2. Qt Quick 3D模块初探,by 龚建波.
  3. Qt Quick 3D中将3D场景(如.obj)转换为.mesh,by 喵喵叫的猴.
  4. 12、Qt Quick 3D —– 模型加载,by weixin_41392061.

深度学习中注意力机制学习笔记

发表于 2024-11-03

学习理解注意力机制的目的是为了更好的掌握深度学习模型,指导实践。

注意力机制的优点

之所以要引入 Attention 机制,主要是3个原因:

  • 参数少

模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。

  • 速度快

Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。

  • 效果好

在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。

Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。

参考链接

  1. 一文看懂 Attention(本质原理+3大优点+5大类型),by easyAI-人工智能知识库.
  2. 一文搞定注意力机制(Attention),by markconca的博客.
  3. 注意力机制(Attention mechanism)基本原理详解及应用,by Jerry_Jin.
  4. 什么是词向量?(NPL入门),by mawenqi0729.
  5. 词向量Word Embedding原理及生成方法,by getui.
  6. 注意力机制,by wikipedia.

NTP协议学习笔记

发表于 2024-10-30 | 更新于 2024-11-02

最近遇到一个问题,需要程序进行严格的时间同步,因此学习一下网络时间协议。

NTP同步原理

网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。

NTP最典型的授时方式是Client/Server方式:

  1. 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
  2. NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
  3. 客户端在接收到响应报文时,记录报文返回的时间戳t4。

客户端用上述4个时间戳参数就能够计算出2个关键参数:

  • NTP报文从客户端到服务器的往返延迟delay。

$delay=(t_4-t_1)-(t_3-t_2)$

  • 客户端与服务端之间的时间差offset。

联立方程组:

$t_2=t_1+offset+delay/2$

$t_4=t_3+offset+delay/2$

可得:

$offset=((t_2-t_1)+(t_3-t_4))/2$

NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。

NTP时间同步频率

NTP时间同步频率修改请参考:

  • windows修改ntp同步时间间隔

NTP时间同步精度

打开站点 https://time.is/ 可查看机器的时间精度。

参考链接

  1. 六千字详细图解网络时间协议(NTP),带你领略NTP的魅力!,by 网络技术联盟站.
  2. 什么是NTP?,by 高洋洋.
  3. 北斗授时原理及应用,by 西安同步.
  4. 各种Windows系统ntp客户端配置详解,by 西安同步.
  5. windows修改ntp同步时间间隔,by 梳碧湖的少年.

多网卡收UDP组播的问题分析

发表于 2024-10-27 | 更新于 2024-10-30

最近遇到一个问题,某个程序默认使用第一个网卡绑定组播地址,如果网卡顺序不对,将导致无法从组播地址上接收和发送数据。因此,必须指定某个网口绑定一个组播地址。具体方法有两种:

  • 调整网络高级设置,通过调整网卡顺序,使组播地址绑定在正确的网卡上
  • 修改网卡跃点数,通过修改网卡跃点数,使组播地址绑定在正确的网卡上

下面重点介绍第二种方法,修改网卡跃点数来调整组播地址绑定的网卡。

所谓“跃点”,即路由。一个路由为一个跃点。数据传输过程中需要经过多个网络,每个被经过的网络设备点(有能力路由的)叫做一个跃点,地址就是它的IP。

如果电脑中存在多个连接,哪个连接的跃点数小,哪个优先级就高。多播地址就会绑定在跃点数最小的网卡上。

参考链接

  1. Windows和Linux查看组播通信的方法,by huangwang.
  2. 多网卡的情况下收udp组播数据的坑,by 小鼬就是我.
  3. multiple multicast on multiple interfaces,by stackoverflow.
  4. Win10:如何修改双网卡的优先级?,by xosg.

HSV转RGB的效率问题探讨

发表于 2024-10-12

最近朋友遇到一个技术难题,我也没相关经验,只能记录以下,方便以后解决。

问题描述

朋友想高效地在一块嵌入式的板子上实现 640*480 HSV格式的图片转换成 RGB格式的图片,要求处理时延不能超过20ms。

解决方案

朋友试了很多中解决方案,包括:

  • 使用OpenCV的cvtColor函数,性能太差,可能是嵌入式板子的CPU处理器性能差的原因。
  • 使用OpenGL进行图像格式转换,性能还是不够。
  • 采用GPU加速图像处理,性能还是不够,GPU可能能够快速处理图像,但是图像数据在CPU和GPU之间的数据搬运也很耗时。
  • 使用OpenGL帧缓存双缓冲,性能还是不够

最后建议优化HSV转RGB格式的算法,提高CPU执行效率。

参考链接

  1. 数字图像处理——RGB与HSV图像互相转换原理,by 萌萌哒程序猴.
  2. OpenGL帧缓存,by 先锋小牛.
  3. OpenCV 自学笔记21. RGB色彩空间和HSV色彩空间的理解,by 两鬓已不能斑白.
  4. opencv中使用cuda加速图像处理,by 我是一个对称矩阵.

多传感器多目标跟踪方法研究学习笔记

发表于 2024-09-28

最近遇到一个问题,需要将多传感器多目标跟踪获得的航迹进行关联,因此学习研究一下。

关键技术

分布式多传感器多目标跟踪涉及的目标跟踪、传感器配准、航迹关联、数据融合4项关键技术。

目标跟踪

目标跟踪是指利用传感器获得的带噪声量测数据,对目标的状态和个数进行估计的过程。

目标跟踪按目标探测个数可分为单目标跟踪和多目标跟踪,通常它们都基于贝叶斯框架进行递归滤波。

单目标跟踪

多目标跟踪

传感器配准

在分布式多传感器多目标跟踪过程中,需要把来自多个传感器的数据转换到相同的时空参照系中。由于不同传感器传输速率及采样周期不同,而且存在传感器系统偏差和量测误差,直接进行转换会降低数据融合精度,因此在对多传感器数据处理时需要进行传感器时空配准。

时间配准

时间配准就是将各传感器对同一目标的异步量测信息配准到同一时刻。

空间配准

空间配准是利用多传感器对空间公共目标的探测信息对传感器的系统偏差进行估计和补偿的过程,它可以提高信息融合精度。

航迹关联

由于传感器间的探测区域存在重叠,来自不同系统的航迹可能代表同一目标。因此,如何找出同一目标对应的航迹就是分布式数据融合系统中的航迹关联问题。

航迹关联算法主要分为两类,一类是基于统计类的方法,一类是基于模糊数学的方法。

数据融合

分布式多传感器多目标跟踪又称分布式多传感器数据融合。在该系统中,各局部传感器首先基于单传感器多目标跟踪算法,形成各自目标航迹,
接着各传感器将目标航迹送入融合中心完成时空配准与航迹关联,然后融合中心基于某种融合准则对来自同一目标的航迹进行估计融合,最终形成稳定、
高精度的全局航迹。

参考链接

  1. 分布式多传感器多目标跟踪方法综述,by 曾雅俊, 王俊, 魏少明, 等.

HTML视频点击自动最大化播放技术学习

发表于 2024-09-23 | 更新于 2024-09-25

最近遇到一个小需求,就是在网页前端实现点击视频播放的同时,实现视频最大化,简单学习一下。

技术原理

网页前端实现点击视频播放的同时,实现视频最大化的技术原理如下:

  • 捕捉点击视频播放的事件,在该事件中执行视频最大化方法

技术实现

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!doctype html>
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>视频技术测试</title>
<style>
html, body {
width: 100%;
height: 100%;
margin: 0;
padding:0;
}

#max{
margin: 5% auto;
width: 600px;
}
</style>
</head>

<body>
<div id="max">
<video id="media" controls width="600">
<source src="./media/cc0-videos/flower.webm" type="video/webm" />

<source src="./media/cc0-videos/flower.mp4" type="video/mp4" />

Download the
<a href="./media/cc0-videos/flower.webm">WEBM</a>
or
<a href="./media/cc0-videos/flower.mp4">MP4</a>
video.
</video>
</div>
</body>

<script>
const video = document.querySelector("#media");

video.addEventListener("play", (event) => {
video.requestFullscreen();
});

</script>

</html>

参考链接

  1. 深入理解HTML5视频标签:掌握全方位的播放控制和交互技巧,by 未闻花名_review.

HTML图片自动轮播技术学习

发表于 2024-09-23 | 更新于 2024-09-25

最近遇到一个小需求,就是在网页前端实现图片自动轮播,简单学习一下。

技术原理

网页前端实现图片自动轮播的技巧如下:

  • 图片所在容器元素采用绝对定位,从而实现所有图片叠加到一块。
  • 通过CSS实现左右箭头
  • 通过js调整图片所在容器的透明度,从而实现图片的轮播。同时调整播放顺序按钮的背景色,从而实现顺序指示的功能。

技术实现

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<!DOCTYPE html>
<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>图片轮播技术测试</title>
<style>
html,
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}

#max {
width: 900px;
margin: 0 auto;
margin-top: 0%;
}

.re {
position: relative;
}

.arrow {
height: 20px;
width: 20px;
border: solid #333;
border-width: 0 4px 4px 0;
display: inline-block;
padding: 3px;
}

.left {
transform: rotate(135deg);
cursor: pointer;
margin-top: 240px;
margin-left: 20px;
float: left;
}

.right {
transform: rotate(-45deg);
cursor: pointer;
margin-top: 240px;
margin-right: 10px;
float: right;
}

.re ul {
list-style-type: none;
padding: 0;
margin: 0;
}

.re ul>li {
position: absolute;
transition: 2s;
opacity: 0;
}

.re ul>li img {
width: 900px;
height: 500px;
border-radius: 1%;
border: 5px solid #fffbd6;
}

#max ol {
position: relative;
display: grid;
grid-template-columns: repeat(5, 75px);
grid-template-rows: auto;
grid-gap: 1em;
gap: 1em;
float: right;
margin-top: 450px;
list-style: none;
top: 0;
left: 0;
}

#max ol li {
width: 20px;
height: 20px;
font-size: 15px;
line-height: 20px;
float: left;
text-align: center;
border-radius: 2em;
border: 5px solid #999999;
}
</style>
</head>

<body>
<div id="max">
<div class="re" onmouseover="mouseover()" onmouseout="mouseout()">
<ul>
<li><img src="./pic/big_size/p1.jpg" alt=""></li>
<li><img src="./pic/big_size/p2.jpg" alt=""></li>
<li><img src="./pic/big_size/p3.jpg" alt=""></li>
<li><img src="./pic/big_size/p4.jpg" alt=""></li>
<li><img src="./pic/big_size/p5.jpg" alt=""></li>
</ul>
<div class="arrow left" onClick="prev()"></div>
<div class="arrow right" onClick="next()"></div>
<ol>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ol>
</div>
</div>
</body>

<script>
function fun(i, j) {//转换图片函数,就是把透明度改了一下
lik[i].style.opacity = 1;
lik[j].style.opacity = 0;
lik[i + 5].style.backgroundColor = "#ffffff";//改一下小图标
lik[j + 5].style.backgroundColor = "#00000000"
}

function auto() {//轮播循环函数
if (++i >= 5) {
i = 0;
fun(0, 4);
}
else fun(i, i - 1);
}

function mouseover(){
console.log('clear timer!');
clearInterval(timer);
}

function mouseout(){
console.log('set timer!');
timer = setInterval(auto, transition); //调用定时器
}

function prev(){
if (--i < 0) {
i = 4;
fun(4, 0);
}
else fun(i, i + 1);
}

function next(){
if (++i >= 5) {
i = 0;
fun(0, 4);
}
else fun(i, i - 1);
}

var transition = 5000;
var box = this.document.getElementsByClassName("re")[0];
var lik = box.getElementsByTagName("li");

fun(0, 1);//初始化下
var i = 0;

timer = this.setInterval(auto, transition);

var j = 0;
for (; j < 5; j++) {//点击小图标也可以转换图片
lik[j + 5].ind = j;
lik[j + 5].onclick = function () {
fun(this.ind, i)
i = this.ind;
}
}
</script>

</html>

参考链接

  1. 超简单全面的html图片自动轮播,by 学习是人类进化的阶梯.
  2. 简单的HTML网页图片轮播自动切换,by 时钟与夏蝉.
  3. 利用CSS实现上下左右箭头,by 墨初.

C语言中的位域使用方法

发表于 2024-09-18

C语言中的位域(Bit-fields)可以用于对结构体成员进行位级别的控制和优化。在一些应用中,比如网络协议,经常会涉及对数据的某些比特位进行操作,尽管可以使用位的相关运算,但是C语言提供了位域用以支持对一个字节的某几个位进行访问,操作起来也更加方便。

位域的定义与引用

位域不同于一般的结构体成员,它以位为单位来定义成员的长度,因此在结构体中定义位域时,必须要指明位域成员所需要占用的二进制位数。

1
2
3
4
5
6
struct MsgHeader {
int a: 5; // 数据类型名 变量名:二进制位数
int b: 3;
int c: 2;
int d:6;
};

由于位域本质上是一种特殊的结构体成员,因此一般结构体成员的引用方法同样适用于位域成员。不过,需要特别注意的是,位域成员存储是以二进制位作为单位的,而内存的最小寻址单元是字节,所以不能直接引用位域成员的地址。

位域与大小端

结构体内位域成员在大小端系统上的内存分配规则如下:

  • 无论是大端或小端模式,位域的存储都是由内存低地址向高地址分配,即从低地址字节的低位bit开始向高地址字节的高位bit分配空间;
  • 位域成员在已分配的内存区域内,按照机器定义的比特序对数据的各个bit位进行排列。即在小端模式中,位域成员的最低有效位存放在内存低bit位,最高有效位存放在内存高bit位;大端模式则相反。

参考链接

  1. C语言中位域(Bit-fields)的高级玩法,8个案例代码告诉你怎么玩,by
    晓亮Albert.
  2. C语言结构体位域及其存储,by Aspiresky.
  3. 3分钟理解C语言结构体位域(小白扫盲篇),by 天黑黑.
上一页1…345…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse