本文作者: Ruri Shimotsuki @優萌初華
本文参考链接: https://shoka.lostyu.me/computer-science/note/theme-shoka-doc/special/
编译时多态主要指运算符重载与函数重载,而运行时多态主要指虚函数。
有基类 SHAPE
,派生类 CIRCLE
,声明如下变量:
SHAPE shape1,*p1;CIRCLE circle1,*q1;
下列哪些项是 “派生类对象替换基类对象”。
下列叙述正确的是 。
如果定义 int e=8; double f=6.4, g=8.9;
,则表达式 f+int (e/3*int (f+g)/2)%4
的值为 9.4。
注意运算顺序和数据类型
8.4
下划线
波浪线
着重点
紫色下划线
绿色波浪线
黄色着重点删除线红色删除线
荧光高亮
赤橙黄绿青蓝紫
红色
粉色
橙色
红色
绿色
靛青
蓝色
紫色
灰色
快捷键 Ctrl + C
H20
29th
黑色的
占位
占位
占位
常用账号
]]>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
public static void main(String[] args){ System.out.println("代码块测试")}
<!DOCTYPE html><html lang="zh" class="has-navbar-fixed-top"> <body> <main class="container mt-4"> <div class="columns is-flex-direction-row"> <div class="column is-three-quarters is-justify-content-center"></div> <aside class="column"></aside> </div> </main> </body></html>
这是粗体文字,混合在正常文本内
这是斜体文字,混合在正常文本内
这是删除文字,混合在正常文本内
这是下划线文字,混合在正常文本内
内部的 代码
片段
第一列 | 第二列 |
---|---|
第一行第一列 | 第一行第二列 |
第二行第一列 | 第二行第二列 |
第三行第一列 | 第三行第二列 |
主题功能列表
使用时间最长的主题是 viosey 大佬的 hexo-theme-material,折腾一段时间后使用感觉良好,但对 MaterialDesign 渐渐审美疲劳。
目前是用的主题是 hexo-theme-matery,虽然大框架也是 materialDesign(真香),github 上 fork 后进行了轻微的魔改,保留了一些基本功能。
Hexo 官方提供了一个比较详细的指引文档,https://hexo.io/zh-cn/docs ,重点是关于 链接定义
, 变量
部分的内容,hexo 的主要流程就是把 Markdown 根据主题内定义的方式生成指定的 HTML,主题的核心部分即为 HTML 的模板文件(ejs 等),最基础的是把 Markdown 中的内容显示出来,然后进行 UI 的优化,让页面更好看,最后可以适当集成部分功能,如评论、打点等。
├── README.md├── _config.yml # 主题配置文件├── languages # i18n语言目录,定义本地化展示语言,在模板中通过__('key')调用│ ├── default.yml│ └── zh-CN.yml├── layout # 主题结构目录,存放各个页面模板文件│ ├── _partial│ │ ├── aside.ejs│ │ ├── footer.ejs│ │ ├── head.ejs│ │ └── header.ejs│ ├── archive.ejs│ ├── index.ejs│ ├── layout.ejs│ ├── links.ejs│ └── post.ejs├── package.json├── scripts # 脚本目录,是hexo构建过程中是用的脚本,而不是构建完成后页面是用的js脚本目录│ ├── helper.js│ └── lib│ ├── bulma_paginator.js│ └── bulma_toc.js└── source # 资源文件,构建完成后页面使用的css/js等,不会参与hexo构建,会原样复制到构建完成目录中 └── css ├── bulma-timeline.min.css └── custom.css
Hexo 文档通读一遍后,确定好主题目录的基本结构,然后就开始进行 UI 的设计,目前现成的开源 UI 组件类型丰富,可供选择的很多,基于从简的原则,最基本的 css 组件即可满足要求,经过多方比较,最后选择了 bulma 作为主题的基本 UI 框架。只要掌握一些基本的 css 知识就可以进行学习使用,无需特别高的前端开发能力。
主题重点开发的几个页面为
index
:主页内容archive
:归档页面内容(tags,categories 也会使用该页面)post
:文章详细内容页页面主体模板为 layout.ejs
,用以确定整个页面的结构,包括一些公共组件的集成(基础 css),页面框架定义等。
页面模板采用 ejs 引擎渲染,标记为 <% %>
,文档,可以通过 <% partial('页面文件名称') %>
来进行 import 组合
wget "https://nginx.org/download/nginx-1.13.5.tar.gz"
养成 wget
加引号的习惯,可避免很多问题
wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.zip"wget "http://nginx.org/download/zlib-1.2.11.tar.gz"
PCRE 用来支持 rewrite 模块
该模块是使用 Nginx 作为文件服务器时美化目录索引用,按兴趣加
git clone https://github.com/aperezdc/ngx-fancyindex.git
待编译时用
LuaJIT 是 C 写成的 Lua 解释器,速度比 Lua 解释器快十倍左右,JIT 名词解释见维基百科传送门
官方安装方式 传送门
wget "http://luajit.org/download/LuaJIT-2.0.5.tar.gz"wget "https://github.com/openresty/lua-nginx-module/archive/v0.10.10.zip" -O lua-nginx-module-0.10.10.zip
先构建 LuaJIT,视频传送门
然后等待 Nginx 构建
实现需要安装 gcc,g++,make,否则无编译器
先配置
./configure \ --with-http_ssl_module \ ## 需要事先安装openssl,否则需要指定ssl源码目录 --with-pcre=../pcre-8.41 \ --with-zlib=../zlib-1.2.11 \ --add-module=../ngx-fancyindex \ ## 可选插件 --sbin-path=/usr/local/nginx/nginx \ --conf-path=/etc/nginx/nginx.conf \ ## 指定配置文件位置,默认为nginx所在目录 --pid-path=/usr/local/nginx/nginx.pid \ --add-module=/data/src/lua-nginx-module-0.10.10 ## lua模块
其中的各种 path 请自己指定
执行以上过程检查是否有错误,有错误请请教 Google 和 StackOverflow
若无错误,即可开始构建
make && make install
构建完成直接使用 nginx
来运行 nginx,如果出现 command not found
,可用 ln -s /path/to/nginx/nginx /sbin/
将 nginx 软链到 sbin 下
curl http://127.0.0.1
出现 200 则安装成功
]]>有一种初始化方法,写起来很爽,比如这样:
Map<String,String> map = new HashMap<String,String>(){ { put("name","timeliar"); put("name","timeliar"); }};
这种写法千万注意,会造成内存泄露,原因以下再说
然而这种写法有坑,坑来自 Java 基础的不扎实。
原本天真的以为,这种写法是直接初始化一个类,然后直接调用对象的方法。
但是用反射提取字段信息的时候,出现了问题
@Testpublic void testInner() throws IllegalAccessException { BarUserLink link = new BarUserLink(){ { setBarId(1L); setUserId(1L); } }; BarUserLink link1 = new BarUserLink(); link.setBarId(1L); link.setUserId(1L); System.out.println("匿名内部类反射取字段"); Field[] fields = link.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println(field.getName() + " ==> " + field.get(link)); } System.out.println("正常new对象反射取字段"); fields = link1.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println(field.getName() + " ==> " + field.get(link)); }}
输出:
匿名内部类反射取字段this$0 ==> date.timeliar.graduation.web.TestQuickInit@27abe2cd正常new对象反射取字段barId ==> 1userId ==> 1
查阅了相关资料 (主要是 Google) 之后,尝试得出一个结论,这种写法返回的其实是一个继承了该类的匿名内部类,
实验检验:
@Testpublic void innerClass(){ BarUserLink link = new BarUserLink(){ { System.out.println("this -> "+this.getClass()); System.out.println("super -> "+this.getClass().getSuperclass()); } };}
输出:
this -> class date.timeliar.graduation.web.TestQuickInit$4super -> class date.timeliar.graduation.web.model.po.BarUserLink
真相大白,初始化的时候两个大括号的意义也明了了,外部括号是定义了类边界,内部的是普通代码块,作为作用域。
因为是内部类,所以返回出对象之后,如果该对象被一直使用,那么外部类的对象将不会被会回收,这就造成了内存泄露
返回的本质是一个继承了所需要类的内部类,虽然是子类,但是并不能代表父类的一切,比如反射取字段的时候
超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为 HTTP over TLS,HTTP over SSL 或 HTTP Secure)是一种网络安全传输协议。在计算机网络上,HTTPS 经由超文本传输协议进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。
HTTPS 连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。HTTPS 不应与在 RFC 2660 中定义的安全超文本传输协议(S-HTTP)相混淆。
以上引用自维基百科关于 Https 的解释
关于 Https 的详细信息网上都有,请查阅维基百科和 Google
本文签发 Https 证书的机构为 Let’s Encrypt (以下简称为 LE), 该组织旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的 SSL/TLS 证书。
account.key 为 LE 用来识别你身份 (相当于账户) 的 RSA key,使用 openssl
生成
openssl genrsa 4096 > account.key
LE 和 ACME 协议旨在配置一个自动化的,不需要人为干涉
即可以获得浏览器信任证书的 Https 服务器,该功能是通过服务器上运行一个证书管理代理程序 (Certificate Management Agent) 来实现的,该程序首先需要一个域名的证书签名请求文件 (Certificate Signing Request, CSR),然后将该文件递交给 LE 进行签发。
首先生成 domain.key
文件来作为域名的身份凭证
openssl genrsa 4096 > domain.key
切记不可使用 account.key 来作为 domain.key
然后生成 CSR 文件
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:{domain1},DNS:{domain2}")) > domain.csr
将 {domain1},{domain2} 替换成自己的域名即可,比如 timeliar.date
, blog.timeliar.date
,可添加多个,以逗号分隔,写成 DNS:domain
的格式即可。
提示 /etc/ssl/openssl.cnf 找不到的话请自行 google:can not open /etc/ssl/openssl.cnf,路径有可能是 /usr/local/ssl/openssl.cnf,这个取决于 openssl 是如何安装的
LE 想给你域名签发证书首先得确定域名可用,并且域名是你的。
首先创建一个写入临时文件的目录,如 /var/www/le
mkdir -p /var/www/le
修改 Nginx 配置文件,添加一个 virtual server
server { listen 80; location ^~ /.well-known/acme-challenge/ { alias /var/www/le/; try_files $uri =404; }}
path /.well-known/acme-challenge/
为 LE 固定访问 URI,请不要修改
启动 nginx
nginx
开始认证
python acme_tiny.py \ --account-key account.key \ --csr domain.csr \ --acme-dir /var/www/le/ > \ signed.crt# 获取LE中见证书wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem# 将le的中间证书和生成的证书组合成证书链cat ./signed.crt ./intermediate.pem > ./chained.pem
** 认证过程中 py 脚本会对提供的本机目录 /var/www/le
里写文件,然后通过访问 {domain}/.well-known/acme-challenge/{文件名}
来校验域名是否可用 **
前段时间 Google 完成了 SHA-1 的碰撞实验 (Google 宣布攻破 SHA-1,从此 SHA-1 不再安全),是时候该抛弃 SHA-1 了,这里使用了迪菲 - 赫尔曼密钥交换协议,具体讲解请看 wikipedia
openssl dhparam -out dhparam.pem 2048
将生成的 chained.pem
配置到 Nginx 中
ssl on;ssl_certificate /path/to/chained.pem;ssl_certificate_key /path/to/domain.key;ssl_dhparam /path/to/dhparam.pem;ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';ssl_prefer_server_ciphers on;
然后开始使用吧!
但是出于安全考虑,该证书有效期只有 90 天,到期之后只需要再次进行认证即可,将下列脚本加入 crontab
,90 天运行一次
python acme_tiny.py \ --account-key account.key \ --csr domain.csr \ --acme-dir /var/www/le/ > \ signed.crtcat ./signed.crt ./intermediate.pem > ./chained.pem
免费的证书认证级别还是还是比较低的,只能起到加密信息的作用,适合做个人网站博客等安全要求不是特别高的。电商站点还是得用认证级别更高的付费证书来防止钓鱼网站
作者:鲁迅
古来很有几位恨恨而死的人物。他们一面说些 “怀才不遇”“天道宁论” 的话,一面有钱的便狂嫖滥赌,没钱的便喝几十碗酒,—— 因为不平的缘故,于是后来就恨恨而死了。
我们应该趁他们活着的时候问他:诸公!您知道北京离昆仑山几里,弱水去黄河几丈么?火药除了做鞭爆,罗盘除了看风水,还有什么用处么?棉花是红的还是白的?谷子是长在树上,还是长在草上?桑间濮上如何情形,自由恋爱怎样态度?您在半夜里可忽然觉得有些羞,清早上可居然有点悔么?四斤的担,您能挑么?三里的道,您能跑么?
他们如果细细的想,慢慢的悔了,这便很有些希望。万一越发不平,越发愤怒,那便 “爱莫能助”。—— 于是他们终于恨恨而死了。
中国现在的人心中,不平和愤恨的分子太多了。不平还是改造的引线,但必须先改造了自己,再改造社会,改造世界;万不可单是不平。至于愤恨,却几乎全无用处。
愤恨只是恨恨而死的根苗,古人有过许多,我们不要蹈他们的覆辙。
我们更不要借了 “天下无公理,无人道” 这些话,遮盖自暴自弃的行为,自称 “恨人”,一副恨恨而死的脸孔,其实并不恨恨而死。
]]>$ cat /proc/meminfo | grep SwapSwapCached: 0 kBSwapTotal: 0 kBSwapFree: 0 kB
此时 Swap 分区为空
$ df -lhFilesystem Size Used Avail Use% Mounted on/dev/vda1 30G 1.8G 27G 7% /none 4.0K 0 4.0K 0% /sys/fs/cgroupudev 493M 4.0K 493M 1% /devtmpfs 100M 316K 100M 1% /runnone 5.0M 0 5.0M 0% /run/locknone 498M 24K 497M 1% /run/shmnone 100M 0 100M 0% /run/user
此时 /
目录还有 27G,可以分
$ sudo dd if=/dev/zero of=/swap.disk bs=1m count=2k
([/dev/zero][1]) 或者
$ sudo fallocate -l 2G /swap.disk
([fallocate][2]) man page
此时根目录下生成 swap.disk,可设置 chmod 600 /swap.disk
使 swap 只能 root 可读写,保证读写安全
$ sudo mkswap /swap.diskSetting up swapspace version 1, size = 2097148 KiBno label, UUID=1ba86321-c49d-434c-8c52-741173fb5eab
$ sudo swapon /swap.disk
在查看内存用量
$ cat /proc/meminfo | grep SwapSwapCached: 0 kBSwapTotal: 2097148 kBSwapFree: 2097148 kB
已有 Swap 数据
上述方法在系统重启后 swap 会自动不挂载,设置方法为
$ sudo echo "/swap.disk none swap sw 0 0" >> /etc/fstab
$ sudo echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
为了不重启生效,则
$ sysctl vm.swappiness=10
[1]: javascript:void (0)“在类 UNI 操作系统中,/dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符 (NULL,ASCII,NUL,0x00) 其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD 就是通过 mmap 把 /dev/zero 映射到虚地址空间实现共享内存的。可以使用 mmap 将 /dev/zero 映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。”
[2]: javascript:void (0)“dd 指令为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢如果想让系统认为这里存在一个大文件,而不用具体将空字符写入此处磁盘,则可以使用 fallocate,但 Docker 中该指令失效”
function insert(array, num) { var middle = Math.round(array.length / 2); var left = 0; var right = array.length while (right - left > 1) { if (num <= array[middle]) { right = middle; } else { left = middle; } middle = Math.round((right + left) / 2); } array.splice(middle, 0, num); console.log(array);}
]]>大意为给定一个整数数组,数组中除了一个元素只有一个外,其他元素均出现两次,找出一个的这个元素
最初想法将数组每个数扫描进一个集合,没扫进一个元素判断集合中是否已存在,存在则删除集合中的相应元素,否则将元素添加进集合,最后集合中剩下的那个元素则为单个元素
public int singleNumber(int[] nums) { List<Integer> list = new ArrayList<>(); for (int i : nums) { if (!list.contains(i)) list.add(i); else list.remove((Integer) i); } return list.remove(0);}
上面的方法虽然能通过测试,但是数据量一大所需内存会很大,运行时间也很慢,所以根据异或运算的规律做出了优化方案
public int planB(int[] nums) { int single = 0; for (int i : nums) { single ^= i; } return single;}
]]>大意为在给定的一个数字,求对于每一个小于这个数字的非负整数的二进制形式中有多少 1。
在二进制运算中有一个基本但是神奇的运算 &
,与运算的原则是同为 1 相与则为 1,一旦有 0 相与则为 0,
因此在位运算中有一个神奇的规律,当一个正整数数 x 与 (x-1) 相与时,x 二进制中的最右端的 1 则会消去
如:
010010101&010010100=010010100010100100&010100011=010100000
由此规律可知,当一个数 x 与 (x-1) 相与多次,直到结果为 0,则相与次数则为 x 二进制中 1 的个数
public int[] countBits(int num) { int[] ret = new int[num + 1]; for (int i = 0; i <= num; i++) { int tmp = i; while (tmp > 0) { tmp = tmp & (tmp - 1); ret[i]++; } } return ret;}
]]>010101^001011=011110
a ^ a = 0------>幂a ^ b = b ^ a------>交换a ^ 0 = a------>与0异或a ^ b ^ c = a ^ (b ^ c) ------>结合(a ^ b ^ c) ^ c = a ^ b ------>消去
a = a ^ b;b = a ^ b;a = a ^ b;
]]>给定数组:{1,2,3}目标数:4可能情况: {1,1,1,1} {1,1,2},{1,2,1},{2,1,1} {2,2} {1,3},{3,1}组合数:7
设目标数 i
的组合数为 dp[i]
,可知 dp[i] += dp[i] + dp[i-num]
,例如本题计算 dp[3]
时,数组为 {1,2,3}
,因 3
可拆分为 1+x
,此时 x
则为 dp[2]
,也可拆为 2+x
,此时 x
则为 dp[1]
,因此, dp[i]=dp[i-nums[0]] + dp[i-nums[1]] + dp[i-nums[2]].......dp[i-nums[nums.length-1]]
。
public class Solution { public int combinationSum4(int[] nums, int target) { int[] dp = new int[target + 1]; dp[0] = 1; for(int i = 1 ; i <= target ; i ++){ for(int num:nums){ if(i >= num) dp[i] += dp[i - num]; } } return dp[target]; }}
]]>(\+\d{2})?\s?\d{3}\-?\d{4}\-?\d{4}
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{1,6}$
(暂时没有啦)
]]>Which statement is true for the class java.util.ArrayList?
ArrayList 就是动态数组,用 MSDN 中的说法,就是 Array 的复杂版本,它提供了如下一些好处:
下面函数将返回?
public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally{ return 3; }}
Try catch finally 获取异常错误的结构,try 中有两种情况:
mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar
执行此命令可将制定 jar 包添加至本地 maven 仓库
需指定相应编译插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin-version}</version> <configuration> <source>${语言等级}</source> <target>${语言等级}</target> <encoding>${字符集}</encoding> </configuration></plugin>
在 pom.xml 中添加响应 plugin
<plugin> <groupId>org.apache.tomcat.maven</groupId> <!-- 此处需制定tomcat版本 --> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- 注意此处的url,此处用户需要在tomcat conf目录下的tomcat-users.xml中添加manager-script角色 --> <url>http://localhost:8080/manager/text</url> <username>${tomcat管理员}</username> <password>${口令}</password> <path>/${项目contextPath}</path> <!-- 此处的名字是项目发布的工程名--> </configuration></plugin>
然后在项目目录下执行 mvn tomcat7:deploy
便可以自动编译打包部署运行,此处 tomcat 服务器必须在开启状态下,重新部署执行 mvn tomcat7:redeploy
。
{giuhub 账户名}.github.io (* 注意此处的域名一定得是 Github 账户名,否则显示 404)
使用对应的包管理就可,如 Ubuntu 下 apt-get install node
去官网下载安装包直接安装
可以使用 homebrew 包管理 brew install node
或者直接在官网下载安装包
使用对应的包管理就可,如 Ubuntu 下 apt-get install git
去官网下载安装包直接安装
可以使用 homebrew 包管理 brew install git
或者直接在官网下载安装包
$ git config --global user.name "git服务器用户名"$ git config --global user.email "git服务器邮箱"
然后不需要其他配置,
如果使用普通方法部署博客的话,需在 public
目录下执行 git init
,将此目录初始化为 git 本地仓库
然后使用
$ git remote add origin 远程仓库地址$ git add *$ git commit -m "init"$ git push origin master
将 public
中内容推送到 git 服务器中。
npm install hexo-cli -gnpm install hexo --save
hexo init#安装 Hexo 完成后,请执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。$ hexo init <folder>$ cd <folder>$ npm install#新建完成后,指定文件夹的目录如下.├── _config.yml├── package.json├── scaffolds├── scripts├── source| ├── _drafts| └── _posts└── themes
npm install hexo-generator-index --savenpm install hexo-generator-archive --savenpm install hexo-generator-category --savenpm install hexo-generator-tag --savenpm install hexo-server --savenpm install hexo-deployer-git --savenpm install hexo-deployer-heroku --savenpm install hexo-deployer-rsync --savenpm install hexo-deployer-openshift --savenpm install hexo-renderer-marked@0.2 --savenpm install hexo-renderer-stylus@0.2 --savenpm install hexo-generator-feed@1 --savenpm install hexo-generator-sitemap@1 --save
使用 hexo s
或者 hexo server
开启本地服务器进行调试
使用 hexo n "文章名"
或者 hexo new "文章名"
惊醒文章书写,格式使用 markdown
使用 hexo g
或者 hexo generate
进行构建,将 md 文件解释成 HTML
普通方法为将 Public
目录里的直接 push 进 github 建立的仓库里
或者
编辑站点根目录下的 _config.yml
,添加
deploy: type: git repo: github仓库地址 branch: 分支(以前版本强制要求gh-pages分支,如今master分支亲测有效)
部署完成之后直接访问 http://{用户名}.github.io
即可访问搭建的博客,github 可能会有延迟,部署之后无论是否成功,github 都会发送一封通知邮件
首先到域名提供商购买域名,一般一个 .com
域名价格在 40~60
左右,国内推荐万网,主要是域名备案比较快(国外域名提供商不知是否需要备案・・・・・・),域名买完之后解析 CNAME 记录到 {用户名}.github.io.
上,注意 github.io
后面的 .
很重要,同时在 hexo 博客根目录的 source 目录下添加一个名叫 CNAME
的文本文件,里面写上自定义域名,保存,部署,然后访问就可以了。