最近在Kindle上把这本Java 8函数式编程看完了,也算是新年的看的第一本书。
坦白说Java 8确实让我感觉很爽,虽然之前在项目中也简单的使用过一些Java 8的特性, 但是这次系统的把Java 8的特性看了一遍之后,感觉理解加深了很多。
从Java 8 增加的特性来看,主要是Lambda、Stream API、接口默认实现。这里面当然是最主要是Lambda,这是后两者的基础。 但是从实用的角度还是还是用Stream API最爽。
Java 8 的一些代码
当然最近考虑把一些Java 7新增的一些特性也写进去~
好久没写博客了,忙似乎成了借口。继续努力吧~~

1、操作模式

两种模式:普通模式、插入模式

2、常用快捷键

小距离移动光标
  h:左移动光标
  j:下移动光标
  k:上移动光标
  l:右移动光标

大距离移动光标
  ctrl+f (PageDown) 下翻页
  ctrl+b (PageUp) 上翻页
  G: (shift+g) 移动到缓冲区的最后一行 【:$ 同样的功能】
  num G:调到缓冲区的num行【:num 同样的功能】
  gg:调到缓冲区的第一行 (:1同样的功能)

编辑命令
  x 删除当前光标位置的字符
  dd 删除当前光标所在的行
  dw 删除当前光标所在位置的单词
  d$ 删除当前光标所在位置至行尾的内容
  J 删除当前光标所在行行尾的换行符
  u 撤销前一条编辑命令
  a 在当前光标后追加数据
  r char 用char替换当前光标的字符
  R text 用text覆盖当前光标所在位置的数据,知道按下ESC键

复制和粘贴
剪切和粘贴:vim删除数据,实际上是将数据保存在一个单独的寄存器,可以用p命令取回数据
  dd命令+p命令可以实现裁剪一行
复制文件:y(yank),
  yw:复制单词
  y$:复制到行尾
复制完成后,移动到希望放置的地方,p即可
可视模式(ctrl + v),移动光标 y + p实现复制粘贴功能

查找和替换
查找:
  /findWord  从上往下找,用n调到下一个匹配到的字符,shift+n调到上一个匹配到的单词
  ?findWord 从下往上找,用n找到往上匹配的字符,shift+n找到下面匹配到的

替换:
  :s/old/new 只会替换第一个单词
  :s/old/new/g 替换所有的单词
  :n,ms/old/new/g 替换n行到m行之间的所有单词
  :%s/old/new/g 替换整个文件中的所有old
  :%s/old/new/gc 替换整个文件中所有的old,但是每次出现时提示

1、PMS(Package Management System):包管理工具

dpkg: Debian的发行版
rpm: Red Hat发行版

2、Debain系统的包管理

apt-get
apt-cache
aptitude:完整的软件包管理系统(非常强大)

3、aptitude命令

##查看
aptitude show package_name

##查找&安装
aptitude search package_name (i:已经安装,p:未安装/软件和配置都删除, c:软件已删除)
aptitude install package_name

##升级
aptitude safe-upgrade 安全升级软件包
aptitude full-upgrate (不会检查包之间的依赖,不推荐)
aptitude dist-upgrate (不会检查包之间的依赖,不推荐)

##卸载
aptitude remote package_name (只删除软件包,不删除数据和配置文件)
aptitude purge package_name (删除软件包,并且删除数据和配置文件)


备注:无法使用aptitude看到的一个细节是所有跟特定软件包关联的所有文件的列表。要看到这个列表,需要采用dpkg -L package_name。同时,可以反向搜索某个特定的文件属于哪个软件包:dpkg —search absolute_file_name

4、aptitude源

aptitude 库的位置在/etc/apt/source.list
source.list文件格式:
deb (or deb-src) address distribution_name package_type_list
deb/deb-src 软件包的类型,deb代表这是一个编译后程序的源,deb-src说明这是一个源代码的源
address 软件库的的Web地址
distribution_name 特定软件库的发行版版本的名称
package_type_list 表明库里面有什么类型的包,不止一个单词(main/restricted/universe/partner)

5、Red Hat系统的包管理

yum: 在Red Hat和Fedora中使用
urpm:在Mandriva中使用
zypper:在open suse中使用

6、yum常用命令

yum list installed :列出已安装的包
yum list package_name  :列出某个特定软件包的详细信息
yum provides file_name :查看什么软件提供了配置文件

yum install package_name :安装某个包
yum install package_name.rpm 本地安装某个rpm包

