Hexo


  • Startseite

  • Archiv

  • Tags

用vultr建立网站

Veröffentlicht am 2017-04-20

内容会运用到Linux、docker

如果有visa,可以直接到vultr官网付款购买服务器。如果没有,某宝上面有代沟。

我在这里使用的配置是,Tokyo Ubuntu16.04 25GB SSD,也就是通常能买到的最低的配置

我是在某宝上面代购的,谈好价钱后,对方会给你一个ip地址和用户名还有密码。

某宝

之后打开terminal

1
ssh root@45.76.222.131

terminal会提示输入密码,直接输入收到的密码就好。

接着就要输入以下的命令了。

生成一个ssh key

1
ssh-keygen

显示公钥

1
cat ~/.ssh/id_rsa.pub

把生成的公钥放到GitHub上面

接着回来搭建基本的开发环境

安装vim

1
apt-get install -y vim git

安装docker

1
curl -SsL https://get.docker.com | sh

查看docker中的容器

1
docker ps -a

docker中安装node6.8

1
docker pull node:6.8

docker中安装mongodb:3.0

1
docker pull mongo:3.0

docker运行node

1
docker run -itd -v /root/.ssh/:/root/.ssh --name node --net=host node:6.8 bash

进入docker

1
docker exec -it node bash

从GitHub克隆过来自己写好的网页应用

1
git clone git@github.com:zhuanyongxigua/notepad-online.git

列出所有

1
ls -all

出容器(另开一个terminal重新进)运行mongodb

1
docker run -itd --name mgo --net=host mongo:3.0

然后就可以cd到克隆过来的文件里面使用npm install并npm start了

如果运行出错,需要停掉程序

1
docker stop node

这里面的node就是上面创建的那个,因为上面创建的时候的name规定的是node

改好错之后就继续运行node

1
docker start node

如果需要向mongodb post数据

1
curl -i -H "Content-Type:application/json" -XPOST -d '这里是JSON数据' url

使用autohotkey修改方向键、回车和启动程序

Veröffentlicht am 2017-04-07

autohotkey官网

autohotkey官方文档

官方文档中文版

具体步骤

  1. 下载并安装autohotkey。

  2. 在你觉得合适的地方鼠标右键-新建-autohotkey script(脚本);或者创建一个别的文件,再把后缀改成ahk也可以

  3. 一个新建的ahk文档里面会有这些东西

    1
    2
    3
    4
    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    ; #Warn ; Enable warnings to assist with detecting common errors.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
    SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.

    不用管这些

  4. 在下面输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    !j::
    Send, {Down}
    Return
    !l::
    Send, {Right}
    Return
    !h::
    Send, {Left}
    Return
    !k::
    Send, {Up}
    Return

    这几句话是把↑改成了alt+k;↓为alt+j;←为alt+h;→为alt+l。如果想用ctrl代替alt,就把! 换成^ 。其他的+ 代表shift,# 代表windows键,更详细的看这个。如果不需要其他功能了,直接保存并关闭,跳到第 步。

  5. 加入修改回车的功能。键盘左侧的Capslock(锁定大小写)键使用频率相对还是不高的,而回车键的位置又有点坑,改之。直接复制这段这两行。

    1
    2
    3
    $CapsLock::Enter
    LAlt & Capslock::SetCapsLockState, % GetKeyState("CapsLock", "T") ? "Off" : "On"

    这样,左侧的Capslock键就成了回车,以后小量的大写字母用shift+字母,如果有大量的大写字母的输入,用alt+Capslock ,跟之前Capslock是一样的。

  6. autohotkey也可以用快捷键启动软件,例如

    1
    2
    3
    !o::
    Run, C:\Program Files\Everything\Everything.exe
    Return

    现在alt+o就是启动everything的快捷键了。同样的,如果想用ctrl代替alt,就把! 换成^ 。其他的+ 代表shift,# 代表windows键,更详细的看这个。如果想启动其他的软件,就把上面的路径换成你想启动的那个软件的路径机就可以了。

  7. 保存,关闭

  8. 在编辑好的文件点击鼠标右键,选择编译脚本,也可能是Compile script,也可能是Compile脚本,都是一样的。编译之后就会生成一个.exe的文件,把这个文件放到开机启动文件夹中(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp),每次开机就可以自动启动了。

