2.7k words

更换软件源

  1. 查看Linux版本 lsb_release -a,获取codename

    1
    2
    3
    4
    5
    6
    root@root:~$ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description: Ubuntu 22.04 LTS
    Release: 22.04
    Codename: jammy
  2. 替换源

    1
    2
    3
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.old
    sudo chmod 777 /etc/apt/sources.list
    sudo gedit /etc/apt/sources.list

    输入(jammy为第一步获取的名字):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

    更新:

    1
    2
    sudo apt-get update  #这个命令会访问源列表里的每个网址,并读取软件列表,将其保存在本地
    sudo apt-get upgrade #这个命令会更新本地已安装的软件

基础配置

  1. 配置管理员密码与基础工具

    1
    2
    3
    4
    5
    6
    7
    8
    #修改管理员密码
    sudo passwd root

    #安装网络工具|ssh|vim
    sudo apt-get install net-tools ssh vim -y

    #关闭防火墙
    sudo ufw disable
  2. 安装远程目录samba

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    sudo apt-get install samba -y
    sudo vim /etc/samba/smb.conf

    #输入
    [home]
    path = /home
    comment = Home Disk
    public = yes
    writeable = yes
    directory mask = 0777
    create mask = 0777
    browseable = yes
    available = yes
    force user = root

    #添加用户
    sudo pdbedit -a xxxxx
  1. 安装远程挂载服务 nfs

    1
    2
    3
    4
    5
    6
    sudo apt-get install nfs-kernel-server -y
    sudo chmod 777 /etc/exports
    sudo vim /etc/exports

    #再文档最后写上挂载目录
    /home *(rw,sync,no_root_squash)

安装远程桌面

1
2
3
4
5
#安装xfce4
sudo apt-get -y install xfce4 xrdp -y

#配置xfce4桌面
echo xfce4-session > ~.xsession

打开windows桌面远程连接,输入账号密码即可:

image-20220804102041880

image-20220804102104140

新建用户

  1. 复制用户初始文件到 /etc/skel/ 目录下,比如QT配置等

  2. 添加用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #添加普通用户
    sudo adduser xxxx

    #ubuntu添加管理员用户
    sudo usermod -G sudo xxxx

    #centos添加管理员用户
    chmod u+w /etc/sudoers
    vim /etc/sudoers
    #添加行
    xxxx ALL=(ALL) AL
    #删除权限
    chmod u-w /etc/sudoers

Linux扩展命令

  1. 查看磁盘情况 [duf](muesli/duf: Disk Usage/Free Utility - a better ‘df’ alternative (github.com)),类似df命令,可用来看挂载情况

    image-20220805092957317

  2. 查看文件夹大小 dust -d 1,1表示深度,类似du命令

    image-20220805093151159

  3. 查看Linux资源情况 [btm](ClementTsang/bottom: Yet another cross-platform graphical process/system monitor. (github.com)),类似 top命令

    image-20220805093258646