yum list updates 列出所有针对已安装包的可用更新
yum update package_name 更新某个包
yum update 更新所有列在更新列表中的包

yum remove package 只删除软件包而保留配置文件和数据文件
yum erase package 删除软件和所有文件

7、处理损坏包的依赖关系

安装多个软件包时,某个包的软件依赖关系可能会被另外一个包的安装包覆盖掉,这称为:损坏的包依赖关系
step1 : yum clean all . yum update
step2 : yum deplist package_name ,这个命令,显示所有包的库的依赖关系,以及什么软件可以提供这些库依赖关系
step3 : yum update —skip-broken 允许你忽略依赖关系损坏的那个包而更新其他软件包

8、yum软件库

yum repolist, yum 库定义文件在/ect/yum.repos.d

9、源码安装软件

step1: 查看README文件
step2:为系统配置sysstat:检查你的Linux系统来保证除了用来编译源代码的合适的编译器外,是否有正常的包依赖关系 ./configure
step3:make 构建二进制文件,编译源代码,然后连接器会创建最终可执行的文件
step4:make install安装文件

1、LVM(Linux逻辑卷管理器)

在Linux系统上无需重新构建整个文件系统而操作硬盘空间的简便方法

2、逻辑卷管理分布

逻辑卷的核心是:如何处理安装在系统上的硬盘分区
硬盘:物理卷(PV:physical volumn)每个物理卷都会映射到磁盘上创建的某一物理分区
卷组:多个物理卷集中在一起组成一个卷组(VG:Volume Group)
逻辑卷管理系统会把卷组当做物理硬盘一样对待,但实际上卷组可能由分布在多个物理硬盘上的多个物理分区组成。
眷组提供了创建逻辑分区的平台,而这些逻辑分区事实上包含了文件系统

3、Linux中的LVM

LVM1:只在Linux内核2.4版本上可用
LVM2:LVM1的更新版本,在LVM1功能外提供了额外的功能

快照:将一个已有的逻辑卷在逻辑卷在线的状态下复制到另外的一个设备。
传统的备份方法将文件复制到备份媒体上通常要将文件锁定,快照允许你创建只读快照。LVM2可以创建读写快照

条带化:可跨多个物理硬盘创建一个逻辑卷。当Linux LVM将文件写到逻辑卷时,文件上的数据块会被分散到多个硬盘上。(LVM条带化不同于Raid的条带化,LVM条带不提供创建容错环境的校验信息)

镜像:镜像是一个实时更新的逻辑卷的一份完整副本。当创建逻辑镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。对于原始同步完整之后,LVM会为文件系统每次写过程进行两次写过程,一个写到主逻辑卷一个写到镜像副本。

4、使用Linux LVM

step1:定义物理卷,将硬盘上的物理分区转换成Linux LVM使用的物理卷分区,fdisk > t > partitionId >8e
      8e分区类型表示这个分区将会被用作Linux LVM系统的一部分,而不是直接的文件系统
step2:sudo pycreate /dev/sdc1 创建真实的物理卷。它将分区标记成Linux LVM系统的物理卷,可以通过pvdisplay查看
step3:sudo vgcreate vol1 /dev/sdc1从物理卷创建一个或多个卷组。可以用vgdisplay查看卷组信息
step4:sudo lvcreate -l 100%FREE -n lvtest Vol1    创建逻辑卷,逻辑卷是Linux系统用来模拟物理分区以及保存文件系统的。Linux系统会像处理物理分区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。
    -c(—chunksize):快照逻辑卷的单位大小, -C(—contiguous)设置或重置连续分配策略
    -i(—stripes)指定条带数, -I(—stripesize)指定每个条带的大小
    -n(—name)指定新逻辑卷的名字, -l(—extends):指定分配给新逻辑卷的逻辑块数,或者要用逻辑块的百分比
     sudo lvdisplay 显示逻辑卷的详细情况
step5:sudo mkfs ext4 /dev/vol1/lvtest 创建文件系统
step6:sudo mount /dev/vol1/lvtest test 挂载文件系统

5、LVM的一些管理命令

vgchage:激活和禁用卷组
vgremove: 删除卷组
vgextent: 将物理卷加到卷组中
lvexend: 增加逻辑卷的大小
lvreduce: 减少逻辑卷的大小

1、sudo fdisk /dev/sdc

fdisk 工具用来帮助管理安装在系统上的任何存储设备上的分区
  p:显示当前的分区表
  n:添加一个新的分区
  w:将分区表写入磁盘
  q:退出,不保存修改

