Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Linux桌面版安装过程笔记

发表于 2024-06-13 | 更新于 2024-06-14

最近需要在一台比较老的机器上安装银河麒麟4.0.2,遇到一些问题,记录一下。

光盘启动后,显示器黑屏

解决方案:光盘启动后,选择 install kylin 启动选项,按键盘 e 进入编辑状态,找到 quiet splash ,在后面添加 nomodeset ,然后按 crtl+x 启动。

具体原理:

  • nomodeset

这是一个新型的显示模式,即内核在启动阶段调用更先进的图形显示技术,以达到更好的显示效果。副作用就是兼容性低。

可以设置nomodeset 或者modeset=0关闭这项功能,至少保证进入字符界面。

更进阶一点的写法是:i915.modeset=0,其中i915是intel的显示驱动,该命令可以单独关闭该驱动的KMS。

  • quiet

quiet参数的作用:启动系统的过程中,如果没有quiet,那么内核就会输出很多内核消息,这些内核消息就包括的了系统启动过程中运行了哪些程序,如果系统运行正常,就没必要看到这些消息。

  • splash

splash是一个不可或缺的参数,系统很多核心程序,都需要这个参数,且这个参数与可视化界面有关,没有就可能导致屏幕一片空白。

网卡不识别,需要安装驱动

进入Linux系统桌面后,执行如下步骤:

  • 查未安装驱动的网口
    ifconfig 和 ifconfig -a对比,查看哪些网口没有加载,即为没有驱动的网口

  • 查网卡驱动型号
    ethtool -i 网口,输出的driver:XXX就是驱动名

  • 下载网卡
    去intel官网下载对应驱动的源码

  • 卸载旧驱动
    rmmod XXX

  • 编译
    进入源码的makefile同级目录,执行make install

  • 加载新驱动
    depmod -a
    modprobe XXX

  • 查看
    lsmod | grep XXX

  • 重启网络服务
    service networking restart

显示器分辨率不够,需要安装驱动

进入Linux系统桌面后,执行如下步骤:

  • 禁用原驱动nouveau
    vim /etc/modprobe.d/blacklist.conf
    追加blacklist nouveu

  • 备份启动项
    mv /boot/initram….img /boot/initram…img.bak

  • 重新生成启动项
    dracut -v /boot/initram…img,名称要和原来的一样

  • 重启,并ctrl alt f1(或者f2-f6)进去tty界面
    登录root用户,关闭lightdm
    service lightdm stop
    找到nvidia显卡驱动并执行,都选yes或者ok,重新生成initram,并添加带X服务
    安装好后启动lightdm
    service lightdm start
    按ctrl alt f7进入图形界面

参考链接

  1. 银河麒麟v4.0.2安装,by 阿瓦隆勒菲.
  2. linux中grub,nomodest,quiet等参数的含义,进入启动项之后黑屏的可能原因,by dair6.
  3. linux内核启动参数,by deepin.
  4. Linux系统安装网卡驱动,by luhuaxiang.
  5. 【亲测有效】Linux系统安装NVIDIA显卡驱动,by 自动驾驶simulation.
  6. AMD显卡驱动安装,by skyao.
  7. Linux中获得AMD显卡的状态信息,by 香风家的火柴盒.
  8. ubuntu环境配置AMD显卡驱动,by WocheDonner.

QT私有类的设计模式学习

发表于 2024-06-11

查看QT源码,会发现很多类会有一个同样名字、但是以Private结尾的孪生类,这是QT用于封装私有操作的一种设计模式。这种设计模式可以有如下优点:

  • 信息隐藏
  • 二进制兼容

示例

myclass.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// myclass.h  
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtCore/QObject>
class MyClassPrivate;
class MyClass: public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = 0);
virtual ~MyClass();
void dummyFunc();
signal:
void dummySignal();
private:
MyClassPrivate * const d_ptr;
Q_DECLARE_PRIVATE(MyClass);
Q_DISABLE_COPY(MyClass);
};
#endif // MYCLASS_H

myclass.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
26
27
28
29
30
31
32
33
// myclass.cpp  
#include "myclass.h"
class MyClassPrivate
{
public:
MyClassPrivate(MyClass *parent)
: q_ptr(parent)
{
}
void foobar()
{
Q_Q(MyClass);
emit q->dummySignal();
}
private:
MyClass * const q_ptr;
Q_DECLARE_PUBLIC(MyClass);
};
MyClass::MyClass(QObject *parent)
: QObject(parent)
, d_ptr(new MyClassPrivate(this))
{
}
MyClass::~MyClass()
{
Q_D(MyClass);
delete d;
}
void MyClass::dummyFunc()
{
Q_D(MyClass);
d->foobar();
}

