winXP 无法直接用 u 盘直接安装

win7 及以后的系统都可以直接用 ultraiso 在 U 盘中写入微软原版硬盘映像,然后引导安装微软纯净系统,但 winXP 用这个办法安装却会报错,无法进入安装环境。因此 winXP 时代重装系统多是利用第三方 PE(预安装环境)和 ghost,这虽然方便但是会发生第三方篡改系统的问题。这里我就说说如何用 win7 及以上安装 U 盘来装 winXP。

原理:利用 win7 的预安装环境来运行 winXP 安装文件

准备材料:2 个 U 盘,ultraiso,winXP.iso,win7.iso or win10.iso(用于当启动盘)

Read more »

hexo与markdown特殊字符

  • 要在文章中表示hexo与markdown占用的特殊字符时,可以使用html特殊字符的转义字符。

  • 若要在文章中直接输出转义字符串时,则可以用代码块标签``` ```包裹转义字符串。

在markdown表格中使用“|”时,由于竖线在markdown中是表格的特殊字符,故要在markdown表格中输出竖线时,应使用html特殊字符的转义字符串。即|

在hexo中标签插件占用了{% %},要在文章中输出花括号与百分号时,使用html特殊字符的转义字符。

引用文章

hexo引用站内的其他文章时,使用标签插件。

{% post_link slug %} 用来生成文章链接,点击可直接跳转到链接的文章

{% post_path slug %} 用来生成文章的路径

slug 指文章标题,它是markdown文件名称,而不是front-matter中的title字段。

html 特殊字符

转义字符串的由来

HTML 中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用。这些符号是不显示在我们最终看到的网页里的,倘若我们需要在页面中显示这些字符,就需要用到转义字符串了。

转义字符串的组成

一个完整的转义字符串,分为三个部分:

  • 一个&符号(英文为 ampersand);
  • 实体名字或#号加上实体编号;
  • 一个;号;
    例如,常用的大于号>,使用转义字符串后的写法为&gt;&#62;

我们注意到,上面的大于号使用了 2 种方式的转义,第一种称为实体名称,第二种为实体编号,区别在于实体名称的优点为便于记忆,但兼容性不完美,实体编号则反之。

html、css、js 特殊字符

html 本身存在很多的特殊字符,像我们常见的 Copyright 符号 ©,使用特殊字符需要注意以下几点:

  • 这些字符属于 unicode 字符集,你的文档需要声明为 utf-8;
  • 这些字符在 html、css、js 中的书写方式各有不同,例如向左的箭头 ⇠,如下:
    • HTML: &#8672;
    • CSS: \21E0, css 的写法需要加上反斜杠,常用在 content 属性中
    • JS: \u21E0,js 的写法需在 css 的基础上前面加个 u
  • 字符在各浏览器的表现略有区别,使用需谨慎。

引自 https://007sair.github.io/2016/07/04/UNICODE/

systemctl配置文件

CentOS 7的服务systemctl脚本存放在/usr/lib/systemd/目录下,/usr/lib/systemd/system目录下是不需要用户登陆,开机就能运行的服务脚本,/usr/lib/systemd/user目录下是用户登陆后才能运行的服务脚本。

服务脚本由以下三部分组成

[Unit] 部份

unit区块通常是配置文件的第一个区块,用来定义Unit的元数据,以及配置与其他Unit的关系。它的主要字段如下。

设置参数 参数意义说明
Description 简易说明,用于使用时的输出说明和systemctl status的输出说明。
Documentation 文档地址,提供管理员进行进一步的文件查询的功能。
After 此unit是在哪个daemon启动之后才启动,仅说明服务启动的顺序,并没有强制要求里头的服务一定要启动后此 unit 才能启动。
Before 与After的意义相反,是在什么服务启动前启动这个服务。仅规范服务启动顺序,非强制要求。
Requires 定义与此unit相依赖的其他服务,如果在此项设置的依赖服务没有启动,那么此unit就不启动。
BindsTo 与Requires类似,定义与此unit相绑定的其他服务,若此项设置的绑定服务退出,则该unit也退出。
Wants 与该unit配合的其他服务,若其他服务未运行,该服务仍能启动。
Conflicts 与该unit冲突的服务,即冲突服务若已启动,该unit则不能启动。该unit已启动,则冲突服务就不能启动。
Condition… 当前 Unit 运行必须满足的条件,否则不会运行。
Assert… 当前 Unit 运行必须满足的条件,否则会报启动失败。
Read more »

注意:本文所有操作都是默认使用 root 用户,默认服务器系统为 centos7。

安装 shadowsocks

添加 epel 源