2、创建文件系统

mkefs 创建ext文件系统
mke2fs 创建一个ext2文件系统
mkfs ext3 创建一个ext3文件系统
mkfs ext4 创建一个ext4文件系统

3、将文件系统挂载到虚拟目录的某个挂载点

sudo mkdir /mnt/testing
sudo mount -t ext4 /dev/sdb1 /mnt/testing

备注:这种挂载文件系统的方法只会临时挂载该文件系统,当重启Linux系统时,文件系统不会自动挂载。要强制Linux在启动时自动的挂载这个文件系统,需要将文件系统添加到/ect/fstab文件中

4、fsck

用来检查和修复任意类型的Linux文件系统
fsck options filesystem
fsck通过/ect/fstab文件来自动决定挂载到系统上的存储设备的文件系统,如果存储设备没有挂载。用-t指定文件系统类型

备注:只能在未挂载的文件系统上运行fsck命令,对于大部分文件系统,需要卸载文件系统进行检查。检查完了在重新挂载。对于有核心Linux命令和日志的根文件系统,你不能在运行时卸载它,需要采用Linux live CD

1、ext文件系统(扩展文件系统, extended filesystem)

类Unix文件系统:使用虚拟目录来操作设备,在物理设备上安定长的块来存储数据
采用“索引节点表”来存储虚拟目录中所存储文件的信息
索引节点系统在每个物理设备商建立一个单独的表(索引节点表)来存储文件信息。
每个文件在索引节点表中都有一个条目,条目的扩展部分来自跟踪每个文件的额外数据,
包含:文件名、文件大小、文件属主、文件的属组、文件的访问权限、指向文件数据的每个磁盘块指针。

2、ext2在ext上面增加了扩展

比如文件大小从2G到2T(后期是32T),增加了创建时间、修改时间和最后访问时间
修改了文件在数据块中的存储的方式。

ext:文件写入到屋里设备时,存储数据用到的块很容易分散在整个设备上,形成碎片 ext2:按组分配磁盘块来减轻碎片化。通过数据块分组,文件系统不需要为了数据块来查找整个屋里设备来读取文件 ext2存在的问题:存储和更新文件时,用新信息来更新索引节点表。二者没有原子性,系统崩溃或者断电会出现损坏。

3、日志文件系统 先将文件的更改写入到临时文件(日志)中,让后在数据写成功写到存储设备和索引节点表之后,在删除对应的日志。 三种级别:

1、数据模式:索引节点和文件都会被写入到日志,丢失数据风险低,但性能差
2、排序模式:只有索引节点数据会写入到日志,单只有数据成功写入之后才删除。性能和安全折中
3、回写模式:只有缩影节点数据会被写入日志,但不管文件数据何时写入,丢失数据风险高。

4、ext3

和ext2相同的索引节点表结构,但给每个块设备增加一个日志文件,来将准备写入存储设备的数据先写入日志文件。
ext3默认采用排序模式的日志功能。只将索引文件写入到日志,数据块写入成功了,删除日志。
可以通过命令修改ext3的日志模式。

缺点:无法恢复误删除的文件。没有内建的压缩功能。不支持加密

5、ext4(目前大多数默认的文件系统)

支持数据压缩和加密,同时还支持区段(extent)的功能
区段在存储设备上按块分配空间,但是在索引节点表只保存其实块的位置。由于无需列出所有用来
存储文件中数据的数据块,可以节省索引表中的空间。
同时支持块预分配功能:在存储设备上,给一个要变大的文件预留空间。通过ext4文件系统
可以为文件分配所有期望的快,ext4用0填满预留的数据块,并指导不要将它分配给其他的文件(通过这种方式可以限制文件大小?)

1、unmask

unmask值是一个掩码,它会屏蔽掉不想授予该安全的权限。
例如,文件的全权限是666,目录的全权限是777
所以如果umask是002,减去umask之后的值是664.
目录是775
umask的值设定在/ect/profile里面

2、chmod options model file

修改文件的权限
几种典型的用法
chmod 755 filename
chmod u+x filename
chmod o-x file

3、chown 和 chgrp chown 修改文件的所者 chown username filename chown username.usergroup filename 同时修改文件的属主和属组 chown .usergroup filename 修该文件的默认属组 chown username. filename 修改文件的属主和属组(相同的名字)

chown -R 递归的修改子目录和文件的所属关系