挂载新硬盘到home

  1. 查看当前的连接的硬盘 fdisk -l

  2. 挂载新硬盘 fdisk /dev/sdb

    1
    2
    3
    Command (m for help): n(创建新分区)
    ... ...(全都默认操作)
    Command (m for help): w(完成退出)
  3. 格式化分区 mkfs -t ext4 -c /dev/sdb

  4. 挂载临时目录并拷贝home目录文件

    1
    2
    3
    mount /dev/sdb1 /mnt
    cp -rf /home/* /mnt
    umount /mnt
  5. 挂载到home

    1
    2
    mount /dev/sdb1 /home/   #将sdb1挂载到/home
    blkid /dev/sdb1 #记录sdb1的UUID
  6. 开机自动挂载

    1
    2
    3
    4
    5
    6
    #查看UUID
    lsblk -f
    #修改开机挂载脚本
    vi /etc/fstab
    #在最后增加一行
    UUID=da797df3-cfa3-4a8b-aea6-2df53e41ba42 /home ext4 defaults 1 2
382 words

准备工作

  1. 删除旧版本

    1
    2
    yum remove git
    git --version
  2. 安装需求

    1
    yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
  3. 下载新版本

    1
    wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz

安装

  1. 编译

    1
    2
    3
    4
    tar -zxf git-2.9.5.tar.gz
    cd git-2.9.5
    make prefix=/usr/local/git all
    make prefix=/usr/local/git install
  2. 添加环境变量

    1
    2
    3
    vim /etc/profile
    export PATH=$PATH:/usr/local/git/bin
    source /etc/profile
  3. 查看版本

    1
    git --version
1.7k words

为了提高内聚和降低耦合,我们经常会定义一些抽象基类或接口,然后声明一个基类指针指向实际子类,来达到多态的目的。外部使用时,需要知道子类的具体名称才能创建相应的对象。

但这样的话,当子类的种类变多时,就会变得凌乱,于是就需要一个工厂类来进行管理,使用枚举等方式来选择要创建的子类。

2.1k words

设计模式常用于面向对象的开发语言,主要是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式最早于1994年被GOF(GANG OF FOUR四人班)提出,他们合著了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》设计模式 - 可复用的面向对象软件元素)的书,书中总共提到了23种设计模式,可以分为三大类:创造型(Creational Patterns)结构型(Structural Patterns)行为模式型(Behavioral Patterns)

创建型模式

提供了一种在创建对象的同时隐藏创建逻辑的方式,使某个给定实例需要创建哪些对象时更加灵活。

模式 描述
单例模式(Singleton Pattern) 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
简单工厂(Simple Factory Pattern) 提供一个工厂类,定义一个用于创建对象的接口
工厂方法(Factory Method Pattern) 简单工厂升级,抽象工厂类的创建对象接口,让工厂子类决定如何创建对象。
抽象工厂(Abstract Factory Pattern) 工厂方法升级,工厂类中定义多个创建不同对象的接口,减少工厂类。
建造者模式(Builder Pattern) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
原型模式(Prototype Pattern) 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

结构型模式

模式 描述
适配器模式(Adapter Pattern) 将一个类的接口转换成客户希望的另外一个接口。
使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接模式(Bridge Pattern) 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
装饰者模式(Decorator Pattern) 动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。
组合模式(Composite Pattern) 将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
外观模式(Facade Pattern) 为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。
享元模式(Flyweight Pattern) 运用共享技术有效地支持大量细粒度的对象。
代理模式(Proxy Pattern) 为其他对象提供一个代理以控制对这个对象的访问。

行为型模式

模式 描述
模版方法(Template Method Pattern) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
命令模式(Command Pattern) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
观察者模式(Observer Pattern) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
中介者模式(Mediator Pattern) 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
备忘录模式(Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
解释器模式(Interpreter Pattern) 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
状态模式(State Pattern) 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
策略模式(Strategy Pattern) 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户端。
职责链模式 (Chain of Responsibility Pattern) 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
访问者模式(Visitor Pattern) 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

简单工厂模式和策略模式的区别

如果在适合用策略模式的情况下用简单工厂模式,如果新增加策略就要修改工厂类,而这个可能会导致其他错误和比较繁琐,而如果使用了策略模式,只要将新增加的策略当做参数传递到Context类中即可.

工厂模式是创建型设计模式,它主要关心如何去创建一个对象。策略模式是行为型设计模式,它不关注如何去创建一个对象,而是去挑选一个最符合当前应用场景的策略

1.6k words

说明

目的:为了保证一个类在程序中只有一个实例,并且能被全局访问

要点:

  1. 全局性:使用static关键字,变量需要存在于静态存储区
  2. 多线程:使用mutex进行保护
  3. 唯一性:构造函数私有,只生成一个实例,并且由自己创建
1.3k words

触摸屏使用

  1. 查看触摸屏输入设备

    1
    2
    #event0或1等,点击触摸屏即可打印相应信息
    hexdump /dev/input/event1
  2. 触摸屏校准

    1
    /usr/local/tslib/bin/ts_calibrate

    img

  3. 触摸屏测试

    1
    /usr/local/tslib/bin/ts_test

lrzsz移植

  1. 下载并解压lrzsz源码

    1
    2
    wget https://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
    tar -xzvf lrzsz-0.12.20.tar.gz
  2. 修改交叉编译链并配置

    1
    2
    3
    4
    5
    6
    #修改配置:CC(交叉编译链)、host、build
    CC=arm-linux-gnueabihf-gcc ./configure \
    --cache-file=./arm-linux.cache \
    --prefix=$(pwd)/../output \
    --host=arm-linux-gnueabihf \
    --build=arm-linux-gnueabihf
  3. 编译生成

    1
    make && make install

arm内核编译

  1. 准备工作

    1
    2
    3
    4
    5
    sudo apt-get update	
    sudo apt-get install lzop
    sudo apt-get install libncurses5-dev libncursesw5-dev
    sudo apt-get install libc6-dev-i386 lib32z1
    sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev
  2. 功能命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #清除编译生成的文件,保留配置文件
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
    #清除编译生成的文件和配置文件
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mrproper
    #清除所有文件
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

    #使用epc_m6y2c_defconfig作为配置文件
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- epc_m6y2c_defconfig &&

    #基于文本模式的菜单型配置
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
    #图形化配置
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- gconfig

    #编译全部
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
  3. 生成文件

    • arch/arm/boot/zImage
    • linux-imx/arch/arm/boot/dts/imx6y2c-512m-nand.dtb
1.7k words

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp提供跨平台的客户端与服务端,开源免费,地址:frp (github.com)

根据系统版本,下载不同的文件并解压如下:

image-20220330172447439

1.1k words

问题

有两台机子,各自设置了静态 IP:

  • A 机:ifconfig eth0 192.168.32.10 netmask 255.255.254.0
  • B 机:ifconfig eth0 192.168.1.15 netmask 255.255.254.0

A 机 Ping B 机时,显示异常:

1
2
3
[root@test]# ping 192.168.1.15
PING 192.168.1.15 (192.168.1.15): 56 data bytes
ping: sendto: Network is unreachable

需要在不改变 AB 机 IP 的情况下,让网络互通。

说明

子网掩码是一个32位的2进制数,常见格式为255.255.255.255(即FF.FF.FF.FF)。子网掩码由1和0组成,且1和0分别连续。 其对应网络地址的所有位都置为1,对应于主机地址的所有位置都为0。用于告知路由器,地址的哪一部分是网络地址,哪一部分是主机地址,使路由器正确判断任意IP地址是否是本网段)的,从而正确地进行路由。

注意:只有网络标识相同的两台主机在无路由的情况下才能相互通信。

通过子网掩码判断两台设备是否属于同一网段的方法是,将IP地址和子网掩码转换为二进制,然后进行二进制“与”计算,如果得出的结果是相同的,那么这两台计算机就属于同一网段。

比如:

1
2
3
4
5
6
#子网掩码:255.255.254.0
#设备1地址:192.168.0.55
#设备2地址:192.168.1.45

可知:
设备1网段192.168.0,设备2网段192.168.0

使用子网掩码划分子网后,子网内可以通信,跨子网不能通信,子网间通信应该使用路由器,并正确配置静态路由信息。

解决方法

  1. 设置掩码为255.255.192.0,从而在二层打通 192.168.0.0 - 192.168.63.255 ,两个设备间可以走二层直接交付

    1
    2
    3
    4
    # A机
    ifconfig eth0 192.168.32.10 netmask 255.255.192.0
    # B机
    ifconfig eth0 192.168.1.15 netmask 255.255.192.0
  2. 设置静态路由:

    由于掩码是 23 位,A 机所在局域网 IP 地址范围是 192.168.32.1 ~ 192.168.33.254 (0 和 255 一般不分配给主机),B 机所在局域网 IP 地址范围是 192.168.0.1 ~ 192.168.1.254。所以不是同一个 network ,网络不可达,无法 ping 通,只能在 A 机上添加一条到 B 机 network 的静态路由,并且在 B 机器上添加 A 机器的 static route

    1
    2
    3
    4
    # A机
    ip route add 192.168.0.0/23 dev eth0
    # B机
    ip route add 192.168.32.0/23 dev eth0

参考:请教大佬一个关于网络的问题 - V2EX

3.6k words

DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。

604 words

将代码提交到Github时,突然报错:

1
2
3
4
➜  RemoteWorking git:(master) git push
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/yaronzz/xxxxx.git/'

这是由于Github提高了仓库的安全性,访问仓库时需要提供令牌token