一个关于回调函数的例子以及异步程序和非阻塞I/O的理解

Veröffentlicht am 2017-03-25

JavaScript有一个明显的特征:第一类函数(first-class functions)(wiki) 。

与第一类函数有关的名词还有第一类对象和第一类公民(头等公民)(wiki) ,在JavaScript中,函数是第一类对象或者说是第一类公民,简单理解,就是权限很大,可调用的资源多。这是因为这样,它才可以被当做参数或变量来使用。

对于异步程序和非阻塞I/O,记得在知乎上看到过一个非常好的举例:你给图书馆打电话查书,图书馆的管理员会有两种反应,第一种:“麻烦等一下,不用挂电话,我查一下”;第二种:“知道了,等我查到了我给您回电话”。这里面的区别,一个在你,一个在电话线路。第一种情况下,你不能去干别的,只能老老实实的在电话前面等着,而且,别人在这段时间里没法给你打电话了。第二种情况就无所谓了,你可以去high,去耍,去上厕所,其他的朋友给你打电话你也接的到。第一种情况就是同步的、阻塞的,第二种就是异步的、非阻塞的。

下面是一个nodejs的例子,创建一个rectangle-2.js的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = function(x,y,callback) {
try {
if (x < 0 || y < 0) {
throw new Error("Rectangle dimensions should be greater than zero: l = "
+ x + ", and b = " + y);
}
else
callback(null, {
perimeter: function () {
return (2*(x+y));
},
area:function () {
return (x*y);
}
});
}
catch (error) {
callback(error,null);
}
}

在创建一个solve-2.js的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var rect = require('./rectangle-2');
function solveRect(l,b) {
console.log("Solving for rectangle with l = "
+ l + " and b = " + b);
rect(l,b, function(err,rectangle) {
if (err) {
console.log(err);
}
else {
console.log("The area of a rectangle of dimensions length = "
+ l + " and breadth = " + b + " is " + rectangle.area());
console.log("The perimeter of a rectangle of dimensions length = "
+ l + " and breadth = " + b + " is " + rectangle.perimeter());
}
});
};
solveRect(2,4);
solveRect(3,5);
solveRect(-3,5);

程序是这样运行的,用node命令

1
node solve-2
  1. 运行solve-2.js,rectangle-2.js文件被引用,并赋值给变量rect。
  2. 在最后几行,函数solveRect被调用三次,分别赋值(2,4)、(3,5)和(-3,5),
  3. 在函数solveRect运行到调用rect时,也相当于是一个赋值的过程,l赋值给rectangle-2.js文件中函数的x,b赋值给y,rect的第三个参数,也就是那个匿名方程,赋值给了callback。到这里solve-2.js就运行完了,可以该干嘛干嘛了。
  4. 目光放到rectangle-2.js,程序运行,先在try里面判断,确定符合要求之后,就运行callback函数,也就是第三步中赋值给callback的那个函数,求得结果。

从三个区域理解git命令(基础篇)

Veröffentlicht am 2017-03-20

2.1 获取库

在学习这些下面的命令之前,首先要清楚你的代码的三种状态,已修改、已暂存、以提交。以及他们对应的三个区域:工作目录、暂存区、库。

其实在除这三个区域之外还有一个区域,这个区域是在你的git系统之外的区域,暂且叫它非跟踪区,所以我们上面说的三个区域就可以统称为跟踪区了。

下面这个链接是一个git的操作教学。

库从哪来?

两个来源,一个是你的电脑,一个是别人的电脑

不管在哪,他们现在都在非跟踪区。所以这一步的意义就是把代码从非跟踪区拉到你git管理的跟踪区。

如果是你的电脑,在你写的代码的那个文件夹右键,点击git bash here(前提是你要安装了git);或者在terminal用cd命令到所在文件夹。

然后

1
$ git init

