Hexo主题中实现多级分类
大部分的Hexo主题都将文章的分类放在了sidebar上面,并且都是支持多级分类的,然而默认的light主题并没有实现多级分类的功能,主要原因应该是该主题太老了,没人更新了,但是偏偏就有像我这样喜欢它的简洁风格的人。
有折腾就有收获,下面就来了解一下Hexo中是如何实现多级分类的。
大部分的Hexo主题都将文章的分类放在了sidebar上面,并且都是支持多级分类的,然而默认的light主题并没有实现多级分类的功能,主要原因应该是该主题太老了,没人更新了,但是偏偏就有像我这样喜欢它的简洁风格的人。
有折腾就有收获,下面就来了解一下Hexo中是如何实现多级分类的。
{}
花括号的用法逗号,
分隔多个项目
echo {a,b,c} #打印出a b c
echo user{01,02,03} #打印出user01 user02 user03
mkdir a{1,2,3} #创建文件夹a1,a2,a3
连续两点..
创建连续序列
echo a{1..10} #打印出a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
mkdir b{1..5} #创建文件夹b1 b2 b3 b4 b5
typeset
为变量添加只读属性,防止误操作,当你想改值的时候,会报错。
NAME=pengloo53
typeset -r NAME
NAME=pengloo
read -p "Please input your name:" NAME
提示符后输入值赋值给变量
export NAME
将普通变量转换成环境变量
${varname:-word}
若varname存在且非null,则返回其值,否则返回word${varname:=word}
若varname存在且非null,则返回其值,否则设置为word${varname:?message}
若varname存在且非null,则返回其值,否则显示varname:message${varname:+word}
若varname存在且非null,则返回word,否则返回null${variable#key}
从头开始删除关键词,执行最短匹配${variable##key}
从头开始删除关键词,执行最长匹配${variable%key}
从尾开始删除关键词,执行最短匹配${variable%%key}
从尾开始删除关键词,执行最长匹配${variable/old/new}
将old替换成new,仅替换第一个出现的old${variable//old/new}
将old替换成new,替换所有的old${name[subscript]}
调用数组变量的值,如果subscript为@
、*
则调用所有的数组成员。
A=(11 22 33)
echo ${A[0]} #显示11
echo ${A[@]} #显示11 22 33
echo ${A[*]} #显示11 22 33
${ #name[subscript]}
返回${name[subscript]}
的长度。
B=(aa bbb cccc)
echo ${ #B[2]} #显示4(cccc字符串的长度)
echo ${ #B[@]} #显示3(数组成员个数)
用expr
命令工具大部分应该都知道,如下:
expr 8 + 4
加法expr 8 - 4
减法expr 8 \* 4
乘法expr 8 / 4
除法然而你也可以通过变量表达式来进行算术运算,语法为:$((expression))
,例如:
$((x+y))
加$((x-y))
减$((x*y))
乘$((x/y))
除$((x%y))
取余$((x++))
自加$((x--))
自减$((x**y))
幂运算 命令行工具test
,应该不陌生,这里举几个例子就清楚了。
test -d /etc/ && echo "yes" || echo "no"
,/etc/
是目录就显示yes,不是就显示no,它等价与[ -d /etc/ ] && echo "yes" || echo "no"
一对中括号就替代了test
,这里注意的是,中括号左右都要留有空格。
.
任意单个字符*
匹配前一个字符出现零次或者多次[]
匹配集合中任意单个字符[x-y]
匹配连续的字符串范围^
匹配字串的开头$
匹配字串的结尾[^]
集合取反\
转义后的字符串\{n,m\}
匹配前一个字符重复n到m次\{n,\}
匹配前一个字符重复至少n次\{n\}
匹配前一个字符重复n次\(\)
将\(
与\)
之间的内容存储在『保留空间』,最大存储9个\n
通过\1
至\9
调用保留空间中的内容除了最后两个,其他的都比较好理解,针对最后两个举个例子:grep --color "\(root\)\(:\).*\2\1" /etc/passwd
筛选出以root:
开头,以:root
结尾的行。
+
匹配前一个字符出现一次或者多次?
匹配前一个字符出现零次或者一次|
匹配逻辑or
()
匹配正则集合egrep --color '(root|admin)' /etc/passwd
找出包含root或者admin的行。
除了上述的一些表达式,还有基于其他规范的正则表达式,例如POSIX
规范以及GNU
规范。这里不列举了,可以自行搜索了解。
几乎所有的Hexo主题都是响应式布局的主题,在现在这个多屏的时代,特别是移动互联网时代,一个网站如果没有做成响应式的布局都不好意思拿出来,所以响应式布局非常的重要。
什么是响应式布局?响应式布局就是一套网页样式适应所有的屏幕,站点的内容不变,但是随着屏幕的大小不一样,网页的布局会随之改变。如下图所示。
上一篇大致介绍了Hexo站点的布局,每个主题的布局结构是不一样的,但是都是类似的,所以明白了Hexo生成站点的原理就能看懂所有主题的布局,这里还是以主题light-ch为例来讲解如何添加一个新的布局resume.ejs
。
layout
文件夹中添加布局文件想要一个新的布局,要么通过对layout
的判断在article.ejs
局部模块中修改,要不就是新建一个resume.ejs
布局文件,指向另外一个局部模块。这里我选择了后面一种方法,避免混乱。
首先在layout
文件下创建resume.ejs
文件,里面代码如下:
1 | <%- partial('_partial/resume') %> |
它指向的是一个局部模块,里面就是想要显示的样式了。把它替换到layout.ejs
文件中<%- body %>
的位置上就是你的resume页面了。
假如这里替换到<%- body %>
的样式也不是我想要的,那么就可以修改layout.ejs
文件如下:
1 | <%- partial('_partial/head') %> |
我只想要保留header
以及footer
的部分,其他的部分我想单独设计,那么如上加个判断条件就行了。当布局为resume的时候,完全按照我的_partial/resume
模版样式。那么接下来就是考验设计网页的功底了。
在_partial
目录下创建resume.ejs
局部模块,这里的内容就是想显示的页面布局了,可以发挥自己的设计能力,设计一个漂亮的页面,我的示例代码如下:
1 | <div class="resume"> |
页面结构有了,下面就要添加样式文件了,你可以在source/css/_partial/
目录中添加resume.styl
,然后在source/css/style.styl
中引入(在最后一行加入@import '_partial/resume'
)就行了。
通过命令hexo new page resume
创建一页,Hexo会自动在根目录下的source文件夹下创建resume文件夹,文件夹下有index.md
文件,编辑index.md
写上你的简历主要内容。
index.md的前置声明一定要加上
layout: resume
,不然你的布局就形同虚设了。(如果不设置,默认会是page布局)
source/
├── _drafts/
├── _posts/
├── resume/
├──index.md
然后打开主题light-ch
目录下的_config.yml
配置文件,在menu下添加一行代码。
menu:
首页: /
个人简历: /resume
至此,大功告成,浏览一下个人简历页面。Demo
刚看完Hexo Docs中模版那一部分的时候,很多地方不明白,这里就来谈谈Hexo的站点是怎么生成的?布局指的是什么?了解了这些,就可以对你的站点布局『为所欲为』了。
Every templates apply to layout template by default.
每个模板都默认使用layout
布局。
CentOS上搭建meiupic图床(一个PHP写的开源相册),之前也搭建过PHP的LNMP环境,但是那是很长时间的事了,并且当时使用的是Ubuntu Server版本服务器。本以为很快就搭建OK,却还是折腾了一晚上,真是惭愧…
本是一件多简单的事,不就是在配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
里写入下面这几行配置嘛。
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
ipaddr=192.168.1.123
netmask=255.255.255.0
gateway=192.168.1.1
可是还真是奇了怪了,一重启,IP就自动变了,随机分配了。明明配置的是静态IP啊。耗了我老长时间找原因了,最后照着书上一个一个校对,最后发现把ipaddr
、netmask
、gateway
都改成大写的就行了。。(PS. 记得在Ubuntu上没有区分啊,难道我记错了~郁闷)
教程很多,贴一条备用,没准哪天又忘了怎么编译安装了。以前在Ubuntu上都是直接sudo apt-get install nginx
,可是在CentOS里貌似默认没有,学会编译安装nginx还有必要的。而且编译安装的版本使用起来有一些差异。
注意点:
/usr/local/src/
目录下,便于管理。重新启动service nginx restart
?No,No,No,别被自动安装的软件惯坏了,nginx应该这么用。
/usr/local/nginx/nginx
启动主程序,安装目录下运行nginx,我的版本是1.7,其他版本nginx执行文件也许不在nginx目录下/usr/local/nginx/nginx -s reload
重新加载/usr/local/nginx/nginx -s stop
停止当然不想输入那么长的路径也行,创建一个快捷方式,如果还是想使用service命令也行,在/etc/init.d目录下创建快捷方式。命令如下:
cp -s /usr/local/nginx/nginx /etc/init.d/
安装MySQL的方法倒是跟之前没两样,偷懒的方法就这样yum install -y mysql*
,OK,一股脑全装上了,装完设置root密码方法如下:
方法1: 用SET PASSWORD命令
mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
方法2:用mysqladmin
1 | mysqladmin -u root password "newpass", |
方法3: 用UPDATE直接编辑user表
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;
在丢失root密码的时候,可以这样
mysqld_safe --skip-grant-tables&
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';
mysql> FLUSH PRIVILEGES;
瞅一眼密码啥样…
这次花费最长的时间就是这块了,之前基本没怎么接触过PHP开发,php的开发环境更是半知不解。其实这次搭建完也是半知不解。
想要nginx解析php文件,那么需要安装php-fpm,它是个啥?
FastCGI Process Manager:FastCGI进程管理器,fpm能根据访问的压力动态的唤起cgi进程和销毁以到达动态的调整cgi数量,这样可以有效的使用内存。
跟着yum install php*
命令,全安装上了。
接下来就是配置nginx了,使其能够解析并转发meiupic开源相册,我将相册源代码解压到了/usr/www/
目录下了,然后就是配置nginx了,打开nginx配置文件,vim /usr/local/nginx/nginx.conf
,找到http下的server区域,改成如下:
...此处省略
http {
....
server{
listen 8080;
server_name 192.168.1.123;
location / {
root /usr/www;
index index.php;
}
location ~ \.php$ {
root /usr/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
}
}
...省略若干
listen端口,我将默认的80改成了8080,server_name改成本机的IP,root改成php开源项目的源代码目录,然后最重要的那段php的配置当然不是我写的,只是将默认对PHP的配置注释给去掉了,改一下root就完事了。
好了,迫不及待的想试一试了。依次检查各种服务是否正常,nginx、mysql、php-fpm….启动了的重启一下,没有启动的启动一下。
service mysqld restart
service php-fpm restart
/usr/local/nginx/nginx -s reload
OK ~浏览器运行http://192.168.1.123:8080
,第一次嘛,必然是没有反应的。出现问题并不可怕,主要是要知道怎么找原因。
ping 192.168.1.123
,OK!curl 192.168.1.123:8080
,抓取页面代码。返回了。好了,原因找到了,网络是通的,而页面无法访问,可是本地可以访问,这么一讲,就知道是防火墙的问题了。
防火墙的配置是Linux运维的重点内容,CentOS默认只开通了22端口的访问配置。这里我们需要开启端口8080,亦或是关闭了它(当然不建议这么做)。
教程很多,或是直接看man iptables
,你会学到很多。关于防火墙的配置文件是/etc/sysconfig/iptables
,学习就靠自己了。
关闭的方法:service iptables stop
。
OK,设置好防火墙后,又是一系列重启服务操作,然后浏览器访问,这次不报错了,可是File Not Find
,what’s the fuck!
最后找到就是fastcgi_params配置的问题,中间寻找答案的艰辛就不多说了,这里记下,给自己提个醒,同时给新人指路。我也是从前人那里找到的答案。
nginx调用php-fpm出错解决方法和nginx配置详解
问题就在上面nginx配置文件中的的这两句:
1 | fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; |
解决方法有两种(其实是一个意思):
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf
为什么说一样,可以自行查看一下,nginx安装目录下,fastcgi_param
以及fastcgi.conf
这两个文件的内容差异。
vim -O /usr/local/nginx/fastcgi_params /usr/local/nginx/fastcgi.conf
解决完这个问题后,又是一堆服务的重启,然后浏览器打开http://192.168.1.123:8080
,OK,运行安装程序了。
目录权限问题,到/usr/www
目录下,设置一下,各个文件目录的访问权限。如果嫌麻烦,直接chmod 777 /usr/www/*
,到这里基本就完成了。
忘记root登录密码,怎么办?
e
编辑GRUB引导参数e
进行编辑b
启动系统进入单用户模式passwd root
,输入两次密码shutdown -r now
重启系统history
命令显示所有命令记录,然后通过!命令编号
调用该命令clear
,还有一个快捷键更方便——ctrl+l
ZZ
,可以实现保存并退出文档echo "hello123" | passwd --stdin jack
通过管道为用户jack设置密码uptime
监控CPU使用情况两个命令:getfacl
、setfacl
getfacl
查看文档的ACL权限setfacl
设置文档ACL权限-b
删除所有附加的ACL条目-k
删除默认的ACL-m
添加ACL权限-x
删除指定的ACL条目-R
递归处理所有的子文件与子目录示例
getfacl 2.log
查看文档2.log的ACL权限setfacl -m u:user01:rw 2.log
添加ACL条目,使用户user01对2.log文件可读可写setfacl -m g:group01:r 2.log
使用户组group01对文件2.log有可写权限setfacl -x u:user01 2.log
删除用户user01的ACL条目setfacl -x g:group01 2.log
删除组的权限setfacl -b 2.log
清除文件2.log所有ACL权限之前在一篇笔记里已经介绍了fdisk
命令的用法,这里就不重复了,这里说一下另外两个命令partprobe
和parted
。
partprobe /dev/sdb
让内核立即读取新的分区表,无需重启电脑就可以识别新创建的分区parted
GPT分区方式,不同与传统的MBR分区(使用fdisk
)学习开机启动命令,先要了解Linux的6种运行级别。
通过runlevel
命令可以查看当前所处的运行级别。服务器版本的Linux一般都是3级别,通过init
命令可以改变当前的运行级别,如init 0
命令可以直接关机.
好了,可以进入正题了,如何设置开机启动呢?使用命令chkconfig
,用法如下:
chkconfig --list
查询系统服务运行级别信息chkconfig --level
指定操作的运行级别,不指定级别时默认为2,3,4,5级别chkconfig --list sshd
查看sshd命令的运行级别chkconfig sshd on
设置sshd服务在2.3.4.5级别开机启动内存的使用情况查看命令,应该很熟悉了,那就是free
,但是你真的知道显示出来的各个数据都代表的是什么意思吗?至少之前我是没怎么去了解。
每次看的时候,也就扫了一眼,总共498M
,用了263M
,还剩235M
,就完事了。其他的数据就没怎么看了,这里简单介绍一下其他数是什么含义。
在Linux开机后就会预先提取一部分内存,并划为buffer与cache以供进程随时使用。第一行的used就是这部分内存数263
,而后面的buffers代表的是buffer使用剩余的内存数65
,cached就是cache剩余的内存数145
。那么buffer和cache用了多少呢?第二行中used就是buffer和cache使用的内存数51
,那么就有等式263=65+145+51
,接下来446
系统总剩余的内存数,为分配的有235
,分配了但是没有用完的有65+145
,那么446=65+145+235
。
细心的读者也许一眼就看出了,等式根本不等嘛!别着急,换成字节单位,你再算算!至于原因就很明了了
这里就补充两点。
1、df -hT
中T
的参数代表显示文件系统
2、df -i
中 i
代表的是磁盘inode使用量信息
这里可以看出根分区还剩下313077个inode节点,也就是说如果在更分区下创建313077个空文件,那么就算该磁盘还有容量也再也容不下新增文件了。
有两种方式设置网络参数,一是通过命令行设置;二是通过修改参数文件。
命令行设置不外乎ifconfig
、route
这两个命令,具体使用可以自行查询帮助文档,这里介绍一下修改参数文件来设置网络。
网络的参数文件在/etc/sysconfig/network-scripts/ifcfg-<iface>
,其中iface
为网卡接口名称。如果只有一块以太网网卡,则一般为ifcfg-eth0
,文件有一下字段:
DEVICE
设备名称 eh0,eth1...
TYPE
设备类型 ethernet
BOOTPROTO
启动协议 none|dhcp|static
HWADDR
硬件地址 MAC地址NM_CONTROLLED
网卡是否可以被NetworkManager控制 yes|no
ONBOOT
开机是否启动该网卡 yes|no
ONPARENT
真实接口启动后虚拟接口是否启动 yes|no
IPADDR
IP地址PREFIX
网络位掩码个数NETMASK
子网掩码GATEWAY
默认网关DNS{1,2}
DNS服务器如我网卡eth1设置静态IP,配置如下图
这块主要介绍5个命令,ping
、traceroute
、nslookup
、dig
、netstat
。
ping
非常常用的命令,测试基本如下步骤
ping 127.0.0.1
ping本地回环,测试本地网络协议是否正常ping 192.168.1.101
ping本地IP,测试本地网络接口是否正常ping 192.168.1.1
ping本地网关,测试网关是否正常工作ping 61.135.169.121
ping外部网络,测试服务商网络是否正常工作ping www.baidu.com
ping网址,如果上述都正常,而这步ping不通,那么肯定是DNS的问题了traceroute
跟踪数据包的路由过程
nslookup
检测本地设置的DNS服务器工作是否正常
nslookup www.baidu.com
检测本地DNS服务器是否能解析到百度,本地设置的DNS服务器是8.8.8.8,检测到百度对应的两个IP地址
dig
查看更多关于DNS记录的信息
dig www.baidu.com
能显示比nslookup
更详细的信息
netstat
网络监控命令
该命令比较强大,可以自行查看帮助文档学习,netstat -nutlp
查看当前系统开启端口信息。