参考链接

  1. C++学习—qt的公有类、私有类、Q_Q、Q_D、二进制兼容,by 手磨咖啡.
  2. Qt使用技巧–定义Private类,by 大王怕我去巡山.

Python提取数据库内容并根据文档模板生成文档的方法

发表于 2024-06-08

最近需要从Oracle数据库中提取一些数据,并使用文档模板生成文档,鉴于Python环境部署的方便性,编程的简便性,于是采用Python开发该程序。方法记录如下:

环境配置

依赖环境

核心是 docxtpl 和 oracledb 两个库。

  • python 3.8.5,可在windows7上运行,python 3.9以后版本不支持windows7
  • Babel==2.15.0
  • cffi==1.16.0
  • cryptography==42.0.8
  • docxcompose==1.4.0
  • docxtpl==0.17.0
  • jinja2==3.1.4
  • lxml==5.2.2
  • MarkupSafe==2.1.5
  • numpy==1.24.4
  • oracledb==2.2.1
  • pandas==2.0.3
  • pycparser==2.22
  • python-dateutil==2.9.0.post0
  • python-docx==1.1.2
  • pytz==2024.1
  • six==1.16.0
  • typing-extensions==4.12.2
  • tzdata==2024.1

虚拟环境

1
2
3
4
5
6
7
mkdir wordtpl_generate
cd wordtpl_generate
python -m venv env
env\Scripts\activate.bat
pip install pandas
pip freeze > requirement.txt
pip download -d packages -r requirement.txt

离线迁移

创建envConfig.bat批处理文件,一键执行离线环境配置。

1
2
3
python -m venv env
call env\Scripts\activate.bat
pip install --no-index --find-links=packages -r requirements.txt

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import getpass
import oracledb
from docxtpl import DocxTemplate

def oracledb_test():
un = 'scott'
cs = 'localhost/orclpdb'
pw = getpass.getpass(f'Enter password for {un}@{cs}: ')

with oracledb.connect(user=un, password=pw, dsn=cs) as connection:
with connection.cursor() as cursor:
sql = """select sysdate from dual"""
for r in cursor.execute(sql):
print(r)

def wordtpl_test():
doc = DocxTemplate("my_word_template.docx")
context = { 'company_name' : "World company" }
doc.render(context)
doc.save("generated_doc.docx")

if __name__ == '__main__':
oracledb_test()
wordtpl_test()

参考链接

  1. Python自动化:根据模板批量生成含指定数据的word文档,by aliyun.

Python提取csv文件中的特定列的方法

发表于 2024-05-24

最近需要抽取csv文件中的特定列,使用excel老是将hh.mm.ss.SSS格式数据搞坏,于是想通过python直接提取。方法记录如下:

环境配置

Pandas介绍

Pandas是用于数据操纵和分析的Python软件库。它建造在NumPy基础上,并为操纵数值表格和时间序列,提供了数据结构和运算操作。

依赖环境

  • python 3.8.5,可在windows7上运行,python 3.9以后版本不支持windows7
  • numpy==1.24.4
  • pandas==2.0.3
  • python-dateutil==2.9.0.post0
  • pytz==2024.1
  • six==1.16.0
  • tzdata==2024.1

虚拟环境

1
2
3
4
5
6
7
mkdir csv_extract
cd csv_extract
python -m venv env
env\Scripts\activate.bat
pip install pandas
pip freeze > requirement.txt
pip download -d packages -r requirement.txt

离线迁移

创建envConfig.bat批处理文件,一键执行离线环境配置。

1
2
3
python -m venv env
call env\Scripts\activate.bat
pip install --no-index --find-links=packages -r requirements.txt

具体实现

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
import pandas as pd
import os

def walk_files(src_filepath = "."):
filepath_list = []

for root, dirs, files in os.walk(src_filepath):
for file in files:
if root == '.':
root_path = os.getcwd() + "/"
else:
root_path = root

if (root_path != src_filepath) and (root != '.'):
filepath = root_path + "/" + file
else:
filepath = root_path + file

if filepath not in filepath_list:
filepath_list.append(filepath)

return filepath_list

def extract_csv(filepath,usecols=[0,3,11,42,43],encoding='gbk'):
df = pd.read_csv(filepath,usecols=usecols,encoding=encoding)
df.to_csv(filepath+'.csv',index=0)

if __name__ == '__main__':
print(os.getcwd())

search_dir='./testData/'
file_info_list = walk_files(search_dir)

for file in file_info_list:
print(file)
extract_csv(file)

参考链接

  1. pandas,by pandas.
  2. How to Recursively Traverse Files and Directories in Python,by Sabahat Khan.
  3. Pandas读取CSV的时候报错文件不存在的经验小记,by 翻滚的小@强.
  4. Python os.walk() 方法,by runoob.

Wireshark回环地址抓包问题

