Change The World

沉默是一种力量,嘶吼就不是力量了?

0%

不要慨叹生活的痛苦!慨叹是弱者。——高尔基

温故知新

  • 构造函数才有原型prototype
  • 原型也是对象,由Object创建
  • 每个对象都有__proto__属性,指向创建它的构造函数的原型对象prototype
  • Object的原型对象的__proto__指向null
  • 构造函数也是对象
  • 所有的构造函数都是Function创建的
  • 原型对象中的构造函数(constructor)指向当前构造函数

注:null对象除外

图解

  1. 简单的继承原型链图

继承与原型链

  1. 经典原型链图

拆解图

原型链拆解图

声明:文中图片均来自网络,如有错误烦请邮件告知小弟

附录

Object

继承与原型链

Tracing Javascript’s Prototype Chain

学习并记录shell脚本中参数替换的几种替换格式

格式一
  • ${parameter-default} – 如果变量parameter没被声明, 那么就使用默认值.

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    default="默认值"
    echo ${parameter-${default}} #parameter 未声明
    # 输出:默认值
    parameter=
    echo ${parameter-${default}} #parameter 已声明
    #输出:
  • ${parameter:-default} – 如果变量parameter没被设置, 那么就使用默认值.

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    default="默认值"
    echo ${parameter:-${default}} #parameter 未声明
    # 输出:默认值
    parameter=
    echo ${parameter:-${default}} #parameter 已声明
    #输出:默认值
格式二
  • ${parameter=default} – 如果变量parameter没声明, 那么就把它的值设为default.

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    default="默认值"
    echo ${parameter=${default}} #parameter 未声明
    # 输出:默认值
    parameter=
    echo ${parameter=${default}} #parameter 已声明
    #输出:
  • ${parameter:=default} – 如果变量parameter没设置, 那么就把它的值设为default.

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    default="默认值"
    echo ${parameter:=${default}} #parameter 未声明
    # 输出:默认值
    parameter=
    echo ${parameter:=${default}} #parameter 已声明
    #输出:默认值
格式三
  • ${parameter+default} – 如果变量parameter被声明了, 那么就使用default, 否则就使用 null字符串.

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    default="默认值"
    echo ${parameter+${default}} #parameter 未声明
    # 输出:
    parameter=
    echo ${parameter+${default}} #parameter 已声明
    #输出:默认值
  • ${parameter:+default} – 如果变量parameter被设置了, 那么就使用default, 否则就使用 null字符串.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    default="默认值"
    echo ${parameter:+${default}} #parameter 未声明
    # 输出:
    parameter=
    echo ${parameter:+${default}} #parameter 已声明
    #输出:
    parameter= '被赋值'
    echo ${parameter:+${default}} #parameter 已赋值
    #输出:默认值
格式四
  • ${parameter?default} – 如果parameter已经被声明, 那么就使用设置的值, 否则打印default 错误消息.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    default="默认值"
    echo ${parameter?${default}} #parameter 未声明
    # 输出:
    parameter=
    echo ${parameter?${default}} #parameter 已声明
    #输出:
    parameter= '被赋值'
    echo ${parameter?${default}} #parameter 已赋值
    #输出:默认值
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    parameter=
    echo ${parameter?${default}} #parameter 已声明
    #输出:
    parameter= '被赋值'
    echo ${parameter?${default}} #parameter 已赋值
    #输出:被赋值
  • ${parameter:?default} – 如果parameter已经被设置, 那么就使用设置的值, 否则打印 default错误消息.

    1
    2
    3
    4
    #!/bin/bash
    default="默认值"
    echo ${parameter:?${default}} #parameter 未声明
    # 输出:默认值 (报错)
    1
    2
    3
    4
    #!/bin/bash
    parameter=
    echo ${parameter:?${default}} #parameter 已声明
    #输出:默认值 (报错)
    1
    2
    3
    4
    #!/bin/bash
    parameter= '被赋值'
    echo ${parameter:?${default}} #parameter 已赋值
    #输出:被赋值


分享一个简单的项目管理脚本,有待于补充,欢迎指正

前提说明

    本文使用的部署工具使用的是pm2,项目存储在GitHub, 因此脚本主要做的的事情就是从GitHub上拉取最新的代码进行本地部署,项目服务的启动、关闭、重启、重载配置文件(pm2)

