程序员在旅途

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

0%

一、写作背景

  项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧。由于项目需要增加评论功能,之前并无此方面的经验,因此项目开始的一段时间都在寻思着如何进行评论功能的设计。上网搜索一波发现有很多优秀的第三方评论插件可以使用,本来准备直接采用的,但是心里始终有点疙瘩,可能是评论数据放在别人那里不放心的原因,或可能是想一探这些评论系统的究竟,因此最终决定自行设计开发这么一套评论功能。效果截图如下所示,采用的是MySQL数据库,编程语言用的Java。
  实现效果如下图:
评论功能实现效果图

阅读全文 »

一、条形码的由来

  条形码是由美国的N.T.Woodland在1949年首先提出的.近年来,随着计算机应用的不断普及,条形码的应用得到了很大的发展.条形码可以标出商品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,因而在商品流通、图书管理、邮电管理、银行系统等许多领域都得到了广泛的应用。
  二维条码/二维码(2-Dimensional Barcode)最早发明于日本,是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。 二维条码/二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息。

阅读全文 »

一、free命令作用

在大多数Linux发行版中都可以通过 free 命令来查看显示系统内存状态,该命令主要会汇总出包括系统物理内存、swap 交换分区、共享内存和系统缓存的使用情况。这些数据主要是从/proc/meminfo中读出并解析得到。
可以通过free –help 查看该命令的使用方法,也可以通过man free查看该命令的详细操作手册。

二、使用示例

1
2
3
4
[root@docker-registry ~]# free -h
total used free shared buff/cache available
Mem: 2.7G 672M 1.7G 12M 420M 1.8G
Swap: 2.0G 0B 2.0G

参数解析

1
2
3
4
5
6
total 是物理内存大小;
used 是已经使用的内存大小,包括了 buff/cache 和 应用程序实际使用的内存;
free 是空闲的内存数,没有被真正使用的内存空间;
shared 是共享内存大小,共享内存是进程间通信的一种方式;
buff/cache 系统为了提高文件的读写速率而使用的一块内存空间,当应用程序需要使用内存时,这块内存是可以很快被回收而被用户空间程序使用。
available,估算的是当前系统中有多少内存可以用于应用程序的使用,buff/cache占用的内存在有需要的时候是可以被回收的。

available和free的区别

可用内存=系统free memory+buff/cache。free是系统中空闲的内存大小,buff/cache虽然是在需要的时候可以回收的,但是当前也是被利用状态,available统计的是应用程序可用内存空间,buff/cache是可回收,可被应用程序使用的。从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

buff/cache机制

buff/cache是为了协调内存与磁盘文件读写IO速率差异性、提高系统的工作效率而设计的。
cache
cache 就是缓存的意思。当系统读文件的时候,是把数据从硬盘读到内存里,因为硬盘比内存慢很多,所以这个过程会很耗时。为了提高效率,linux 会把读进来的文件在内存中缓存下来,供程序接下来使用,即使程序结束,cache 也不会被自动释放,系统会根据换出算法把cache缓存置换出去。所以如果有程序进行大量的读文件操作,内存使用率也会相应的提高。

阅读全文 »

一、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)思想的抽象数据结构。和栈一样,它也是一种受限制的线性表。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。队列的插入操作称之为入队列或进队列,队列的删除操作称之为退队列或出队列。当线性表中没有元素的时称为空队列。示意图如下:


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

阅读全文 »