文章目录

  • 一、相关系统配置及指令
    • 双硬盘(固态硬盘和机械硬盘)windows10下安装ubuntu16.04
      • 1.1 知识点学习
        • 1.1.1UEFI快速启动
        • 1.1.2 Legacy传统模式启动
        • 1.1.3 进bios设置需要了解
        • 1.1.4 在华硕笔记本选项
        • 1.1.5 U启动版本选择
      • 1.2 固态硬盘先安装了Windows10,在机械硬盘划出空闲空间安装Ubuntu16.04几个要点
      • 1.3 出现问题
    • Ubuntu系统文件在windows系统中显示文件或目录损坏且无法读取
    • VMware无法连接MKS:套接字连接尝试次数太多解决
    • 查看系统内核和版本
    • 虚拟机中ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法
    • ubuntu16.04和虚拟机之间桥接配置网络互联
    • ubuntu配置双网卡工作(无线网接外网,有线网卡接内网)
    • ubuntu配置源
    • ubuntu取消锁屏
    • ubuntu 禁止/取消系统自动更新的方法
    • ubuntu首次给root用户设置密码
    • ubuntu修改hostname
    • ubuntu apt-get安装相关软件
    • Cmake 指令
    • 配置环境变量
    • 第三方库的配置:/etc/ld.so.conf.d目录的使用
      • 1.1 通过ldconfig命令
      • 1.2 通过LD_LIBRARY_PATH环境变量设置
    • ubuntu的/etc/apt/sources.list.d文件夹
    • ssh服务与.ssh设置
    • 网络配置
    • linux环境变量配置
      • 1.1 /etc/profile
      • 1.2 /etc/bashrc
      • 1.3 ~/.bash_profile:
      • 1.4 ~/.bashrc:
      • 1.5 ~/.bash_logout:
    • cpu和nvidia gpu使用率查看
    • 虚拟主机的配置
    • 清除USB记录
    • 软链接和硬链接
    • 查找文件
    • 查看电脑cpu个数及核数
    • 更新配置文件命令
    • ubuntu中apache服务虚拟主机的相关配置
      • 具体配置自己文件夹成虚拟主机的步骤:
    • file:///
  • 二、软件、库的编译与安装
    • gitlab服务器搭建
      • 1.1 配置需要依赖的环境
      • 1.2 安装 gitlab-ce
      • 1.3 相关指令
      • 1.4使用gitlab进行项目管理
        • 1.4.1 项目创建
        • 1.4.2 上传项目
        • 1.4.3 git工程管理master和dev分支
        • 1.4.4 项目删除
        • 1.4.5 修改gitlab密码
    • ntp(network time protocol)时间同步服务器配置
    • 安装SVN
    • virtualenv的使用
    • 源码安装Qt4.8.7
      • 问题:Basic XLib functionality test failed!
    • Qt4.8.7编译器gcc开启c++11特性
    • pro文件中添加动态库
    • QtCreator添加新的Qt版本,这里添加Qt4.8.6为例的配置步骤
    • QT直接运行构建时找不到第三方库头文件
    • 在Build Qt项目时,出现/usr/bin/ld: cannot find -lGL的问题
    • qt中.pro添加CONFIG += link_pkgconfig使用方法
    • 编译Qt对应版本的mysql驱动
    • 编译ffmpeg
    • 安装搜狗输入法
    • wps不能显示中文,qt不能显示中文
    • 多版本python管理
    • 编译opencv3.4.0
    • 抓包工具wireshark
    • Typora MarkDown编辑器安装
    • 安装nvidia要点
  • 三、ubuntu系统相关指令和出现问题解决办法
    • 添加与删除用户与组
    • 串口文件添加普通用户权限
    • 添加mysql到开机启动项
    • dirname用法
    • basename 用法

一、相关系统配置及指令

双硬盘(固态硬盘和机械硬盘)windows10下安装ubuntu16.04

1.1 知识点学习

笔记本电脑有两种启动模式:

1.1.1UEFI快速启动

优点开机速度快,一般新电脑都支持此模式,UEFI模式下安装的操作系统,只能在UEFI快速启动模式下启动,因为UEFI模式只支持64位系统而且分区模式必须是gpt分区,不支持xp系统以及各种32位系统,UEFI模式下硬盘需为GPT分区,否则安装系统会失败,可以下载个u盘启动盘制作工具(推荐快启动),启动win10pe系统进行转换为gpt(如何将mbr转换为gpt)

1.1.2 Legacy传统模式启动

缺点开机速度不够快,一般老旧电脑只支持此模式,传统模式只支持mbr分区,可支持XP、WIN7、WIN8、WIN10

1.1.3 进bios设置需要了解

不管是不是uefi启动,都要禁用Secure boot,否则无法识别启动盘,然后启动模式boot mode选择带有UEFI或Both的表示可以识别uefi启动盘;CSM(Compatibility support Module)表示兼容模块,该选项专为兼容只能在legacy模式下工作的设备以及不支持或不能完全支持UEFI的操作系统而设置。因此,win7支持的是MBR格式,安装win7系统还需要把Launch CSM设置为Enable,表示支持Legacy引导方式

1.1.4 在华硕笔记本选项

win8/win10机型没有uefi选项,Launch CSM默认是Disabled,并开启Secure Boot,开启Secure boot就不能识别启动盘,包括uefi启动盘,所以要禁用Secure Boot,CSM开启时表示兼容Legacy模式,关闭时表示UEFI模式

1.1.5 U启动版本选择