脚本功能

  • 启动服务
  • 关闭服务
  • 重启服务
  • 重载配置文件
  • 更新项目
  • 帮助说明

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash
myapp_path=~/projectPath # 项目路径
cd ${myapp_path}
pid=$(ps -ef |grep node|grep -v grep|awk '{print $2}') # 获取项目进程号
start(){
if [ -z ${pid} ]
then
pm2 start pm2.json
else
echo -e "\E[1;32;40mAPP now at starting......"; tput sgr0
fi
}
stop(){
if [ -z ${pid} ]
then
echo -e "\E[1;31;40mAPP have been stop."; tput sgr0
else
pm2 stop pm2.json
fi
}
restart(){
pm2 restart pm2.json
}
reload(){
pm2 reload pm2.json
}
refresh(){
git pull
npm run compile
restart
}
help(){
cat<<EOF
USE GUIDE

1.启动
$ myapp start
2.关闭
$ myapp stop
3.重启
$ myapp restart
4.重载配置文件
$ myapp reload
5.更新项目
$ myapp refresh

EOF
}
main(){
if [ $# -ne 1 ];then
help
exit 1
fi
case $1 in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"refresh")
refresh
;;
"reload")
reload
;;
*)
help
;;
esac
}
main $@

总结

    通过shell编写一些脚本,可以减少我们工作当中经常重复的工作,对于运维工作者是一种必不可少的技能了,当然本文展示的知识一些简单的操作,如果需要更加自动化部署项目,我们可以考虑使用GitHub上的webhook功能

附录

jenkins

瓦力上线部署

Comparison of continuous integration software

    内容主要用于自己对资料的整理以及日后查阅,无任何其他目的,对于内容有不正确的地方还请邮箱联系小弟,在此先谢过。


session、cookie出现的原因

​    http无状态的协议,什么是无状态呢,是指http没有记忆的功能。如果没有状态的情况下,需要每次链接都传送大量数据,比如说在购物的时候,如果没有cookie和session每浏览加入购物车一次都得重新登陆。
为了解决这一问题,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。

This document defines the HTTP Cookie and Set-Cookie header fields.These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol. Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet. This document obsoletes RFC 2965.

​    HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

​    通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

解决问题?

Cookie主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

​    Cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie渐渐被淘汰。由于服务器指定Cookie后,浏览器的每次请求都会携带Cookie数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB 。

注: 客户端维护会话状态

session?

session定义(来源API文档)

Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user.

【译文】:为用户识别多个页面请求或访问Web站点,并存储有关该用户的信息提供一种方法。

​    是指一类用来在客户端与服务器端之间保持状态的解决方案。 有时候Session也用来指这种解决方案的存储结构或服务器端的一种存储会话的机制

运行机制

​    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

解决问题?

    会话状态管理(session用于在用户身份验证后跟踪用户行为轨迹)

持久性方式:文件、数据库、客户端cookie

注: 服务端维护会话状态

小总结[session]

  1. 浏览器会话期间: 一系列的请求响应事务
  2. session机制:是指一类用来在客户端与服务器之间保持状态的解决方案
  3. session:有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里
  4. HttpSession:由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session
  1. session技术基于cookie没有cookie,session也无法完成
  2. 浏览器在第一次访问服务器时,服务器发现没有携带sessionId,会自动创建session对象。并将创建的cookie对象保存sessionId发送给浏览器。
  3. 在浏览器发送请求时,带有cookieid的session

参考

HTTP State Management Mechanism

HTTP cookies

Cookies - Information that websites store on your computer

Session机制详解

Cookie

附录

cookie分类

会话期Cookie

    会话期Cookie是最简单的Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就好像浏览器从来没有关闭一样。

持久性Cookie

    和关闭浏览器便失效的会话期Cookie不同,持久性Cookie可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。

1
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

提示: 当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。

    俗语说的好 “好记性,不如烂笔头”,所以思来想去还是把这篇博客完成吧!本篇主要介绍javascript的正则表达式,ok 闲话少说,下面就直接开始,GO GO GO …

注:正则表达式就是对字符串的操作


正则表达式语法

    创建正则表达式有两种表达方式,一种就是非常规范的 new 方式,另一种就是Perl风格的表达式。说不上谁好谁坏,各有各的优缺点。 就看您的喜好了🤔

  • new RegExp(pattern,option);

    1
    2
    3
    4
    5
    6
    7
    pattern: 字符串,指定了正则表达式的模式用于匹配字符串
    option: 可选值,主要有 g、i、 m
    ============
    g: 全局匹配
    i: 忽略大小写
    m: 多行匹配
    ============

        一眼看上去很容易理解,构造一个新的实例对象,按照我们正常的思路创建了一个正则表达式。它返回一个新的 RegExp 对象,具有指定的模式和标志,如下:

    1
    var reg = new RegExp(’\\d{2}’,’g’);

    而知:
    优点: 容易理解
    缺点: 😷(机智如我)