发表于 2024-05-22

通过套接字发送本地的数据包不会通过真实的网络接口发送,而是通过回环地址。因此,如果需要分析发往本机的网络数据包,需要Wireshark在回环地址上抓包。

关键的Npcap程序

windows系统没有提供本地回环网络的接口,用wireshark监控网络的话只能看到经过网卡的流量,看不到访问localhost的流量,因为wireshark在windows系统上默认使用的是WinPcap来抓包的,现在可以用Npcap来替换掉WinPcap,Npcap是基于WinPcap 4.1.3开发的,api兼容WinPcap。

Npcap 是 Nmap 项目的 Microsoft Windows 数据包捕获(和发送)库。它使用自定义 Windows 内核驱动程序以及我们的 Windows 版本的优秀 libpcap 库来实现开放Pcap API。这允许 Windows 软件使用简单、可移植的 API 捕获原始网络流量(包括无线网络、有线以太网、本地主机流量和许多 VPN)。 Npcap 现在提供:

  • 环回数据包捕获和注入
  • 支持所有当前 Windows 版本
  • Libpcap API
  • 支持所有 Windows 架构(x86、x86-64 和 ARM)
  • 额外的安全性
  • WinPcap 兼容性
  • 原始(监控模式)802.11 无线捕获

Wireshark安装注意事项

安装Wireshark 3.4.4时,其安装包内置了Npcap的安装程序,但是安装时需要注意需勾选兼容WinPcap选项,否则Wireshark将找不到Adapter for loopback traffic capture网口。

参考链接

  1. Wireshark本地回环网络抓包,by 三希.
  2. Wireshark之本地回环抓包,by Word哥.
  3. Npcap: Packet capture library for Windows,by npcap.

Linux网口混杂模式设置方法

发表于 2024-05-18 | 更新于 2024-05-19

最近在Kylin 4.0.4社区版上安装了VirtualBox,使用VirtualBox安装了Win7操作系统,虚拟机通过设置网口桥接模式与宿主机进行通信。偶尔出现宿主机无法ping通虚拟机,虚拟机无法ping通宿主机的情况,查看虚拟机网口接收情况,发现虚拟机接收数据包为0,重启虚拟机也无法恢复,因此严重怀疑其原因是虚拟机使用的宿主机网口工作模式并不是混杂模式。下面介绍在Linux上查看网口工作模式和设置网口工作模式的方法。

查看网口工作模式

如果存在ifconfig命令,则可使用该命令查看网口的工作模式,命令如下:

1
2
3
4
5
6
7
8
[root@localhost jack]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:70:1D:79
inet6 addr: fe80::a00:27ff:fe70:1d79/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:100124 errors:0 dropped:0 overruns:0 frame:0
TX packets:8795 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12986638 (12.3 MiB) TX bytes:6452270 (6.1 MiB)

如果存在ip命令,则可使用该命令查看网口的工作模式,命令如下:

1
[root@localhost jack]# ip addr

设置网口工作模式

如果存在ifconfig命令,则可使用该命令设置网口的工作模式,命令如下:

1
2
ifconfig eth0 promisc  设置混杂模式
ifconfig eth0 -promisc 取消混杂模式

如果存在ip命令,则可使用该命令设置网口的工作模式,命令如下:

1
2
ip link set eth0 up
ip link set eth0 promisc on

参考链接

  1. Linux中如何将网卡设置为混杂模式,by splaybow.
  2. VirtualBox网络之桥接网卡,by 五星上炕.
  3. 设置网卡混杂模式,by duyiwuer2009.
  4. Linux下的ip命令,by wyaoo.
  5. 【网络】网口工作模式(混杂模式|监听模式|监视模式|管理模式),by bandaoyu.

从数据可视化角度理解大小端字节序问题

发表于 2024-05-11

大小端字节序问题让人十分头疼,死记硬背并不能加深对大小端字节序的理解。但是从数据可视化的角度,就能理解大小端字节序,让人豁然开朗。

问题来源

