程序员在旅途

用这生命中的每一秒,给自己一个不后悔的未来!

0%

一、Linux用户管理综述

1.1 了解Linux用户

Linux是一个多用户、多任务的的操作系统,为了实现资源管理及出于安全的考虑,需要对用户进行不同权限的分配,同时通过对用户进行划分成组便于更高效地管理用户权限。
Linux 系统在/etc/passwd文件存储了系统中所有用户的基本信息,该文件是系统用户配置文件。/etc/passwd对系统所有用户可读,只有系统管理员才可以修改的。
除了用户信息文件外,系统中记录与用户相关信息的文件还包括:

/etc/passwd:用户及其属性信息(名称、UID、基本组ID等等);
/etc/group:组及其属性信息;
/etc/shadow:用户密码及其相关属性;
/etc/gshadow:组密码及其相关属性;

/etc/passwd文件内容解读:

root@ecs:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
……..

/etc/passwd文件中的每个用户都有一个对应的记录行,记录着这个用户的一下基本属性。,每行记录又被冒号(:)分隔为7个字段,其格式 和具体含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

第一列为用户名;
第二列为密码占位符:(x表示该账户需要密码才能登录,为空时,账户无须密码即可登录),
第三列为用户的UID:每个用户都有唯一的一个 UID,Linux 系统通过 UID 来识别不同的用户,UID 就是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份;
第七列为账户登录Shell:/bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统。

另外可以看到,除了常见的root等用户外,Linux 系统中默认会创建一些系统或服务正常运行所必需的用户,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
常见的伪用户有:

bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
nobody NFS使用

阅读全文 »

一、SEO概述

Hexo站点搭建完毕之后,就开始思考如何能够让搜索引擎收录我们的站点,然后被检索到,这就涉及到了SEO优化内容。SEO是英文Search Engine Optimization的缩写,中文译为“搜索引擎优化”。SEO是通过站内优化如网站结构调整、内容建设、代码优化以及站外优化等方式让站点更容易被搜索引擎检索。
程序员在旅途博客建设过程中,主要涉及到了站点本身的配置优化、域名配置、搜索引擎检索等内容,将会以系列文章的形式发布出来。

本篇博文是搜索引擎优化篇,主要讲述如何被百度、google两大搜索引擎收录和检索,主要包含以下内容:

  1. 收录检索整体过程;
  2. 百度 收录检索;
  3. google 收录检索。

二、搜索引擎优化

2.1总体过程

被搜索引擎收录和检索的过程主要就是两个步骤,百度和google的过程相似;首先是生成站点地图,用于描述站点内容,然后在百度和google的的后台提交站点地图描述文件,让搜索引擎来收录和解析站点就可以。
可以通过在搜索引擎中输入以下内容判定站点是否被搜索引擎检索到:

1
site:<域名> # site:meijindong.com

2.2 站点地图sitemap.xml文件生成

阅读全文 »

一、递归算法介绍

  这篇文章讲的是一个古老而又经典的汉诺塔问题,他是递归算法的一个很好的应用实例。有关递归函数的介绍,在使用递归函数求解字符串的逆置问题文章中介绍过。递归思想是来解决可计算问题的,他的根本特征在于逐步的计算和分解这一计算,通过将某一大问题不断的分解成逻辑上相同的小问题,然后对小问题的求解进而获得最终的答案。使用递归算法的程序在形式上往往都比较简洁明了,这也正是他的价值所在。
  计算机使用栈内存结构来从物理上实现递归算法,每一次的递归调用,系统都要将本次调用的返回地址、局部变量、形式参数等值压入到栈中,调用结束之后,再从栈顶取出保存的信息返回给相应的变量并退出栈,再继续执行递归的上一层函数。由于计算机系统给每一个程序分配的栈空间有限,因此,在使用递归求解问题的时候,一定要注意递归的深度,如果递归的次数太多,很可能会出现栈溢出的情况,导致问题求解失败。

阅读全文 »