注:使用new创建正则表达式时使用元字符如(“\d”)必须要添加转义字符 “\

  • perl 风格表示:

    1
    /pattern/option #没错,就这么多

    再次可而知:
    优点: 写起来非常简单
    缺点: 😵 (已瞎)


修饰符

option 概述
g 全局匹配 (global)
i 匹配时忽略大小写 (ignoreCase)
m 多行匹配 (multiline)

注:m 使用时,只有匹配字符串中包含\n,并且正则表达式中包含^或$行首行尾,m 修饰符才会生效

‌中括号[ ]

表达式 概述
[asd] 匹配中括号中的任意字符
[^asd] 匹配除了中括号中的任意字符
指定范围
[a-z0-9] 匹配a到z,0到9的任意字符
分块匹配
(abc|def|ghi) 匹配指定的选项

‌元字符

‌元字符 概述
. 匹配单个字符,不包括换行和行结束符
\d 匹配数字
\D 匹配非数字字符
\w 匹配单词字符,a-z0-9A-Z以及下划线
\w 匹配非单词字符
\s 匹配空白字符,空格符,制表符,回车符,换行符,垂直换行符, 换页符
\S 匹配非空白字符
\b 匹配单词边界,单词开头或结尾
\B 匹配非单词边界
\0 匹配null字符
\n 匹配换行符
\f 匹配换页符
\r 匹配回车符
\t 匹配制表符
\v 匹配垂直制表符
\xxx 八进制
\xdd 16进制
\uxxxx 16进制规定的Unicode字符

‌量词

‌量词 概述
+ 匹配至少一个[1,+∞]
* 匹配零个或多个[0,+∞]
? 匹配零个或一个[0,1]
{n} 匹配n个的序列字符串
{n,m} 匹配n个的序列字符,最多匹配m次
{n,} 匹配至少n个序列字符串
n$ 匹配任何n字符结尾
^n 匹配任何n字符开头的字符
?=n 匹配任何其后紧接指定字符串n的字符串
?!=n 匹配任何其后没有紧接指定字符串n的字符

regexp方法

‌方法 概述
compile 编译正则表达式
exec 检索指定值返回值及其位置
test 检索指定值,返回TRUE或FALSE

string支持正则的方法

‌方法 概述
search 检索正则表达式匹配的值
match 找到一个或多个正则表达式匹配
replace 替换与正则表达式匹配的字符串
split 分割字符串为数组

示例展示

‌方法 概述
手机号码匹配 /^1[34578]\d{9}\$/ 或 /^1(3|4|5|7|8)\d{9}\$/

😴困了,待续…

上篇

    最近小弟做了一个艰难的决定 ☺ ,接下来的即将面临着一段相对艰难的日子。不用多疑,因为买了人生中的第一台macbook pro,凭心而讲这个决定其实很早之前就已经萌生了,记得当时正在学习swift(Apple新出来的开发语言,也不怎么新了),也就是在2016年10月份左右,当时刚毕业没有多久,在第一家公司需要Apple应用开发人员,顺势便开始了我的Apple之路。
    当时因为身上并没有什么闲钱(吃喝还是可以的),想买一台mac,⊙﹏⊙‖∣ 只是想想而已,但是脚步并未有放弃,我把自己的gateway笔记本装了一个黑苹果,哎!装上是可以的但让人头痛的是合适的驱动太难找了,目前我的黑苹果无线网卡驱动,电池驱动还没有着落…

    抒情就此打住,下面就来看看今天(2017年7月22日)刚买到的macbook pro吧,在此感谢弟兄们的推荐以及苹果的叶子客服给与的讲解与解惑,更是要感谢快递小哥在炎炎的夏日能够准时的送达,你们辛苦了,都不容易相互尊重,相互理解。

下篇

    下面我们开始上图了,步入正规拆开它

  • 快递包装(顺风)

并没有多大看头,和普通快递差不多

  • 下面揭掉l庐山第一层面纱
  • 庐山第二面

正面一如既往的logo,反面有六颗螺钉

  • 内部装置
  • 下面就是正常的系统预设,就简单的放几张新功能,Touch ID

在最新的macbook上加入了指纹解锁

  • 指纹支付

剁手党们你准备好了吗

  • Touch Bar

逼格满满有木有

  • 最后主界面闪过

结束

梦想 奋斗 坚持

水一篇...