如果是别人的电脑 (一般是在服务器),在你觉得方便的文件夹,比如右键你的新建文件夹 ,点击git bash here,然后输入。

1
$ git clone https://github.com/libgit2/libgit2

这样在你的新建文件夹里面就有一个libgit2的文件夹了。

当然你也可在克隆的时候顺便把名字改了。

1
$ git clone https://github.com/libgit2/libgit2 mylibgit

开始编程

跟踪新文件(新增文件加入git管理范围)

在把需要的东西拉到跟踪区之后(本地库)之后,就可以开始写代码了。

如果你是新建了一个文件写,git不会主动把他划在跟踪区,所以你需要用git add ;

如果你是在已有的文件里面修改代码,修改好了之后想把它添加到暂存区,那你需要用git add ;

所以,git add 不但可以把文件从非跟踪区拉到工作目录,还可以把文件从工作目录拉到暂存区。 git add 还有其他的功能,总之,要把它理解成“添加内容到下一次提交”,不要理解成“把文件增加到项目中”。

具体举例:

git add README~~~
1
$ git add CONTRIBUTING.md

一个一个添加麻烦?

1
$ git add -A

A 就是all ,无论文件在非跟踪区还是工作区,都通通拉到暂存区。

当然git add 还有很多其他的细节,具体可以看这个。

检查你文件的状态

用过git add 之后,或者没有用,无所谓,你都可以用git staus 查看你的工作目录的里面文件的状态,这个工作目录就是你用git初始化的文件夹,这个命令查看的区域可以包括非跟踪区、工作目录、暂存区。

1
$ git status

里面不但显示文件的状态,也会有相应的操作的提示。如果你觉得使用这个命令得到的信息过于冗长,那你就可以试着用git status -s 或者 git status --short 。

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

?? 表示新的且没有被缓存的文件,

A 新的且已经被缓存的文件,

M 被修改的文件

MM 缓存之后再次修改的。

查看文件具体做了哪些修改

1
$ git diff

忽略文件

总是有一些文件你不想被git接手,那就手动忽略他们吧。

创建一个.gitignore 的文件,以存放你需要忽略的文件模式。

1
2
3
$ cat .gitignore
*.[oa]
*~

“.o” or “.a”表示忽略以.o、.a 结尾的文件。

第二行的意思是忽略名字里面带有波浪线 (~)的文件。

提交更改

用了git add 把文件拉到暂存区之后,就可以提交了。

1
$ git commit

用 commit 加 -m 留下提交信息。

1
2
3
4
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README

如果觉得麻烦,可以跳过暂存区

这个命令用到的all 与上面说的git add 的all 是有区别的,git commit 的all 不包括非跟踪区的文件