chgrp 修改文件的所属组 chgrp usergroup filename

1、useradd -D

 查看创建新用户时你不在命令行制定的话,useradd命令使用的默认值

2、useradd -m username

 useradd命令不会创建HOME目录,-m命令行选项会叫它创建HOME目录

3、useradd -D (-s/-b/-e/-g/-f)

 修改默认的选项
 -s:更改登录的shell
 -g:默认的组名称
 -f:新用户从密码过期到账户禁用的天数
 -b: 创建用户HOME目录的位置
 -e:新账户的过期日期

4、userdel -r username

 -r 删除用户的目录

5、usermod 命令,修改/etc/passwd的内容,非常强大的工具

 usrmod -L 锁定某个用户,让其无法登录
 usrmod -U 解除锁定,用户可以正常登录

6、passwd 修改自己的密码

 passwd username 修改某个用户的密码(只有root用户才有权限)
 passwd -e 强制用户下次登录的时候修改密码

7、cnpasswd

 从标准输入中自动读取登录名和密码(冒号分割),给密码加密,让后重置。

8、cnsh

修改用户的shell,需要使用shell的全路径

9、cnfn

在/etc/passwd文件的备注信息存储信息的标准方法

10、finger

用于查看Linux系统的用户信息 (从安全性角度。禁用该命令)

11、chage

管理用户的有效期

12、groupadd usergroup

创建用户组

13、usermod -G username groupName

添加用户到某个用户组
某个用户如果更改了用户组,需要登出之后在登录才生效
-g: 制定的组名会替换掉用户的默认组
-G: 将该组添加到用户的属组列表中,不影响默认组

14、groupmod 修改已有组的信息 -g 修改GID -n 修改组名

一、启动Shell的三种方式:
1、登录时当做默认登录的Shell

 登录Linux时,Bash Shell会作为登录Shell启动。登录的Shell会从4个不同的启动文件读取命令  
 /etc/profile; —>系统级别,bash shell的主启动文件,/etc/profile.d/目录是集中存放用户登录时要执行的应用专属的启动文件的地方  
$HOME/.bash_profile;  
$HOME/.bash_login;  
$HOME/.profile;  

2、交互式shell

 不是登录系统的时候启动的,而是例如在命令行中敲入bash启动的
 交互式的bash,不会访问/etc/profile,而是会去用户主目录检查.bashrc是否存在  
 .bashrc的作用:查看/etc目录下共有的bashrc文件,二是为用户提供一个定制的自己的命令别名和私有脚本函数  

3、非交互式shell

 系统执行的shell脚本用的就是非交互式shell  

1、sort

-n:把数字识别成数字而不是字符  
-M:识别三个字符的月份名称,然后按照月份排序  
-b:忽略起始的空白  
-t:制定一个用来区分键位置的字符  
-k:排序从pos1位置开始,如果-k 3就从第三个位置开始,一般-t 和 -k 搭配使用  
-r:逆序  
例子:  
1、sort -t ‘:’ -k 3 -n file  
  按照:分割、按照第三列排序,按照数字排序  
2、du -sh * | sort -nr  
  按照大小排序当前的文件和文件夹  

2、grep [options] pattern [file]

-v: grep -v pattern file 反向搜索,返回不不匹配该pattern的行  
-n: grep -n pattern file 返回匹配的行号  
-c: grep -c pattern file 返回多少行包含匹配的模式  
-e:制定多余一个匹配的模式,得到满足任意一个匹配的所有结果  
grep -e pattern1 -e pattern2 file  

3、grep [regrex] file

采用正则进行匹配文件  

4、gzip file

—> filename.gz  
gzcat file 查看压缩过的文本文件的内容  
gunzip file 用来解压文件  

5、zip / unzip

zip -r testzip test 创建一个testzip.zip的压缩文件,并递归的把test下面的每个文件和目录都加到zip里面  

6、tar

归档数据  
-A 将一个已经tar归档的文件追加到另一个已有tar归档的文件  
-c(create) 创建创建一个新的归档文件  
-v(view)处理文件的时候显示文件  
-f(file) 输出结果到文件  
-t(list) 显示已有tar归档文件的内容  
-x (extract) 从归档文件中提取文件  
tar -cvf filename.tar file1/ file2/  
压缩file1/ file2/ 到filename.tar  

tar -tf filename.tar  
  显示  

tar -xvf filename.tar  
  从filename.tar中提取文件内容  

tar -zxvf filename.tgz  
tar -zcvf filename.tgz file