一、递归函数概述

  在使用面向过程的编程语言进行程序编写的过程中,一般是按照结构化的编程思想、模块化的程序设计方法来进行程序的编写和代码的组织的。我们熟悉的C语言就是这样一类程序设计语言,它通常以函数为单位进行程序的模块化组织,C源程序就是由一个主函数和若干非主函数构成的。计算机在执行C程序时,是按照顺序从主函数main()开始执行,如果遇到调用其他函数的情况,则主函数暂停执行,转而执行相应的函数,该函数执行完毕之后,返回主函数,主函数继续执行,这称为函数的调用。不仅主函数可以调用其他函数,各个函数之间也是可以相互调用的,如果一个函数自己调用自己,我们称之为函数的递归调用。在某些特殊问题的求解中,使用递归函数有时候会有非常高的效率。

阅读全文 »

一、队列的概念介绍

  提到队列这个词,或许你不会感到陌生,在我们的生活中,应用到队列这个概念的场景非常之多。我们日常的排队买饭,总是第一个到达窗口的人先买到然后离开,后来的人总是后来离去;再有,去医院挂号排队,也总是遵循一般的先来先就医服务的原则。计算机中的队列数据结构的设计,也是为了更好地解决这类先来先服务问题的。
  队列是一种采用先来先服务(First in First Out,FIFO)思想的抽象数据结构。和栈一样,它也是一种受限制的线性表。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。队列的插入操作称之为入队列或进队列,队列的删除操作称之为退队列或出队列。当线性表中没有元素的时称为空队列。示意图如下:


栈示意图
  在队列上的基本操作有:①队列初始化②判断队空③入队操作④出队操作⑤读取队头元素⑥销毁队列。根据在物理实现方式上的不同,分为顺序队列和链式队列,基于数组实现的顺序存储的队列叫作顺序队列,基于链表实现的队列叫作链式队列。

阅读全文 »

一、栈的概念介绍

  在我们的生活中,总有这么一些例子,①食堂在堆放餐盘的时候,总是从下往上,在取餐盘的时候,又是从上往下;②最先放入厢式货车的货物,最后才能取出;③普通手枪的子弹夹,先装进弹夹的子弹,最后才会被打出来。类似于这样的场景还有很多,这样的存取顺序,我们称之为先进后出(LIFO)。这种存取方式在解决某些计算机问题的时候非常高效,因此,在计算机科学中抽象出了一种数据结构,专门用于解决后进先出这类科学问题,在计算机中,这种后进先出的数据结构,我们称之为 栈。栈这种数据结构被抽想出来以后,就被广泛的应用于计算机软硬件系统中,在编译系统、操作系统等系统软件和各类应用软件中经常使用栈来高效的完成特定的算法设计。在许多程序语言设计中,函数的调用,就会使用栈来保存形参以及函数的返回值。在硬件层面,有专门的栈寄存器来配合栈数据结构的高效访问。
  栈的逻辑结构是一种线性结构,和线性表相同,元素之间是一对一的关系,由于需要保证元素的后进先出规则,因此需要对线性表的运算操作进行一定的限制,即只允许在线性表的一端进行插入和删除来满足栈的要求。因此可以认为栈是限制在表的一端进行插入和删除的线性表。在线性表中允许插入、删除的这一端称为栈顶,栈顶的位置是动态变化的;不允许操作的这一端称为栈底,栈底是固定不变的。当表中没有元素时称为空栈。
  对于栈而言,常用的操作有:①栈的初始化; ②判断栈是否为空;③入栈;④出栈;⑤取栈顶元素;⑥销毁栈。这些基本的操作是组成复杂程序的基础。栈的示意图如下:栈示意图
  栈的物理实现有两种方式,分别为顺序存储方式链式存储方式。采用顺序存储的栈我们称之为顺序栈,采用链式存储结构的栈称之为链式栈。

阅读全文 »

一、约瑟夫问题的由来

  约瑟夫问题(Josephus)是由古罗马的史学家约瑟夫(全名Titus Flavius Josephus)提出的。它是一个出现在计算机科学和数学中的经典问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
  Josephus是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。Josephus将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
  约瑟夫问题的一般描述形式为:设有编号为1,2,……,n的N个人围成一个圈,从第1个人开始报数,报到M时停止报数,报M的人出圈,再从他的下一个人起重新报数,报到M时停止报数,报M的出圈,……,按照这个规则进行下来,直到所有人全部出圈为止。当任意给定N和M后,构建相关数据结构与算法求N个人出圈的次序。

阅读全文 »