1
$ git commit -a
1
$ git commit -a -m`

查看提交历史

1
$ git log

撤销

修改已提交

针对的是已提交的文件。

1
$ git commit --amend

git commit –amend命令用来修复最近一次commit. 可以让你合并你缓存区的修改和上一次commit, 而不是提交一个新的快照. 还可以用来编辑上一次的commit描述.记住amend不是修改最近一次commit, 而是整个替换掉他. 对于Git来说是一个新的commit. 如果文件没有变,那就可以用它来修改上一次的描述。

取消已缓存

在已缓存区,可以把不想缓存的文件拉出来

1
$ git reset HEAD CONTRIBUTING.md

撤销已更改

针对的文件是工作目录里面的文件,如果是没有缓存的文件,退回到的是上次提交的状态;如果是缓存了之后再次修改的文件,那退回的是缓存之后的状态。这个命令使用要慎重,一旦退回,无法恢复。

1
git checkout -- <file>

别名

用 git config 简化命令。

1
2
3
4
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

执行了上述的命令后,checkout就变成了co,branch就变成了br,其他两个同理。

如果是想替换reset HEAD 这样多单词的命令:

1
$ git config --global alias.unstage 'reset HEAD --'

如何在网络公共场合发帖提问

Veröffentlicht am 2017-02-27

本文《How To Ask Questions The Smart Way》的学习笔记,仅供参考。

概括的说就是在提问之前先自己尝试解决问题,未能解决,再提问。

提问的根本原则是:让别人指点你,而不是让别人直接给你。

先做好自己的功课

提问之前你要先做好下面的事情。

  1. 用google搜索。至于为什么要用google和如何用google,大家先去google一下吧。
  2. 阅读软件的使用手册。
  3. 阅读相关软件的FAQ。
  4. 在论坛中搜索。
  5. 自己检查和试验。

提问的时候

请先表明你已经上一部分所说的那里尝试和努力,

如果你的问题是可以不可以给点提示?、我的这个例子里面缺了什么?或者我应该检查什么地方? ,那恭喜你已经入门了,如果你一般都是直接问请把我需要的确切过程发给我,那你可能需要更加认真的往下看。

在合适的地方提出合适的问题

例如,不要母婴论坛问编程的问题(相信没有人会这样做),不要在全是高手的地方问初级问题,不要重复贴出同样的问题,不要向跟你不熟也没有义务帮助你的人发送私人邮件。

关于网络论坛

搞清楚那个论坛是干什么的,搞清楚论坛里面每个版块是干什么的。

写好标题

好标题=对象+偏差

对象是出问题的那个东西

偏差是指与你期望不一致的地方

例如:

愚蠢的描述:救命啊!我的电脑不能播放视频啦!

聪明的描述;X.org 6.8.1的鼠标光标变形,某品牌显卡 MV1005 晶片組。

更聪明的描述:X.org 6.8.1的鼠标光,在某品牌显卡 MV1005 晶片組环境下变形

最后一个例子变形就是偏差,前面的就是对象。

描述问题

简洁有效

  • 按时间顺序仔細、清楚地描述你的问题或bug的症狀,不要说你自己的猜测。
  • 描述问题发生的环境(电脑配置、操作系统、软件、以及相关信息),提供经销商的发行版和版本号。
  • 描述在提问前你是怎样去研究和理解這这问题的。
  • 描述在提问前为确定问题而采取的诊断步骤。
  • 描述最近做过什么可能相关的硬件或软件变更。
  • 如果可能的提供一个可以再现这个问题的既定环境的方法

如果是关于代码的问题,注意不要把你上百行的代码全部贴出来,只要贴出出现问题的那个部分就可以了。比如在第七行以后,我希望他得出<x>,但实际的结果却是<y>。

例子:

愚蠢的描述:我在编译内核时接连遇到SIG11错误,怀疑主板上的某根电路丝断了,找到它们的最好办法是什么?

聪明的描述 :我组装的电脑(K6/233 CPU、FIC-PA2007 主板威盛 Apollo VP2 芯片组、Corsair PC133 SDRAM 256Mb 内存)最近在开机20分钟左右、做内核编译时频繁地报错,提示SIG11 ,但在头20分钟内从不出问题。重启动不会复位时钟,但会整夜关机。更换所有内存未解决问题,相关的典型编译会话日志附后。

说出目的,而不是你操作过程中的某一个步骤

在开头就直接说你的目的是什么 ,然后再陈述你的问题。

经常遇到这样的情况:寻求帮助的人有更进一步的目的,只是在前进的过程中遇到了阻碍,他们提出的问题只针对当下的步骤。其实很有可能不是现在的这一步出了问题,而是你的路径根本就错了。

愚蠢的问题:我怎样才能让某图形程序的颜色拾取器取得十六进制的RGB值?

聪明的问题 :我正试着用自己选定数值的颜色替换一幅图片的色表,我现在知道的唯一方法是编辑每个表槽,但却无法让某图形程序的颜色拾取器取得十六进制的RGB值。

语句要清晰、正确、精炼且表达通顺

写东西粗心的人,思考和编程也好不到哪去。

花一点时间组织语言,使问题能够正确、清晰地表达出来。

如果你用英语提问,那你要注意拼写、标点和大小写,不要用“u”代替“you”这种简化。

如果你的英语水平不是特别好,在提问的时候可以加上这些。

  • English is not my native language; please excuse typing errors.
  • If you speak $LANGUAGE, please email/PM me; I may need assistance translating my question.
  • I am familiar with the technical terms, but some slang expressions and idioms are difficult for me.
  • I’ve posted my question in $LANGUAGE and English. I’ll be glad to translate responses, if you only use one or the other.

不要用无意义的话结束提问,比如你能帮助我吗或者这有答案吗? 。一般来说,避免用是或否 、对或错、 有或没有类型的问句。另外,无论你多着急,也不要在标题里面写“急求”“紧急”等词语。

解决问题后记得回复

问题解决之后向所有人发声明说明问题已经解决并感谢所有人。

方式是在标题里面加上已修正、已解决,这样做不但可以让可提供帮助的人不再浪费时间浏览你的问题,也可令有相同问题的人也会更加容易找到你。

之后写一个简单的总结,一个你好,原来时网络线出了问题,谢谢大家!就比什么都不说要好。也可以说一下问题是怎么解决的。

列出那些帮助过你的名字。

对于别人的回复

如果看不懂别人的回答,先不要急着回复提问,再执行一次提问之前的步骤。

如果还是不明白…

回复的时候要加上自己已经学到了什么。

对angularJS一些概念的理解

Veröffentlicht am 2017-02-22

angularJS是以MVC为设计模式的JS框架

MVC(Model View Controller)设计模式(design pattern)也可以理解成运行方式。每一个使用angularJS的程序都有这三个部分:

  • 模型/Model,这个部分说成是自建数据库的话会更容易理解;
  • 视图/View,就是显示的部分;
  • 控制器/Controller,软件代码控制Model和View之间的相互作用。

在学习html、css和JavaScript的过程中经常会看到framework、library这些词汇,笼统的讲,他们都是人们为了快速解决问题、避免简单重复的体力劳动而做的一些工具或加工到一定程度的原材料。

就好像你喜欢用豆腐做菜,可你并不需要每次都从种黄豆开始,已经有人做好了豆腐在那里卖,你只要拿过来直接用就可以了。

而framework和library的区别,我现在的理解是,framework是比library加工程度更深的原材料。如果framework是豆腐,那library就是做豆腐需要的原材料。你当然也可以使用做豆腐的原材料去做菜。

image

不过豆腐的例子不能很好的说明的一点是好莱坞原则。开脑洞的说就是,豆腐可以自己使用你准备好的东西如调味料、锅和铲子等把自己做成做成美味的菜肴。

初学git的一些基础知识

Veröffentlicht am 2017-02-22

版本控制

​ 提到git就不得不说版本控制,与git相关的系统都是版本控制系统,他们用于记录文件的更改以便随时可以返回需要的特定版本。它的发展历史,概括的说就是从可操作文件一个到多个,从单人工作到多人协同,从集中式到分布式。

git工作原理

​ git是一个DRCS(distributed revision control system),它来自偶然,产于赌气。git 的工作原理也是它与其他版本控制软件的本质区别,每一次提交都相当于一个快照,改动的文件做记录,未改动的文件做链接。如下图,每一个纵向的version就是一个快照。

Git stores data as snapshots of the project over time.

git工作流程

​ git有三种状态,Committed(已提交),Modified(已修改)和Staged(已暂存)。已提交指的是文件已经老老实实地躺在你的数据库里面了;已修改是指已经变动但是并没有提交;已暂存的标示你已经标记这一次修改,但是标记的快照并没有合并到你的数据库里面。三种状态分别对应git的三个工作区域:the Git directory(本地仓库), the working tree(工作目录), and the staging area(暂存区域)。

点击查看源网页

所以,当我们使用git 的时候,我们的工作流程是这样的:

  1. 修改工作目录中的文件;
  2. 标记快照暂存;
  3. 提交到库。

参考文件

http://ericsink.com/vcbe/html/history_of_version_control.html

https://git-scm.com/book/en/v2/Getting-Started-Git-Basics

12
John Doe

John Doe

17 Artikel
© 2017 John Doe
Erstellt mit Hexo
Theme - NexT.Muse