上午

    早上起来已是八点半左右,看了最长的电影指环王,经过几天的努力(😏)只剩下四五十分钟左右,大概看完了有二十分钟左右就开始报幕仔细看了一下竟然有二十多分钟左右。真是😥
    赶紧起床洗漱完毕,戴上耳机骑着电动车,一路向东,去之前的房东阿姨那里,当然是为了押金。
    时间很快大约十一点左右到达目的地,事情当然办的很顺利(主要是有合同在手),和房东阿姨寒暄了几句,拿了钱,赶紧撤了,随后骑车直奔银行找了附近的邮政储蓄,结果可想而知,尴尬没有办过邮政的卡,算了直奔地铁站,上了地铁,把钱通过某宝发给了兄弟们,完事。
    最头痛的是,竟然会多坐了一站路,所以说,做事还是用心点是没有错的,马上掉头,来到了指定地点,开始换乘四号线直达紫金山登山一号口。
    时间大约在11点二十左右,开始一步一步的登山,时间在跑当然我却在走登山的阶梯,……差不多五十分钟左右过去了(没办法,身体素质好歇了好几次)😊
    十二点一刻左右最终抵达了山顶,俗话说得好,尽吾志也而不能至者,可以无悔矣。
‌这句看着怎么这么别扭呢,还是换一句吧,你所走的路,只为更好的风景(绝对不是卖弄)😆

中午

    
表示一直在下山的路上(因为选择了另外一条下山的道路)‌

下午

    
表示一直在回去路上…

晚上

    
敲了几行代码,还是洗洗睡吧😴,明天还要上班呢.

END

直接上图,今天的紫金山(风真的很大…)

励志一下吧<你已经输在了起跑线>

前言

How time flies!
记得刚开始开通blog的时候,当时还是处于无业游民的状态。曾经心中默默地下过一个决心,每周写一篇技术博客。当写到这里的时候也是对自己一通唏嘘。

自从找到新工作到现在差不多有三个月的时间了,曾经的决心依然无存了……最终还是败给了工作和懒惰。每当翻起blog就会再次激起我的决定,那就是 go on……

闲话少说,开始继续技术之旅吧,本次重新写技术博客就写一个简单易懂的吧,太难得也不会哈哈哈……

正文

SECONDS

是一个shell脚本的内置环境变量,通过这个变量可以获取到行shell脚本运行的时间,【以秒为单位】:
一言不合先来个示例以表尊敬:

1
2
3
4
5
6
7
8
#!/bin/bash  
cat <<eof
this is a simple example:
this will shows the script running times
thank you read the blog.
eof
sleep 5
echo -E '\E[1,31,40m' "The shell script file $(basename $0) Running time is $SECONDS" tput sgr0

俗话说得好,字不如表,表不如图,怎能不来张图呢:

这个变量也是蛮给力的最起码省去你的几行代码,好了本篇就到这里落笔了,哦是关机了
记住初心,默默前行。
change the world.

    在IT界混下去没有blog怎么能行呢?
以上纯属玩笑,因为有了blog可以记录下平时生活的点点滴滴也可以分享下相关技术心得更可以记录工作中遇到的问题。多说不宜,那就开始步入整体吧,此次blog搭建主要是采用 hexo + githup, 下面就 follow me 一起按照步骤开始开启blog之旅吧。

准备工作

  1. 如果你想对外可以访问,首先申请github帐号
  2. 新建仓库,命名格式: 用户名.githup.io 点击完成,如下图:

目前完成了万里长征的第一步,go on...

安装blog环境‌

  1. 安装git,网盘(windows)安装包,安装git主要是把hexo生成的blog站点提交到github
  2. 全局安装 hexo
1
$ npm install -g hexo --save
  1. 新建站点文件夹(以下没有特别说明均在此文件夹下执行),进行初始化
1
$ hexo init
  1. 生成blog静态页面
1
$ hexo generate (或 hexo g)
  1. 本地启动,进行预览
1
$ hexo server (或 hexo s)

blog站点预览地址:http://localhost:4000

配置Github

  • 修改站点文件夹下的_config.yml文件,找到deploy位置,修改如下:
1
2
3
4
deploy: 
type: git
repository: https://github.com/zzhtom/zzhtom.github.io.git
branch: master
  • 安装git部署的插件
1
$ npm install hexo-deployer-git --save
  • 部署到github
1
$ hexo deploy (或 hexo d)
  • hexo 常用命令
1
2
3
4
5
6
7
8
hexo clean                清理生成的blog页面    
hexo generate 生成静态页面
hexo deploy 部署页面到github
hexo new "postName" 新建文章
hexo new page "pageName" 新建页面
hexo server 开启本地服务
hexo help 查看帮助
hexo version 查看Hexo的版本

配置域名访问

  • 进行ip指向,ipgithub访问路径的解析ip,如下图:
  • 进行域名指向,指向域名即为 用户名.github.io

网站推荐

hexo官网
Next主题
博客推荐
本人blog www.zhangxiaoheng.cn 欢迎来访