首先添加 epel 源,以保证能正确安装 shadowsocks 的各项依赖

yum install epel-release -y
# 安装完成后清理配置并重建缓存
yum clean all
yum makecache
# 更新
yum update

安装 shadowsocks 软件

首先安装 git 并用 git 下载源码

yum install git -y
# git安装完成后下载shadowsocks源码
git clone https://github.com/shadowsocks/shadowsocks-libev.git
# 改变工作目录到刚下载的源码目录
cd shadowsocks-libev
# 更新子模块
git submodule update --init --recursive
Read more »

数组是有序的,其索引从0开始。javascript中的数组可以是非齐次的,也就是说,数组中的元素可以是不同类型。(数组的元素可以是另一个数组或是对象)

数组的基本操作

在起始与末尾添加删除元素

  1. arr.push(element)添加一个元素至数组末尾,返回值为添加元素后数组的长度
  2. arr.pop()删除数组末尾最后一个元素,返回值是被删除的元素
  3. arr.unshift(element)添加一个元素至数组开头,返回值为添加元素后数组的长度
  4. arr.shift()删除数组开头第一个元素,返回值是被删除的元素

这4个方法会直接修改原数组。

const arr = ["b", "c", "d"];
arr.push("e"); // 返回4,arr为["b", "c", "d", "e"]
arr.pop(); // 返回"e",arr为["b", "c", "d"]
arr.unshift("a"); // 返回4,arr为["a", "b", "c", "d"]
arr.shift(); // 返回"a",arr为["b", "c", "d"]

串接

arr.concat(anotherArr | elements)

该方法若将数组作为参数传入则将数组拆分为元素并添加至调用该方法的数组末尾,若将多个元素作为参数传入则直接将元素添加至调用该方法的数组末尾。concat方法只会拆分最外层直接传入的数组,并不会拆分数组内的数组。

这个方法不会修改原数组,会返回一个新的数组。

const arr = [1, 2, 3];
arr.concat([4, 5, 6]); // 返回[1, 2, 3, 4, 5, 6],arr不变
arr.concat(4, 5, 6); // 返回[1, 2, 3, 4 5, 6],arr不变
arr.concat([4, 5], 6); // 返回[1, 2, 3, 4, 5, 6],arr不变
arr.concat([4, [5, 6]]); // 返回[1, 2, 3, 4, [5, 6]],arr不变
Read more »

什么是闭包?

函数记住(记住就是指不被垃圾回收)并访问所在的词法作用域,叫做闭包现象,函数对作用域的引用就叫闭包。(个人理解:闭包就是函数与其所在的不被垃圾回收掉的词法作用域的引用关系)

闭包的三个条件

一、可以访问其所在作用域的函数

即可以通过作用域链查找变量的函数

const foo = 0;
function bar() {
    console.log(foo);
}
bar(); // 0

二、有权访问另一个函数作用域中变量的函数

即访问上层函数作用域的内层函数

function foo() {
    const a = 0;
    function bar() {
        console.log(a);
    }
    bar();
}
foo(); // 0

三、在函数声明时的作用域以外的地方被调用的函数

即函数作为返回值或作为参数被传递

// 作为返回值
function foo() {
    const a = 0;
    return function () {
        console.log(a);
    };
}
foo()(); // 0
// 作为参数传递
function foo() {
    const a = 0;
    function bar() {
        console.log(a);
    }
    baz(bar);
}
function baz(fn) {
    fn();
}
foo(); // 0
Read more »

在一些语言中,声明和定义存在明确的区分。声明一个变量仅指给它指定一个标志符来宣称它的存在。而定义则代表声明后还要进行赋值。
在 javascript 中,声明和定义是可以互换的概念。因为所有变量都会在声明之后给定一个值。如果你没有显式赋值,会自动给定一个隐含值 undefined。

静态作用域

javascript 使用静态作用域。静态作用域又称词法作用域,静态作用域下函数作用域在定义(声明)时已经确定,如未找到自身作用域内的变量,则沿作用域链向上,在上级作用域中查找,直到全局。

Read more »

this的四种绑定(动态作用域,动态绑定,绑定调用时的对象)

一、this的默认绑定

全局上下文中(即在任何函数体外部)

无论是否为严格模式,this均绑定到全局对象(node中为global,浏览器中是window)。

"use strict"
console.log(this === window); // true

在函数上下文中

(1)严格模式下,this默认绑定为undefined

function foo() {
    "use strict";
    console.log(this === undefined);
}
foo(); // true

(2)非严格模式下,this默认绑定到全局(node中是global,浏览器中是window)有以下四种情况:

Read more »
0%