CentOS-用户的管理

用户组及配置文件

用户的类型

Linux是一个多用户、多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现
不同的作用或权限,可以合理利用和控制系统资源。
Linux系统中用户角色分为三类:
1、管理员用户
默认是root用户,它的UID 和GID均为0,系统安装完成后自动生成的,默认通过它就可以登录系统,拥有最高的管理权限。
2、普通用户
由系统管理员root创建的,创建完成后可以登录系统,但默认无法创建、修改和删除任何管理员下的文件;UID从500-65535
3、虚拟用户(系统用户)
安装系统后默认生成的用户,大多数不能登录系统,但它们是系统正常运行不可缺少的,它们的存在主要是为了方便系统管理,满足相应的系统进程对文件所属用户的要求;UID从 1-499
类型        UID
root         0
虚拟用户    1-499
虚拟用户时为了满足系统中每个服务/进程在运行的时候都要有一个用户和家庭。
普通用户    500+

常用的命令解释器

/bin/bash       普通用户默认的命令解释器
/sbin/nologin   虚拟用户(傀儡用户)使用
[[email protected] ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

用户及组配置文件

[[email protected] ~]# ll /etc/passwd /etc/shadow /etc/group /etc/gshadow
-rw-r--r-- 1 root root  648 Sep 12 12:05 /etc/group         用户组信息
---------- 1 root root  529 Sep 12 12:05 /etc/gshadow       用户组密码
-rw-r--r-- 1 root root 1271 Sep 12 12:05 /etc/passwd        用户信息
---------- 1 root root  936 Sep 12 12:09 /etc/shadow        用户密码

/etc/passwd 

/etc/passwd  存放用户信息
存储用户信息,每一行表示一个用户信息,有多少行就表示多少个用户信息。

[[email protected] ~]# cat /etc/passwd  存放用户信息
root:x:0:0:root:/root:/bin/bash
root     :x             :0     :0      :root             :/root           :/bin/bash
nobody   :x             :99    :99     :Nobody           :/               :/sbin/nologin
clsn     :x             :500   :500    :                 :/home/clsn      :/bin/bash
用户名   原来密码的位置  UID   GID    用户的说明信息     用户的家目录     命令解释器

/etc/shadow

存储用户密码信息文件

[[email protected] ~]# cat /etc/shadow
LH : ! !: 17751: 0: 99999: 7: : :
此文件由9个字段的数据组成,字段之间用“:”分隔,格式如下:
1用户名 2 密码 3 最近改动密码的日期 4 密码不可被更动的天数 5 密码需要重新变更的天数 6 密码需要变更期限前的警告期限 7 密码过期的恕限时间
8帐号失效日期 9 保留

/etc/group

主要存储组相关信息的文件

[[email protected] ~]# cat /etc/group
nfsnobody  :    x      :     500        :
组名       组密码      组ID(GID)   组成员
此文件由4个字段的数据组成,字段之间用“:”分隔

/etc/gshadow

主要用来存储组密码信息

[[email protected] ~]# cat /etc/gshadow
nfsnobody     :    !         :               :
组名          组密码           组管理员       用户组成员
此文件由4个字段的数据组成,字段之间用“:”分隔

/etc/skel 

/etc/skel目录是在linux下面添加一个新用户使用的用户老家的模板。和创建用户相关的目录
此目录用来存放新用户需要的所有基础环境变量文件的目录。
用户家目录缺少.bash开头的文件    会出现的错误

[[email protected] ~]$ rm -f .bash* 删除用户家目录下的环境变量后,退出
-bash-4.1$ 重新登录

新用户家目录中的三个隐藏文件,与/etc.skel中的相同。

[[email protected] skel]# useradd alex888
[[email protected] skel]# su - alex888
[[email protected] ~]$ ll -a
total 20
drwx------  2 alex888 alex888 4096 Sep 12 10:18 .
drwxr-xr-x. 6 root    root    4096 Sep 12 10:18 ..
-rw-r--r--  1 alex888 alex888   18 Mar 23 08:15 .bash_logout
-rw-r--r--  1 alex888 alex888  176 Mar 23 08:15 .bash_profile
-rw-r--r--  1 alex888 alex888  124 Mar 23 08:15 .bashrc
.bash_logout   用户登出的时候运行这个文件里的内容
.bash_profile  环境变量
.bashrc        存放用户的别名数

模拟故障

通过故障 了解/etc/skel 文件的作用

[f:\~]$ ssh 10.0.0.200 22         本地shell使用ssh登录进nfsnobody用户

[[email protected] ~]$ ls -a    ls -a 查看下家目录下的文件 包括隐藏文件
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .viminfo
[[email protected] ~]$ rm -rf .bash*    删除.bash开头的文件  模拟故障
[nfsnobod[email protected] ~]$ exit     退出  重新登录
logout
如果模拟故障不成功,
原因分析:1、vim /etc/profile   2、注释掉PS=那行 3、 source /etc/profile

[f:\~]$ ssh 10.0.0.200 22         重新登录

-bash-4.1$ ls -a                  命令行 变了 出现故障
.  ..  .bash_history  .viminfo
-bash-4.1$ cp /etc/skel/.bash* ~  把/etc/skel目录下.bash开头的文件 复制一份到家目录
-bash-4.1$ exit                    退出 重新登录
logout

[f:\~]$ ssh 10.0.0.200 22

[[email protected] ~]$ ls -a     命令行恢复  故障解决
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .viminfo

useradd工作原理

useradd命令工作原理有以下几步完成:
1、不带任何参数使用添加用户时,首先读/etc/login.defs    /etc/default/useradd 预先定义的规则
2、根据设置的规则添加用户,同时会向/etc/passwd  /etc/group文件添加新建的用户和组,但/etc/shadow   /etc/gshadow也会同步生成记录
3、同时系统会根据/etc/login.defs    /etc/default/useradd文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。

/etc/login.defs  控制用户的默认信息
/etc/login.defs文件定义了与/etc/password和/etc/shadow配套的用户限制设定。这个文件是需要的,缺失并不会影响系统的使用,但是也许会产生意想不到的错误。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。

用户相关命令

useradd

useradd 命令创建用户
语法格式:useradd  [options] [login] 
useradd  [选项]    [用户名]
参数:
-n 不创建以用户名为名的组
-c 创建用户时,添加个人信息
-u 用户ID值,这个值必须是唯一的
-s 用户登录后使用的shell
-g 指定用户对应的组,对应的组必须在系统中存在

useradd命令不使用参数

useradd 命令创建用户
xshell不允许用户无密码登录

[[email protected] ~]# useradd LH            创建一个新用户
[[email protected] ~]# tail -1 /etc/passwd   创建后的用户 信息都是默认的  没有密码
LH:x:502:502::/home/LH:/bin/bash             创建成功  /etc/passwd 可以查到
[[email protected] ~]# grep LH /etc/group    使用grep 过滤下LH的组信息 
LH:x:502:                         创建了一个以用户名为名的组

useradd -n

-n 不创建以用户名为名的组

[[email protected] ~]# useradd -n LH1               创建一个用户
[[email protected] ~]# grep LH1 /etc/passwd         过滤检验下 创建成功
LH1:x:503:100::/home/LH1:/bin/bash
[[email protected] ~]# grep LH1 /etc/group          过滤下组信息 没有同名的组
LH:x:502:
[[email protected] ~]# id LH1                       使用id命令看下 LH1这个用户在users这个组里
uid=503(LH1) gid=100(users) groups=100(users)

useradd -c

-c 创建用户时,添加个人信息
创建用户的同时,添加agan2用户的个人信息,个人信息使用逗号隔开

[[email protected] ~]# useradd -c nfsnobody,15810516499,河北LH     格式
[[email protected] ~]# grep  "LH" /etc/passwd                 过滤下信息查看
LH:x:506:506:nfsnobody,15810516499,河北:/home/LH:/bin/bash

useradd -u 

-u 用户ID值,这个值必须是唯一的
创建用户的同时,修改用户默认的UID

[[email protected] ~]# useradd -u 888 LH                      格式规范
[[email protected] ~]# grep  "LH" /etc/passwd                 过滤下信息查看
LH:x:888:888::/home/LH:/bin/bash

useradd -s

-s指定用户登录后的shell
/sbinlogin 表示禁止登录
此例在企业中部署nginx、mysql等服务时经常用到

[[email protected] ~]# useradd -s /sbinlogin  tian
[[email protected] ~]# grep -w "tian" /etc/passwd 
tian:x:8892:8892::/home/tian:/sbinlogin

useradd -g

-g 指定用户对应的组,对应的组必须在系统中存在
-G参数会把修改记录在/etc/group
让用户,隶属于到edu组,这里通过id 命令来查看用户,所属于的组。
因为使用-g 组信息记录在/etc/passwd中。事实上系统确认一个用户的所属组的时候是根据/etc/passwd的组ID。 
因此,useradd -g仅仅修改/etc/passwd,而不会修改/etc/group。 
加"-G"参数会把修改记录在/etc/group

[[email protected] ~]# groupadd HH           创建一个新的组
[[email protected] ~]# tail -1 /etc/group        查看新建的组信息
HH:x:503:
[[email protected] ~]# useradd -g HH LH2     使用-g创建一个新用户使他属于HH这个组
[[email protected] ~]# id LH2                查看
uid=504(LH2) gid=503(HH) groups=503(HH)
[[email protected] ~]# grep LH2 /etc/passwd  查看下用户的信息
LH2:x:504:503::/home/LH2:/bin/bash
[[email protected] ~]# tail -1 /etc/group    
查看下组的信息  虽然加入了组 但是在group这个文件里 并没有显示出来
HH:x:503:
[[email protected] ~]# useradd -G HH LH3      用-G创建一个新用户 并加入到这个组
[[email protected] ~]# grep LH3 /etc/group    查看LH3的组信息  可以发现同时属于两个组
HH:x:503:LH3
LH3:x:505:
[[email protected] ~]# grep LH3 /etc/passwd   过滤下LH3用户信息
LH3:x:505:505::/home/LH3:/bin/bash
[[email protected] ~]# id LH3                  -G创建的LH3 同时属于两个组
uid=505(LH3) gid=505(LH3) groups=505(LH3),503(HH)
[[email protected] ~]# id LH2                  -g创建的LH2 属于HH这个组
uid=504(LH2) gid=503(HH) groups=503(HH)
[[email protected] ~]# grep HH /etc/group
HH:x:503:LH3

usermod

usermod 修改系统已经存在的用户信息
语法:usermod   [options]    [login]
      usermod   [选项]       [用户名]
参数:
-c   修改用户的个人信息,同useradd 的-c功能  
-g   修改用户对应的用户组,同  useradd的-d功能
-s   修改用户登录后使用的shell名称,同useradd的-s功能
-u   修改用户的uid ,同useradd 的-u功能
-l   修改用户的名称

usermod

格式
usermod  -l  u1   LH
            新名 已存在的名
把LH的用户名改为u1

[[email protected] ~]# ls /home/        查看一下信息
LH  LH1  LH2  LH3  nfsnobody  www
[[email protected] ~]# id LH            LH的ID信息
uid=502(LH) gid=502(LH) groups=502(LH)
[[email protected] ~]# usermod -l u1 LH   修改名字
[[email protected] ~]# id u1              查看u1的ID
uid=502(u1) gid=502(LH) groups=502(LH)   
[[email protected] ~]# id LH            查看LH的
id: LH: No such user                    修改成LH已经不存在了
[[email protected] ~]# ls /home/        查看家目录
LH  LH1  LH2  LH3  nfsnobody  www
[[email protected] ~]# su - u1          切换到u1用户
[[email protected] ~]$ pwd                u1用户的家目录还是LH  家目录名称没有变
/home/LH

useradd与usermod的区别

useradd与usermod 有很多相同的参数
命令不同之处  
useradd是对新用户(要创建的用户)作用/配置
usermod是对已存在的用户配置

userdel

userdel 删除用户
语法:userdel   [options]  [login]
      userdel   [选项]     [用户名]
参数:           
-f     强制删除用户
-r     删除用户的同时,删除与用户相关的所有文件(包含邮箱信息)
userdel可以直接删除参数  注意需要加-r参数 不然会删除不彻底(不干净)会导致以后创建同名的用户无法创建

彻底删除用户

userdel -rf  彻底删除删除与用户相关的所有文件(包含邮箱信息)
可以不加f  但是想彻底删除一个用户 必须要加-r

[[email protected] ~]# ls /home/
LH1  LH2  LH3  nfsnobody  www
[[email protected] ~]# userdel -rf LH1    -rf 彻底删除一个用户 
[[email protected] ~]# id LH1
id: LH1: No such user
[[email protected] ~]# ls /home/
LH2  LH3  nfsnobody  www
[[email protected] ~]# ls /var/spool/mail/
LH2  LH3  nfsnobody  root  www

未彻底删除补救方法

未彻底删除导致的问题

[[email protected] ~]# ls /home/       查看下用户家目录信息
LH2  LH3  nfsnobody  www
[[email protected] ~]# userdel LH2     未使用参数删除用户
[[email protected] home]# id LH2       确实已经删除了  id也查询不到
id: LH2: No such user
[[email protected] ~]# useradd LH2     但是创建同名用户显示用户已存在
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists        大概意思是用户已存在

补救方法

[[email protected] ~]# cd /var/spool/mail/   进入到用户的邮箱  删除LH2的邮箱
[[email protected] mail]# ls                 先看一下
LH2  LH3  nfsnobody  root  www
[[email protected] mail]# rm -rf LH2
[[email protected] mail]# cd /home/        进入到/home目录  这是普通用户的家目录
[[email protected] home]# ls
LH2  LH3  nfsnobody  www
[[email protected] home]# rm -rf LH2      删除LH2这个目录
[[email protected] home]# ls /home/       检查是否删除
LH3  nfsnobody  www                          已删除
[[email protected] home]# vim /etc/passwd
删除或注释里面开头是LH2的信息
[[email protected] home]# vim /etc/group
删除或注释里面开头是LH2的信息
[[email protected] home]# useradd LH2       重新尝试创建 可以创建
[[email protected] home]# id LH2            检查
uid=506(LH2) gid=506(LH2) groups=506(LH2)
passwd 

修改用户密码命令
语法:passwd [option] [username]
passwd [选项]   [用户名]
参数:
--stdin //从标准输入读取密码字符串

修改当前用户的密码

普通用户使用passwd 修改密码时,必须满足密码复杂性要求;root 修改密码不需要满足密码复杂性。

[[email protected] ~]# passwd 
Changing password for user root.
New password:                     输入新密码
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:              再次输入
passwd: all authentication tokens updated successfully.  更新成功

修改普通用户的密码

root用户可以直接修改 不用满足密码复杂性

[[email protected] ~]# useradd u1
[[email protected] ~]# passwd u1
Changing password for user u1.
New password: 
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.

非人工交互设置密码

--stdin  这个命令在工作中批量设置密码时很有用
一条命令非人工交互设置密码(企业使用技巧)

[[email protected] ~]# echo "123456" | passwd --stdin u1
Changing password for user u1.
passwd: all authentication tokens updated successfully.  密码更新成功

批量更新用户的密码

批量更新用户的密码
格式  
用户名:密码,
用户必须存在才可以,一行一个用户

[[email protected] gj]# chpasswd    输入命令
root:123456                      格式  用户名:密码,用户必须存在才可以,一行一个用户
u1:123456
u2:654321                        输入完成后,直接ctrl+D 结束输入

此命令有一个缺点 当一行输入错误后,不能返回修改。
当使用useradd 命令批量创建用户后,可以使用chpasswd 命令批量设置密码或批量修改密码。
把用户和密码字符串放到文件里执行批量改密码

[[email protected] gj]# cat passwd.txt         先将密码写入一个文件
u1:123
u2:321
u3:123
[[email protected] gj]# chpasswd < passwd.txt  然后使用<重定向到chpasswd

su和sudo

su的使用

su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
su 切换用户却不切换工作环境 , su - 同时切换用户与工作环境
缺点:用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险
su  与  su - 

[[email protected] home]# cd /etc/     先进入/etc目录下
[[email protected] etc]# su nfsnobody     使用su 切换用户
[[email protected] etc]$ exit        切换后还在/etc目录下  退出
[[email protected] etc]# su  - nfsnobody  使用su - 切换
[[email protected] ~]$               切换后自动返回当前用户的家目录
[[email protected] ~]$ pwd
/home/nfsnobody

sudo

su的缺点造就了sudo的诞生
由于用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险。
为了既保证系统的安全又可以执行相应命令,sudo 也就以此诞生。
sudo作用:通过配置文件来限制用户的权限 ,可以让普通用户在执行指定的命令或程序时,拥有超级用户的权限。
sudo的工作过程如下:
当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
若密码输入成功,则开始执行sudo后续的命令
root执行sudo时不需要输入密码(因为sudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
给普通用户u1提权,让普通用户可以查看root用户的家目录;普通用户可以使用useradd命令,创建新用户
分析步骤:

useradd   u1
visudo=vi打开/etc/sudoers文件 或  vim  /etc/sudoers 
visudo会检查内部语法,避免用户输入错误信息,所以我们一般使用visudo,编辑此文件要用root权限
编辑文件的第98行,编辑完成后,wq! 强制保存退出
root    ALL=(ALL)     ALL
u1      ALL=(ALL)     /bin/ls,/usr/sbin/useradd 
使用u1 用户登录测试       
sudo    useradd  u11     可成功创建用户,证明提权成功
sudo    ls   /root       可查看root的家,证明提权成功
sudo   -l         -l 参数是列出当前用户可执行的命令,但只有在sudoers文件里的用户才能使用该选项。
[[email protected] ~]$ sudo -l(小L)

用户查询命令

w命令

w  用于显示目前登入系统的用户信息。
执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。
单独执行 w 指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。

显示当前登录的用户

[[email protected] etc]# w
17:35:19 up 23:28,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              [email protected]   IDLE   JCPU   PCPU WHAT
root     tty1     -                Wed12    2days  0.00s  0.00s -bash
root     pts/0    10.0.0.1         13:16    0.00s  0.12s  0.00s w

w -h

w -h不打印头信息;

[[email protected] etc]# w -h
root     tty1     -                Wed12    2days  0.00s  0.00s -bash
root     pts/0    10.0.0.1         13:16    0.00s  0.12s  0.00s w -h

1557799730999-21a44096-b7f2-40ce-ae4f-eec5ebf5945c.png#align=left&display=inline&height=447&originHeight=510&originWidth=1195&status=done&width=1047

id命令

id命令 查看用户的UID 、GID
id -u   显示用户ID
id -g   显示用户所属群组的ID。
id -G   显示用户所属附加群组的ID。

[[email protected] /]# id user6
uid=8897(user6) gid=8899(z11) groups=8899(z11)
[[email protected] /]# id -g user6
8899
[[email protected] /]# id -G user6
8899
[[email protected] /]# id -u user6
8897

last和lastlog

last命令用了显示用户登录情况,以下是直接显示固定行数的记录:
lastlog 命令 显示linux中所有用户最近一次远程登录的信息

[[email protected] etc]# last
[[email protected] etc]# lastlog

组相关信息

groupadd

添加用户组命令 groupadd
语法:groupadd  [options]   [group]
      groupadd  [选项]      [用户组]
参数:
-g   gid   指定用户组的GID,GID唯一不能为负数,如果不指定GID从500开始
-f         新增一个组,强制覆盖一个已存在的组,GID、组成员不会改变。
添加组z11,查看添加后的组信息

[[email protected] ~]# groupadd z11
[[email protected] ~]# grep "z11" /etc/group
z11:x:8895:
[[email protected] ~]# tail -1 /etc/group
z11:x:8895:

gpasswd

将已存在的用户加入到组中的命令 gpasswd
语法:gpasswd [options] [user]   [group]
gpasswd [选项]    [用户名] [组名]
参数:
-a:添加一个用户到组,可以追加到组
-M:添加多个用户到组,覆盖之前的组成员
-d:从组删除用户
把user1用户添加到z1,并且查看是否添加成功 
-a选项只能添加一个用户,需要同时添加多用户时,使用-M参数

[[email protected] gj]# groupadd z1
[[email protected] gj]# useradd user1
[[email protected] gj]# gpasswd -a user1 z1
Adding user user1 to group z1
[[email protected] gj]# grep "z1" /etc/group
z1:x:8896:user1

同时添加user2、user3用户到z1组(先创建user2、user3用户)
使用-M参数添加多个用户时,多用户之间使用逗号分割;添加批量用户时,先使用-a参数,在使用-M参数,就会覆盖之前添加过的用户;所以添加多用户时,先使用-M 参数。

[[email protected] gj]# gpasswd -M user2,user3 z1
[[email protected] gj]# grep "z1" /etc/group
z1:x:8896:user2,user3
将user2用户从组中删除
[[email protected] gj]# gpasswd -d user2 z1 
Removing user user2 from group z1
[[email protected] gj]# grep "z1" /etc/group
z1:x:8896:user3

groupmod

修改组信息的命令 groupmod
语法:groupmod  [options]  [group]
      groupmod  [选项]    [组名]
groupmod  -n  新名  旧名
groupmod  -g  8888  dir
参数:
-n    修改组名
-g    修改GID

修改z1组的GID

[[email protected] gj]# grep "z1" /etc/group
z1:x:8896:user3
[[email protected] gj]# groupmod -g 8888 z1
[[email protected] gj]# grep "z1" /etc/group
z1:x:8888:user3

修改z1组的组名为newz1

[[email protected] gj]# grep "z1" /etc/group
z1:x:8888:user3
[[email protected] gj]# groupmod -n z1new z1
[[email protected] gj]# grep "z1" /etc/group
z1new:x:8888:user3

groupdel  

删除组的命令 groupdel  
查看用户属于到哪些组,使用命令:groups
语法:groupdel   [group]
      groupdel   [组名]
范例:
groupdel 组名 
删除组,删除组后,用户名依然存在

groups

看用户属于到哪些组,命令:groups 
语法:groups   [user] 
      groups   用户名

[[email protected] lh]# groups user1
user1 : user1 z2

版权声明:本文为weixin_34102807原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34102807/article/details/93318944

智能推荐

spring与redis整合和序列化问题

spring与redis整合 首先用docker下载redis 下载:docker pull redis 运行:docker run -d -p 6379:6379 --name myredis docker.io/redis 连接redis Desktop Manager 然后开始在springboot上开始配置 application.yml: 自动配置好StringRedisTemplate...

CentOS 7配置南大docker镜像

文章目录 CentOS 7配置南大docker镜像 0.帮助页面 1.系统要求 2.卸载旧版本(没有旧版本可跳过) 3.安装方式 4.准备工作 5.可选操作 Stable Test Nightly 6.安装docker引擎 7. (可选)修改配置文件防止与xshell连接冲突 8.启动docker CentOS 7配置南大docker镜像 0.帮助页面 南大docker源:https://mirr...

Qcon演讲纪实:详解如何在实时视频通话中实现AR功能

2018年4月20日-22日,由 infoQ 主办的 Qcon 2018全球软件开发大会在北京如期举行。声网首席 iOS 研发工程师,iOS 端移动应用产品设计和技术架构负责人龚宇华,受邀分享了《基于 ARkit 和 ARcore,在实时视频通话中实现 AR 功能》,在演讲中剖析了 AR 与 VR 差异,ARKit 的工作原理,以及逐步讲解如何基于 ARKit 与声网Agora SDK 创建 AR...

POJ2348 UVa10368 HDU1525 Euclid's Game【博弈】

Euclid's GameTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4106    Accepted Submission(s): 1947 Probl...

使用Breeze.js编写更好的查询

这篇文章是由同行评审Agbonghama柯林斯 。 感谢所有SitePoint的审稿作出SitePoint内容也可以是最好的! 数据量正在迅速发展,他们正在变得越来越复杂,维护。 许多开发人员希望避免由数据问题他们的工作过程中造成的问题和头痛。 一个使我们的工作更轻松的图书馆是Breeze.js 。 在这篇文章中,我们将讨论我们如何能够写出更好的查询与Breeze.js。 但是首先,我们应该知道什...

猜你喜欢

Netty框架构建Nio编程

~~~ 随手点赞,养成习惯 ~~~ 为什么选择Netty框架 Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的。 优点: ① API使用简单,开发门槛低 ②功能强大,预置了多种编解码功能,支持多种主流协议 ③ 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展; ④性能高,通过与其他业界主流的NIO框架对比,Nett...

【JZOJ5262】【GDOI2018模拟8.12】树(DP,性质题)

Description Solution 首先我们可以知道两个性质:1、路径u-v和路径v-w可以合并为路径u-w;2、路径u1-v1加路径u2-v2和路径u1-v2加路径u2-v1是等价的(就是起始点和终点可以互换) 那么知道这些性质之后就很好做了。我们只用知道每个点多少次做起点和多少次做终点。 我们设f[i]表示满足i子树的需求i上的值要是多少。 那么枚举i的所有儿子,判断a[i]-f[i],...

【String-easy】541. Reverse String II 反转的元素,有反转个数和间隔

1. 题目原址 https://leetcode.com/problems/reverse-string-ii/ 2. 题目描述 3. 题目大意 给定一个字符串,和字符串的间隔k, 这个k表示每k个数反转一次,然后再间隔k个元素再反转k个元素。 4. 解题思路 只要按照间隔去反转就可以了。然后间隔k个元素不反转是通过让i每次递增 2*k完成的。 5. AC代码 6. 相似题型 【1】344. Re...

【C语言笔记结构体】

我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。 那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢? 如当要保存三个学生的信息时, 方法一是: 方法二是: 显然,方法二跟更清晰,因为它把name、num、age都集成在一个模板,...

39. Combination Sum 回溯算法简析

LeetCode传送门     这道题要求给你一组正数 C,然后给你一个目标数 T,让你从那组C中找到加在一起等于 T 的那些组合。     例如:给你 [2,3,6,7] 和 7,则返回 [[2,2,3],[7] ] 。      想解决这个问题前,我们首先引入一个新问题,图(树)的遍历问题。  ...