字节序,又称端序或尾序(英语中用单词:Endianness 表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序。

字节的排列方式有两个通用规则:

  • 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
  • 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。

通常在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。

从网络数据可视化看大端序

一般网络字节序为大端字节序,因为UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,网络数据解析时先收到的数据存放于低地址,否则内存的访问将是不连续的。 所以,大端字节序 = 网络字节序 = 高位放低地址。

对于整形数0x11223344,采用网络传输时,从wireshark中抓到的消息包,如下所示:

1
2
3
4
5
        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0000 11 22 33 44 00 00 00 00 00 00 00 00 00 00 00 00
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

从wireshark的数据可视化角度可知,网络通信采用大端序,低地址存储高位字节,高地址存储低位字节,符合人类阅读习惯。

从内存分布可视化看小端序

操作系统内存布局

Windows在默认情况下会将高地址的2GB空间分配给内核(也可以配置为1GB),而Linux默认情况下会将高地址的1GB空间分配给内核。也就是说,应用程序只能使用剩下的2GB或3GB的地址空间,称为用户空间(User Space)。

Windows 32位程序的内存分布

图1 Windows 32位程序的内存分布

应用程序性用户空间布局

  • 堆(heap)的增长方向是向上增长,即低地址向高地址增长。
  • 栈(stack)的增长方向是向下增长,即高地址向低地址增长。

Windows 32位程序的内存分布

图2 Windows 32位程序堆栈内存分配和增长方向

应用程序中定义的变量通常在栈区存储,而栈(stack)的增长方向是向下增长,即高地址向低地址增长。因此,从如下可视化角度查看数据是合理的。

1
2
3
4
5
        F  E  D  C  B  A  9  8  7  6  5  4  3  2  1  0
0030 11 22 33 44 00 00 00 00 00 00 00 00 00 00 00 00
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

参考链接

  1. 什么是大端序和小端序,为什么要有字节序?,by Kevin Yan.
  2. Windows下C语言程序的内存布局,by 朴素贝叶斯.
  3. 一文弄懂大小端字节序/网络字节序,by Linux加油站.
  4. 为什么堆和栈的增长方向相反?,by 嵌入式ARM.

CPlusPlus之让程序只启动一个实例

发表于 2024-05-07

C++中让程序只启动一个实例的方法主要有以下几种:

互斥体实现方式

主要利用如下函数实现:

1
2
3
4
5
6
函数原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,//必须为NULL
BOOL bInitialOwner, //表示mutex的范围是本线程还是全系统
LPCTSTR lpName //互斥量的名字
);
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
bool    checkMyselfExist()//如果程序已经有一个在运行,则返回true
{
HANDLE hMutex = CreateMutex(NULL, FALSE, L"DevState");
if (hMutex && (GetLastError() == ERROR_ALREADY_EXISTS))
{
CloseHandle(hMutex);
hMutex = NULL;
return true;
}
else{
return false;
}
}

int main()
{
if (checkMyselfExist()){
cout << "program has been runnin" << endl;
}
else{
cout << "start running" << endl;
}
system("pause");

return 0;
}

参考链接

  1. C++实现程序单实例运行的两种方式,by 倚剑问天.
  2. C / C++ 如何让程序只启动一个实例,by C你.

毛泽东选集全四卷读书笔记

发表于 2024-04-28

如果没有毛泽东同志多次从危机中挽救中国革命,如果没有以他为首的党中央给全党、全国各族人民和人民军队指明坚定正确的政治方向,我们党和人民可能还要在黑暗中摸索更长时间。同中国共产党被公认为全国各族人民的领导核心一样,毛泽东同志被公认为中国共产党和中国各族人民的伟大领袖,在党和人民集体奋斗中产生的毛泽东思想被公认为党的指导思想,这是中华人民共和国建国以前二十八年历史发展的必然结果。

金句摘抄

政治路线确定之后,干部就是决定的因素。【《毛泽东选集》第2卷,人民出版社1991年第2版,中国共产党在民族战争中的地位,第526页。】

参考链接

  1. 毛泽东选集[全四卷],by usst.
  2. 关于建国以来党的若干历史问题的决议,by 人民日报.

Tcpdump使用帮助

发表于 2024-04-24

tcpdump 用于收集有关网络流量数据的出色工具。 数据包捕获为故障排除和安全分析提供了有用的信息。

tcpdump 参数

参数 含义
-a 将网络地址和广播地址转变成名字
-c 在收到指定的包的数目后,tcpdump就会停止;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;以可阅读的格式输出。
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e 在输出行打印出数据链路层的头部信息;
-f 将外部的Internet地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 直接显示IP地址,不显示名称;
-nn 端口名称显示为数字形式,不显示名称;
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-F 从指定的文件中读取表达式,忽略其它的表达式;
-i 指定监听的网络接口;
-r 从指定的文件中读取包(这些包一般通过-w选项产生);
-w 直接将包写入文件中,并不分析和打印出来;
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单 网络管理协议;)

使用举例

截获主机收到和发出的所有数据包

1
tcpdump

将抓包信息写入文件 -w

1
tcpdump -w tcpdump_test.pcap

导出的pcap文件可导入wireshark进行分析。

打印出所有可工作的接口 -D

1
tcpdump -D

指定监控的网卡 -i

1
tcpdump -i eth0

参考链接

  1. 肝了三天,整了一份全网最全(中文) tcpdump 抓包指南,by 游戏大爷君.
  2. 网络/命令行抓包工具tcpdump详解,by 一口Linux.
上一页1…456…52下一页

Jack Huang

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