打开运行,输入msinfo32回车,打开“系统信息”,查看BIOS版本,如果支持uefi就会显示,不支持就不会显示uefi;如果你是旧主板,不支持UEFI,那么就选择装机版,如果是新型UEFI主板,就选择UEFI版;如果是Legacy+MBR下安装系统,选择装机版,如果是UEFI+GPT下安装系统,选择UEFI版

1.2 固态硬盘先安装了Windows10,在机械硬盘划出空闲空间安装Ubuntu16.04几个要点

(1) 在固态硬盘分出1G作为linux系统的/boot分区
(2) linux选择/boot分区作为引导文件存放位置

1.3 出现问题

ACPI BIOS Error

Ubuntu系统文件在windows系统中显示文件或目录损坏且无法读取

chkdsk G:/f  //(f表示要修复的盘,注意CHKDSK后面要打下空格健,再输入G:/f:)

提示:“是否计划在下次系统重新启动时检查这个卷”的提示输入:Y,回车,重新启动电脑不要进行任何操作,让电脑自己完全启动,因为系统正在进行修复

VMware无法连接MKS:套接字连接尝试次数太多解决

开始--》命令窗口输入:services.msc

在列表中找到Vmware Autorization Service服务项,在打开的服务属性窗口中,点击“启动类型”下拉按钮,在弹出菜单中选择“自动”菜单项

查看系统内核和版本

内核信息:cat /proc/version

发现版本信息:lsb_release -a或者cat /etc/lsb-release

虚拟机中ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法

由于ubuntu预安装的是tiny版本,所以会导致我们在使用上的产生上述的不便。但是,我们安装了vim的full版本之后,键盘的所有键在vi下就很正常了。
首先,要先卸掉旧版的vi,输入以下命令:

sudo apt-get remove vim-common

然后安装full版的vim,输入命令:

sudo apt-get install vim

ubuntu16.04和虚拟机之间桥接配置网络互联

虚拟机和主机需要配置在同一个子网内,并且配置相同的网关地址
原理:桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致

ubuntu配置双网卡工作(无线网接外网,有线网卡接内网)

  1. /etc/init.d目录只负责一件事情,但却涉及到全系统。它包含系统中各种服务的start/stop脚本,从acpid到x11-common,init.d 脚本包含完整的 start,stop,status,reload 等参数,是标准做法
  2. 在/etc目录下可能还包含rc#.d目录,这也是System V风格,#为数字0到6,为系统的运行级别runlevel。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本
  3. service xxx 启动 /etc/init.d/ 目录下的xxx脚本:
    如:service vsftpd start 和 /etc/init.d/vsftpd start 有同样的作用
  4. /etc/rc.local是Linux启动程序在login程序前执行的最后一个脚本,注意: 一定要将命令添加在exit 0之前。里面可以直接写命令或者执行Shell脚本文件sh
  5. /etc/sysctl.conf这个目录主要是配置一些系统信息,而且它的内容全部是对应于/proc/sys/这个目录的子目录及文件,那么/proc/sys/是用来做什么的呢?大家都知道/proc是每次系统启动的时候都要重新挂载的,它反映了系统内存里面的一些状态。通过/proc/可以很好的了解到当前系统的一些信息。而/proc/sys/则是这些信息的一小部分而已,其实每个’.'分割的就代表一个目录
  6. 如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3,如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5
    等几个ip然后发出去,iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3-192.168.5.5,这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址
    但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip
    假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变
    而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址
    这个时候如果按照现在的方式来配置iptables就会出现问题了
    因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的
    每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip
    这样是非常不好用的MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT
    比如下边的命令:iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
1.  echo value > /proc/sys/xx/yy
2.  vi /etc/sysctl.conf #vi编辑,然后添加设置 ;  sysctl -p #生效
3.  sysctl -w kernel.domainname="example.com" #利用-w生效
(1) 在/etc/sysctl.conf添加net.ipv4.ip_forward=1
(2) /etc/rc.local中添加:
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o wlan0 -j MASQUERADE
exit 0

ubuntu配置源

修改: /etc/apt/sources.list

sudo apt-get update

ubuntu取消锁屏

打开系统设置—》打开亮度和锁屏—》设置屏幕多久关闭和锁屏时间设定,一个“从不”和“关闭”即可搞定

ubuntu 禁止/取消系统自动更新的方法

系统设置–>软件和更新–>更新,将“自动检查更新”和“有新版本时通知我”设置为“从不“,关闭对话框完成设置

ubuntu首次给root用户设置密码

sudo passwd   //执行此命令,之后输入两次密码即可

ubuntu修改hostname

1.编辑/etc/hostname 文件:只需从文件中删除现有的主机名。 将它替换为你想要的新主机名,然后保存文本文件
2.编辑/etc/hosts 文件:找到127.0.1.1 your-old-hostname行,修改名字和hostname相同即可
3.重启电脑,使生效

ubuntu apt-get安装相关软件

sudo apt-get install -y ubuntu-desktop //安装Ubuntu桌面系统
sudo apt-get install -y libopencv-dev  //安装opencv2.4.9库
sudo apt-get install -y vim-common  //安装vim
sudo apt-get install -y cmake
sudo apt-get install -y ffmpeg      //安装播放器和相关开发库

Cmake 指令

–with-lua=no --with-java=no –-with-python=no 不安装对lua ,java等相应语言的支持

配置环境变量

在.profile文件中添加

(1) export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig;$PKG_CONFIG_PATH
(2) export PATH=$PATH:
(3)  export LD_LIBRARY_PATH=

第三方库的配置:/etc/ld.so.conf.d目录的使用

加载动态库的几种方法

1.1 通过ldconfig命令

ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表
    这里面涉及到的关键内容有命令:ldconfig,配置文件目录:/etc/ld.so.conf.d,配置文件在/etc/ld.so.conf内容由用户编辑,缓冲文件/etc/ld.so.cache。
    下面举个例子,比如你在部署软件时,有些动态库安装在exe目录下,可以通过如下方法实现:

(1)配置exe.conf文件,里面加一行/opt/opencv/lib,然后将该文件放到/etc/ld.so.conf.d目录下
(2)在/etc/ld.so.conf文件中增加一行include ld.so.conf.d/exe.conf(默认时添加了*.conf)
(3)执行 ldconfig命令使三方库生效:sudo ldconfig
(4)显示所有的链接库:sudo ldconfig -p
(5)strings命令从ld.so.cache里面检查文本信息:strings /etc/ld.so.cache | grep libopencv*

1.2 通过LD_LIBRARY_PATH环境变量设置

可以通过在.bashrc或者.cshrc中配置该环境变量,LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开

ubuntu的/etc/apt/sources.list.d文件夹

文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器的地址。和sources.list功能一样的是/etc/apt/sources.list.d/*.list(代表一个文件名,只能由字母、数字、下划线、英文句号组成)。sources.list.d目录下的.list文件为在单独文件中写入源的地址提供了一种方式,通常用来安装第三方的软件。

ssh服务与.ssh设置

如果只是要登录到别人的机器,只需要安装openssh-client且ubuntu默认已经安装,如果本机要开放ssh服务允许别人登录就要安装openssh-server:

whereis ssh //查看是否有客户端
sudo apt install openssh-client  //没有的话安装 OpenSSH 客户端应用程序
whereis sshd   //查看是否有服务端
sudo apt install openssh-server  //安装 OpenSSH 服务器应用程序

(1) 权限设置:
用户目录文件夹设置755或者700:sudo chmod 755 ~/.ssh
    known_hosts文件一般设置为644: sudo chmod 644 ./ssh/known_hosts
(2)所有者设置:设置当前用户: sudo chown ubuntu:ubuntu(用户:用户组) ./ssh/known_hosts

网络配置

  1. 临时配置ip
sudo   ifconfig   eth0:1  192.168.245.109    netmask  255.255.255.0  up
  1. 临时网关
route add default  gw  192.168.1.1  eth0 默认网关

linux环境变量配置

1.1 /etc/profile

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从 /etc/profile.d 目录的配置文件中搜集shell的设置。

1.2 /etc/bashrc

为每一个运行 bash shell 的用户执行此文件。当 bash shell 被打开时,该文件被读取。

1.3 ~/.bash_profile:

每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,其他设置的一些环境变量,执行用户的 .bashrc 文件。

1.4 ~/.bashrc:

该文件包含专用于登陆用户的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该该文件被读取。

1.5 ~/.bash_logout:

当每次退出 bash shell 时,执行该文件。
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。
    ~/.bash_profile 是交互式、login 方式进入 bash 运行的。
    ~/.bashrc 是交互式 non-login 方式进入 bash 运行的。
    在登录Linux时要执行文件的过程如下:在刚登录 Linux 时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login 或 ~/.profile 文件中的其中一个(根据不同的 Linux 操作系统的不同,命名不一样),
执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。
如果 ~/.bash_profile 文件存在的话,一般还会执行 ~/.bashrc文件。

cpu和nvidia gpu使用率查看

(1)cpu:安装htop软件:```sudo apt-get install htop```
(2)gpu:```watch -n  1   nvidia-smi  //一秒刷新一次```

虚拟主机的配置

/var/www/html 目录下

清除USB记录

dmesg | grep usb
dmesg –c

软链接和硬链接

(1)软链接:  建立:ln -s /usr/home /usr/local    (使用绝对路径,否则容易找不到)  删除:rm -rf /usr/local
(2)硬链接:  建立:ln  /usr/home  /usr/local  删除:rm -rf  /usr/local

删除硬链接和软链接都不会影响原始文件,但是修改的话会影响原始文件,软链接相当于windows的快捷操作,快捷方式删除了源文件还在。

硬链接的特点是链接文件和原始文件只要有一个存在文件就不会消失,他们共用一个inode,inode随着文件的存在而存在,因此只有当文件存在时才可创建硬链接,即inode存在且链接计数器不为0。inode号仅在各文件系统下是唯一的,因此硬链接创建时不可跨文件系统,不能对目录创立硬链接,因为当前目录(.),父目录(…)就是硬链接。(查看inode号 -i)
软链接有自己的inode号以及用户数据块,可以有自己的文件属性及权限;可对不存在及存在的文件或目录创建软链接;软链接可交叉文件系统;创建软链接i_nlink计数不会增加;

查找文件

(1) which + 可执行文件名称:查看可执行文件位置,在PATH变量指定的路径中,搜索某个系统命令位置
(2) whereis:查看文件位置,只用于程序名的搜索,而且只搜索二进制文件(参数-b),  man说明文件(-m),源代码文件(-s)。如果参数省略,则返回所有信息
(3) locate:配合数据库查看文件位置
(4) find:搜索硬盘查询文件名称find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找find /etc -name httpd.conf  #在/etc目录下文件httpd.conffind /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

查看电脑cpu个数及核数

(1)总核数 = 物理cpu个数  * 每个物理cpu的核数
(2)总逻辑cpu数 = 物理cpu个数  * 每个物理cpu的核数 * 超线程数
(3)查看物理cpu个数: cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
(4)查看每个cpu中core的个数,即核数:cat /proc/cpuinfo | grep "cpu cores" | uniq
(5)查看逻辑cpu数:cat /proc/cpuinfo | grep "processor" | wc -l

更新配置文件命令

source 命令是 bash shell 的内置命令,从 C Shell 而来。
source 命令的另一种写法是点符号,用法和 source 相同,从Bourne Shell而来。
source 命令可以强行让一个脚本去立即影响当前的环境。
source 命令会强制执行脚本中的全部命令,而忽略文件的权限。
source 命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。
source 命令可以影响执行脚本的父shell的环境,而 export 则只能影响其子shell的环境。

方法1 :
让/etc/profile文件修改后立即生效 ,可以使用如下命令:
. /etc/profile 注意: . 和 /etc/profile 有空格
方法2:
让/etc/profile文件修改后立即生效 ,可以使用如下命令:
# source /etc/profile
附:Linux中source命令的用法
source命令:
source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法:
source filename 或 . Filename

ubuntu中apache服务虚拟主机的相关配置

Ubuntu中Apache的配置文件是/etc/apache2/apache2.conf。Apache在启动时会找到这个文件并自动读取该文件中的配置信息,而其他配置文件则是通过include指令包含进来的,在apache2.conf中可以看到这些引入行。当然,也可以将所有的配置全放在apache2.conf或者httpd.conf或者其他文件中,Apache这样划分是一种比较好的习惯。

在Ubuntu中Web文档的根目录是在/var/www中,怎么知道的呢?在/etc/apache2/sites-enabled/000-default中有这样一段内容

<VirtualHost *:80># The ServerName directive sets the request scheme, hostname and port that# the server uses to identify itself. This is used when creating# redirection URLs. In the context of virtual hosts, the ServerName# specifies what hostname must appear in the request's Host: header to# match this virtual host. For the default virtual host (this file) this# value is not decisive as it is used as a last resort host regardless.# However, you must set it for any further virtual host explicitly.#ServerName www.example.comServerAdmin webmaster@localhostDocumentRoot /var/www/html

这是设置虚拟机的,当然,如果觉得没有用的,也可以将apache2.conf里的一行注释掉,并在htttpd.conf中的DocumentRoot设置成某个项目的目录,这样可以方便开发

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

在/etc/apache2目录下,sites-available这个目录包含Apache虚拟主机的配置文件。虚拟主机允许Apache配置多个站点并为每个站点配置不同的参数。而sites-enabled目录的作用是持有/etc/apache2/sites-available目录下文件的链接。当Apache重启后,该目录中包含的站点将会被激活。如果apache上配置了多个虚拟机,每个虚拟机的配置文件都放在sites-available下,那么对于虚拟主机的停用,启动就是非常方便了,操作某个虚拟主机就不用动配置文件了

具体配置自己文件夹成虚拟主机的步骤:

  1. 首先配置host
    在hosts文件中添加 ip地址对应的域名
  2. 打开 /etc/apache2/sites-available 文件夹,将其中的 000-default.conf 文件复制并重命名粘贴在当前文件夹中
cd /etc/apache2/sites-available   //进入目录
sudo cp 000-default.conf xxx.conf  //复制并重命名为xxx
sudo vim xxx.conf  //打开文件编辑
修改:
(1)<VirtualHost *:80> ====》修改为自己的端口号,修改完需要同步设置/etc/apache2/ports.conf添加新的Listen
(2)#ServerName www.example.com ====》修改为前面自己设置的hosts
(3)DocumentRoot /var/www/html ====》修改为自己的目录位置如:/home/ubuntu/temp
  1. 修改/etc/apache2/apache2.conf文件,添加:
<Directory /home/ubuntu/temp>Options Indexes FollowSymLinksAllowOverride NoneRequire all granted
</Directory>

file:///

用file:///加上对应文件的地址,打开对应的本地电脑(或者你所连接到的电脑的 ->中对应的文件

表明访问你的本地硬盘上的某个文件。比如假设你安装了win98在C盘,那么在浏览器里输入file:///c:/windows/readme.htm,那么IE会自动重定向到c:\windows\readme.htm文件并显示它.

二、软件、库的编译与安装

gitlab服务器搭建

1.1 配置需要依赖的环境

sudo apt-get install curl openssh-server ca-certificates postfix

在Postfix安装期间,可能会出现配置屏幕。选择“Internet Site”并按Enter键。使用服务器的外部DNS作为“邮件名称”,然后按Enter键。如果出现其他屏幕,请继续按Enter键接受默认值

1.2 安装 gitlab-ce

  1. 到清华的镜像上去下载镜像
  2. 首先信任 GitLab 的 GPG 公钥:curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
  3. 安装sudo dpkg -i gitlab-ce_*****ce.0_amd64.deb //执行安装
  4. 检查GitLab是否安装好并且已经正确运行(查看gitlab的状态)sudo gitlab-ctl status
  5. 更改访问ip(出现502错误时或主动更改ip):sudo vim /etc/gitlab/gitlab.rb
    修改的external_url 'http://localhost'行为指定ip;修改sudo vim /var/opt/gitlab/gitlab-rails/etc/unicorn.rblisten "127.0.0.1:8080"
    改为自己的端口
  6. 最后执行如下命令让配置文件生效:sudo gitlab-ctl reconfigure
  7. 卸载gitlab:
sudo gitlab-ctl uninstall
sudo dpkg -r gitlab-ce

1.3 相关指令

  1. Ubuntu 下禁止 Gitlab 开机自启动:sudo systemctl disable gitlab-runsvdir.service
  2. Ubuntu 下启用 Gitlab 开机自启动:sudo systemctl enable gitlab-runsvdir.service
  3. 查看状态:sudo gitlab-ctl status
  4. 启动Gitlab所有组件:sudo gitlab-ctl start
  5. 停止Gitlab所有组件:sudo gitlab-ctl stop
  6. 重启Gitlab所有组件:sudo gitlab-ctl restart,启动失败,尝试执行:sudo systemctl start gitlab-runsvdir

1.4使用gitlab进行项目管理

1.4.1 项目创建

git 地址:http://192.168.0.64

群组:007(用来添加组内成员)

通过网页生成一个和项目相同名字的git仓库:

  1. 新建
  2. 输入项目名称
  3. 选择项目人员
  4. 公开===》初始化readme文件
1.4.2 上传项目
  1. 远程仓库位置地址查看:点击clone下拉会有ssh和http两种方式的地址,选择一种即可
  2. 本地项目创建版本:
     git init   git status   git add .   git status   git commit -m " Project Describe"   git status
    
  3. 加入远程库
    git remote add origin git@192.168.245.10:051/051_video_monitor_system.git  //远程仓库取别名为origin
    git remote -v  //显示
    git push -u origin master  //上传到分支
    
1.4.3 git工程管理master和dev分支
命令 含义
master分支 用于存放软件的稳定版本
dev分支 用于存放开发的版本
git push origin dev:dev 把本地的dev分支发布到了远程仓库
git checkout master  // 在合并之前切换到master分支
git merge dev  //把dev分支的代码合并到master分支上
git push  //提交刚刚的操作到远端github仓库
git checkout dev //切回dev分支进行下一步的开发
1.4.4 项目删除

进入项目–》设置–》通用–》高级–》删除

1.4.5 修改gitlab密码
1. 登录到git服务器:sudo 192.168.245.10
2. 切换git用户:su -  git
3. 输入 gitlab-rails console production 进入gitlab控制台
-sh-4.2$ gitlab-rails console production
\-------------------------------------------------------------------------------------GitLab:       11.6.3 (bc9391c)GitLab Shell: 8.4.3postgresql:   9.6.11
\-------------------------------------------------------------------------------------
Loading production environment (Rails 5.0.7)
irb(main):001:0>
4. 输入:user = User.where(id:23).first  通过id号找到user irb(main):018:0> user = User.where(id:23).first
5. user.password='新密码'
6. user.save!   保存
7. exit 退出

ntp(network time protocol)时间同步服务器配置

安装SVN

(1)运行svn:提示是否已安装卸载命令:sudo apt-get remove –purge subversion //--purge 表示彻底删除团建和相关文件(2)sudo apt-get install subversion   //whereis svn 查看位置
(3)qt svn设置:1)subversion命令:这里设置svn命令所在的位置2)输入用户名和密码:在服务器的的配置文件中修改:~/.subversion/auth/svn.simple/
(4)相关命令1)查看版本仓库  svn  ls  svn://192.168.245.1/_PROJECTS_CV

virtualenv的使用

To install version X.X globally from source:

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
$ tar xvfz virtualenv-X.X.tar.gz
$ cd virtualenv-X.X
$ sudo python setup.py install
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
$ tar xvfz virtualenv-X.X.tar.gz
$ cd virtualenv-X.X
$ python virtualenv.py myVE

源码安装Qt4.8.7

./configure --prefix=/opt/Qt-4.8.7/
make -j2
sudo make install

问题:Basic XLib functionality test failed!

You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/brody/software/Qt/qt-src-4.8.7/mkspecs/linux-g++.
sudo apt-get install libX11-dev libXext-dev libXtst-dev

添加环境变量(不强制添加);添加后可在debug工程目录中直接执行生成的二进制文件,因为Qt库文件在环境变量的存在。

export QTDIR=/opt/Qt-4.8.7/
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

Qt4.8.7编译器gcc开启c++11特性

在.pro文件中添加:

(1) QMAKE_CXXFLAGS += -std=c++11 在4.8.7中此方案无效
(2) CONFIG += c++11

pro文件中添加动态库

(1)直接路径+文件名:
LIBS+= /usr/local/libopencv_core.so
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
(2) 路径-L: LIBS+= -L/usr/local 文件名-l: LIBS+= -lpencv_core
LIBS += -L/usr/local/lib \
-lopencv_core \
-lopencv_features2d \
-lopencv_flann \
-lopencv_calib3d \
-lopencv_highgui \
-lopencv_imgproc \
-lopencv_legacy \
-lopencv_nonfree \
-lopencv_objdetect \
-lopencv_stitching

QtCreator添加新的Qt版本,这里添加Qt4.8.6为例的配置步骤

(1) tools>options>Build and Run然后选择Qt Versions,点击添加,加入刚编译好的Qt的qmake执行文件
(2) 选择构建套件(Kits),手动添加一个命名名称为Qt4.8.6,GCC,GDB会自动检测,下拉滑到Qt版本选项,这里需要指定Qt Version,默认是None,下拉选择刚刚添加的的Qt 4.8.6的版本

QT直接运行构建时找不到第三方库头文件

  1. qmake:根据实际环境创建项目文件.pro并且运行qmake生成适当的Makefile
  2. 构建:构建是增量编译,只编译有变化部分
  3. 重新构建:是把所有部分都重新编译
  4. 运行: 有改动则根据已有的Makefile进行编译,执行构建和重新构建时如果没有Makefile,会根据.pro文件等生成Makefile后再编译

发现是由于新项目没有执行(构建—>执行qmake命令),正确的运行顺序应该是:qmake-构建-运行

在Build Qt项目时,出现/usr/bin/ld: cannot find -lGL的问题

ubuntu@master:~$  locate libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0ubuntu@master:~$ sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0 /usr/lib/libGL.so

qt中.pro添加CONFIG += link_pkgconfig使用方法

CONFIG配置信息,pkg-config是linux下的一个命令,用于获取某一个库/模块的所有编译相关的信息,在源码编译时,如编译opencv只需要写 pkg-config opencv –libs --cflags而不需要自己去找opencv头文件和链接库位置,pkg-config 的信息来自 /usr/lib/pkgconfig/usr/lib/x86_64-linux-gnu/pkgconfig 文件夹下的 *.pc 文件或者PKG_CONFIG_PATH环境变量路径下的 *.pc文件

CONFIG += link_pkgconfig
PKGCONFIG += glib-2.0

编译Qt对应版本的mysql驱动

创建工程,在pro中添加sql模块

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("");
db.setUserName("");
db.setPassword("");if(!db.open())
{qDebug()<<"connect failed";qDebug << QSqlDatabase :: drivers();  //打印支持的驱动QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));qDebug << db.lastError;  //打印连接错误
}else
{qDebug()<<"connect success";
}

执行以上代码编译出现以下错误:说明现有驱动所不满足的依赖性,故要重新编译

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL QMYSQL3 QODBC

在qt安装目录(源码目录):/home/Qt4.8.6/src/plugins/sqldrivers/mysql,修改mysql.pro文件,添加需要连接的mysql服务器对应的头文件和库目录文件,即

INCLUDEPATH += /usr/local/mysql/include
LIBS+= -L/usr/local/mysql/lib  -lmysqlclient_r

之后执行:

/opt/Qt4.8.6/bin/qmake  ./mysql.pro   //指定对应的qmake版本执行
make  //生成库libqsqlmysql.so
sudo cp libqsqlmysql.so /opt/Qt4.8.6/plugins/sqldrivers //复制到qt中

当编译出现以下错误时:

 libssl.so.10->not foundlibcrypto.so.10->not found

执行find /usr -name 'libssl*'没有相关文件则sudo apt-get install libssl-devsudo apt-get install openssl;有相关文件但是对应的版本不对,则进行软连接;

编译ffmpeg

添加–enable-shared 生成动态库

安装搜狗输入法

  1. 移除ibus
    sudo apt-get purge ibus
    sudo apt-get autoremove
  2. 安装fcitx
    sudo apt-get install fcitx
  3. 安装搜狗
    sudo dpkg -i sougou_64.deb
  4. 提示fcitx各种缺失:
    apt-get -f install
  5. 安装sudo dpkg -i sougou_64.deb时遇到的问题如下,该问题可以不用去理睬:
    No such key ‘Gtk/IMModule’ in schema ‘org.gnome.settings-daemon.plugins.xsettings’ as specified in override file ‘/usr/share/glib-2.0/schemas/50_sogoupinyin.gschema.override’; ignoring override for this key.
  6. 找不到搜狗输入法
    在fcitx中的选项Only Show Current Language 关闭,不勾选就可以选择搜狗输入法了

wps不能显示中文,qt不能显示中文

Qt的语言库,缺少支持中文输入的动态链接库。

  1. 我的Qt安装在/usr/local/Qt/
  2. Qt Creator 会去以下目录寻找支持:
    /usr/local/Qt/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts
  3. 我们的应用程序会去以下目录寻找支持
    /usr/local/Qt/5.10.1/gcc_64/plugins/platforminputcontexts
  4. 两个目录都不存在ibus或fcitx的动态链接库
  5. 寻找fcitx-frontend-qt5的安装目录,qt4则选fcitx-frontend-qt4,在终端输入:dpkg -L fcitx-frontend-qt5
  6. /usr/lib64/qt4/plugins/inputmethods/libfcitxplatforminputcontextplugin.so 复制到Qt动态链接库的目录去
    所以我们需要在以上目录添加我们输入法的动态链接库(ibus或fcitx)

多版本python管理

path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径
classpath是指定你在程序中所使用的类(.class)文件所在的位置,就如在引入一个类时:import javax.swing.JTable这句话是告诉编译器要引入javax.swing这个包下的JTable类,而classpath就是告诉编译器该到哪里去找到这个类(前提是你在classpath中设置了这个类的路径);如果你想要编译在当前目录下找
1.安装:

(1)./configure --prefix=/home/software/python36
(2)make -j2
(3) make altinstall

配置环境变量
linux环境变量分为临时和永久两种,临时环境变量在切换用户或终端时失效。永久环境变量分为用户级别和系统级别两种,系统级别修改/etc/profile文件,用户级别修改vim /.bash_profile
如: export CLASSPATH=./JAVA_HOME/lib;JAVAHOME/jre/lib添加:exportPATH=JAVA_HOME/jre/lib 添加:export PATH=JAVAH​OME/jre/lib添加:exportPATH=PATH:/home/software/python36/bin
立即生效
方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/profile 有空格
方法2: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # source /etc/profile

编译opencv3.4.0

cmake -D CMAKE_BUILD_TYPE=Release
-D CMAKE_INSTALL_PREFIX=/opt/opencv-3.4.0
-D OPENCV_EXTRA_MODULES_PATH=/home/opencv-3.4.0/opencv_contrib-3.4.0/modules/
-D INSTALL_PYTHON_EXAMPLES=ON ..

cmake的时候,有些contrib模块编译时需要的文件可能下载不下来,具体信息可以到build目录下CMakeDownloadLog.txt查看,去对应网址下载好文件放到opencv-3.4.0/.cache目录下(注意这是个隐藏文件)的对应文件夹里,并重命名(加上前面的一串字符,注意要一一对应),再重新cmake。这里我将自己下载的缺少的文件(data,ippicv,tiny_dnn,dnn_face_detector,xfeatures2d)

如果联网会在主文件夹下生成.cache文件夹下载需要文件,把相应的*.i文件拷贝到opencv_contrib/modules/xfeatures2d/src目录下,注意文件命名要和opencv_contrib-3.4.0/modules/xfeatures2d/src/vgg.cpp:474行相同

/home/opencv-3.4.0/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42:
fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
#ifdef HAVE_OPENCV_XFEATURES2D # include "opencv2/xfeatures2d/cuda.hpp" #endif

说明头文件位置不对,拷贝过来即可:

make -j
sudo make install

抓包工具wireshark

工具安装和使用

Typora MarkDown编辑器安装

  1. 官网直接下载二进制安装包
  2. tar -xzvf Typora-linux-x64.tar.gz -C /opt/ //解压到opt目录
  3. ./Typora //启动
  4. 添加桌面:
    cd /usr/share/applications/Typora.desktop
    sudo vim Typora.desktop
[Desktop Entry]
Name=Typora
GenericName=Editor
Comment=Typroa - a markdown editor
Exec="/opt/Typora-linux-x64/Typora" %U
Icon=/opt/Typora-linux-x64/resources/app/asserts/icon/icon_256x256.png
Terminal=false
Categories=Markdown;
StartupNotify=false
Type=Application

安装nvidia要点

  1. bios中security boot设置为disabled
  2. 把默认驱动neuveau加入模块黑名单不启动
  3. 进入tty1,执行关闭service lightdm stop命令(LightDM,即:Light Display Manager,是一个全新的、轻量的Linux桌面的桌面显示管理器,而传统的Ubuntu用的是GNOME桌面标准的GDM。[1]。 LightDM是一个跨桌面显示管理器,其目的是成为 X org X 服务器的标准显示管理器,Lightdm,gdm3和KDM都是针对linux的图形化登录。 Lightdm是Ubuntu的默认版本)
  4. 安装XX.run文件
  5. 卸载在安装目录/usr/bin文件夹下执行nvidia-uninstall
  6. 执行nvidia-settings报错,安装sudo apt-get install nvidia-settings

三、ubuntu系统相关指令和出现问题解决办法

添加与删除用户与组

[root@localhost /]# useradd haha   #创建用户  haha是用户名
[root@localhost /]# passwd haha   #为该用户设置密码
更改用户 haha 的密码
新的 密码:******   [root@localhost /]# userdel -r haha

串口文件添加普通用户权限

  1. 可以看到owner 是 root,所属用户组为 dialout,dialout是一个group,它主要负责对于串口的权限,原文是这样描述它的:
    Full and direct access to serial ports. Members of this group can reconfigure the modem, dial anywhere, etc.
    意思是说对于串口具有完整和直接的访问权限,这个组的成员可以重新配置调制解调器、拨号到任何地方等等
ls -al /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 12月 25 08:54 /dev/ttyS0
  1. 查看dialout用户组成员,发现普通用户dev并没有在dialout组,我们将普通用户加入到dialout就可以解决这个问题
grep 'dialout' /etc/group
dialout:x:20:
  1. 临时处理,修改权限为可读可写可执行,但是这种设置电脑重启后,又会出现这种问题
sudo chmod 777 /dev/ttyUSB0
  1. 其中ubuntu是我的用户名,换成你想用USB的用户名即可,把此用户名加入dialout用户组,然后注销下电脑
whoami  //查看当前用户
sudo adduser ubuntu  dialout
//使用sudo usermod -aG dialout ubuntu 出现错误usermod:“ dialout”组不存在

添加mysql到开机启动项

sudo apt-get install sysv-rc-conf //安装和使用sysv-rc-conf工具
1. c --level 2345 mysql off //执行2. sysv-rc-conf   //执行弹出选项框,手动进行选择,如下用键盘方向键定位,用空格键选择,//“X”表示开启该服务,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出
0        系统停机状态
1        单用户或系统维护状态
2~5      多用户状态
6        重新启动

dirname用法

dirname 命令读取指定路径名删除最后一个“/”(斜杠)及其后面的字符,保留其他部分,并写结果到标准输出。如果最后一个“/”后无字符,dirname 命令使用倒数第二个“/”,并忽略其后的所有字符。dirname 命令在创建路径名的时候遵从以下规则:

  1. 如果 Path 参数为“//”(双斜杠),或者参数 Path 全部由斜杠组成,将其转换为单斜杠“/”。从指定路径删除尾部的“/”字符。
  2. 如果参数 Path 中没有剩下的“/”,则将路径转换成 . (点) 从路径中删除尾部的所有非斜杠字符。
  3. 如果剩下的路径为“//”(双斜杠),删除路径尾部的斜杠字符。
  4. 如果剩下的路径为空,则转换成单斜杠“/”。
dirname //      ------>结果为 /(斜杠)
dirname /a/b/   ------>结果为:/a
dirname a       ------>结果为 . (点)
dirname a/b     ------>结果为路径名 a
示例一:       # /usr/bin为获取到的目录
[root@local ~]# dirname /usr/bin/sort
/usr/bin示例二:       # 如无/则获取当前目录.
[root@local ~]# dirname stdio.h
.示例三:         # 含/和无/,其结果和不含/效果一样的
[root@local ~]# dirname /usr/bin
/usr
[root@local ~]# dirname /usr/bin/
/usr示例四:       # 获取多个目录列表,以换行为分隔
[root@local ~]# dirname dir1/file1 dir2/file2
dir1
dir2示例五:       # 获取多个目录列表,以NUL为分隔
[root@local ~]# dirname -z dir1/file1 dir2/file2
dir1dir2
!/bin/bash  # 跳转到脚本所在目录
cd $(dirname "$0") || exit 1  # 对上面的脚本的解释
$0                当前Shell程序的文件名
dirname $0        获取当前Shell程序的路径
cd $(dirname $0)  进入当前Shell程序的目录
exit 1            如果获取不到则退出脚本  

basename 用法

basename命令用于去掉文件名的目录和后缀(strip directory and suffix from filenames),对应的dirname命令用于截取目录

示例一        # 获取到最后文件名sort
[root@local ~]# basename /usr/bin/sort
sort示例二        # 去除文件名后缀
[root@local ~]# basename /usr/include/stdio.h .h
stdio
[root@local ~]# basename /usr/include/stdio.h stdio.h
stdio.h示例三        # 去除文件名后缀方式的另外一种方法
[root@local ~]# basename -s .h /usr/include/stdio.h
stdio示例四        # 获取多个目录下的文件列表,以换行符\n为分隔
[root@local ~]# basename -a dir1/file1 dir2/file2
file1
file2示例五        # 获取多个目录下的文件列表,以NUL为分隔
[root@local ~]# basename -a -z dir1/file1 dir2/file2
file1file2

ubuntu16.04开发环境总结相关推荐

  1. Ubuntu16.04 开发环境配置

    1. 编辑器&GUI vim sudo apt-get install vim vim+python 请参考Vim与Python真乃天作之合. codeblocks 官网:http://cod ...

  2. 瑞芯微的linux内核文件在哪里下载,瑞芯微最新开发资料下载--rk3399 ubuntu16.04开发说明...

    rk3399 ubuntu16.04 开发说明 1 下载和解压 ubuntu rk3399-excavator ubuntu 根文件系统是基于 ubuntu-base-16.04 来创建的.ubunt ...

  3. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建

    Ubuntu14.04开发环境搭建 嵌入式开发过程中很重要的一环节就是开发环境的搭建,开发环境搭建的好可以很好的提高开发效率.其中关键的一部就是挂载运行程序,对于程序的挂载运行需要借助NFS服务器,下 ...

  4. ESP32在Ubuntu16.04的环境搭建

    1.Ubuntu16.04的下载: ubuntu16.04镜像下载 2.安装好Ubuntu16.04后,先检查是否连接到网络: 或打开终端2执行命令检查:ping www.baidu.com 出现红框 ...

  5. android NDK 在Ubuntu10.04开发环境的搭建

    2019独角兽企业重金招聘Python工程师标准>>> 最近可能要用到调用jni,我对NDK和Jni了解非常的少,今天根据网络上的一些博客搭建了一下NDK的开发环境,但是继续往下编译 ...

  6. 嵌入式Linux开发环境搭建之八---Ubuntu16.04 tftp环境搭建

    1.Linux下安装tftp 首先利用命令:dpkg -l | grep tftp,查看tftp是否安装,如果没有安装,则可以按下面步骤进行安装. 1.安装相关软件包:tftpd-hpa(服务端),t ...

  7. 嵌入式ubuntu14.04开发环境搭建(详细图解)

    软件环境:VMware12 + Ubuntu14.04 64bit + win7 64bit  8G物理内存和100GB的磁盘空间 硬件环境:路由器 + PC 准备工作:     a. 下载VMWar ...

  8. ofbiz mysql_OFBIZ 10.04 开发环境搭建(ofbiz+mysql+eclipse)

    1.下载安装 JDK1.6,并设置环境变量在"我的电脑"上点右键->"属性"->"高级"-> "环境变量(N)& ...

  9. 打造完美自用Ubuntu 18.04 开发环境,解决qq微信网易云

    先上最终图,下面是具体步骤 唠叨几句:壁纸是新恒结衣,为canon代言,自己修改的字体用的也是canon字体:dock没动,纯粹仿造不如去买mac,省时省力:自用电脑是vn7一代的,坑爹的键盘加上没有 ...

最新文章

  1. 不断的困惑:为什么我仍然使用JavaScript函数语句
  2. PHP实现MVC开发: 一个简单的MVC(转)
  3. EndNote 高校_【工具】EndNote使用小记
  4. 网站长尾关键词优化有门道!
  5. 白牌交换机有什么特点?与传统换机相比有什么特别之处?
  6. 网络协议基础:ARP简析
  7. java executor spring_Spring+TaskExecutor实例
  8. jQuery原理第一天
  9. centos7 网卡配置vlan_CentOS7网卡创建vlan步骤
  10. 【Kafka】kafka KafkaException: Exception while loading Zookeeper JAAS login context ‘Client‘
  11. Redis--位图BitMap
  12. 小米3g刷高格固件_高恪可刷机型清单
  13. Comdo安全防火墙
  14. 无损音乐播放器,有软件与硬件之分
  15. 在activity之间传递数据
  16. 快看,这是我为你准备的Python爬取图片教程
  17. 【Python处理EXCEL】--pandas导入Excel文件
  18. 20200107笔记
  19. 外卖店优先级 第十届蓝桥杯真题 C++
  20. 《程序员修炼之道:从小工到专家》The Pragmatic Programmer: From Journeymen to Master

热门文章

  1. 怎么搭建大数据平台,这个大数据平台方案值得学习
  2. leetcode/变位词组,变位词放一起
  3. 计算机的优势和劣势_马上就要计算机二级考试了,它的含金量你还不知道?
  4. c++请输入任意键继续
  5. idea2019 通过Maven形式创建的WEB工程配置文件要统一放在这里
  6. JavaMail + 腾讯企业邮箱 发送邮件
  7. 华为那些手机有鸿蒙系统,首批支持鸿蒙系统的手机有哪些?华为鸿蒙系统支持机型全一览[多图]...
  8. 第2章搭建CRM项目开发环境(搭建开发环境)
  9. hive中如何实现13位时间戳转毫秒时间类型
  10. 如何在电脑里装虚拟机里装esxi8.0里装Windows