All posts by dotte

nodejs 快速入门

node.js开发指南.pdf

 

开篇:如果你还不知道Node.js是什么,那么你可以先看看这篇:Node.js 究竟是什么?或者任何关于它的介绍。

第一步:安装Node.js

Node官网下载安装包进行安装(这里使用的是Windows环境)

安装完成后进入cmd输入”node+ender“测试是否安装成功

PS:两次ctrl+c退出node

第二步:安装全局支持包

仍然是在cmd中输入以下命令(注意:一定要退出node)

npm install express@3.26 -g  //express是node中最常用的web框架,如果安装不了则更改镜像,命令:npm set registry http://registyr.npmjs.org

npm install nodemon -g //nodemon用于实时监听app.js文件

npm install grunt-cli -g  //grunt是一款任务构建工具,可以使用它完成自动编译/压缩等工作

npm install bower -g   //bower是一款页面引入文件管理工具

PS:npm是node的包管理器,使用它安装/卸载支持包非常方便

PS:安装完成后,均可以通过输入”包名称 – h“测试是否安装成功及查看使用帮助

第三步:创建Web项目

使用命令或手动在相应磁盘下创建用于放置项目的文件夹(cmd命令大全)

这里使用的是本机D盘下的apps文件夹

执行”express APPNAME“命令,进行项目创建(这里以TEST作为项目名称)

PS:public中是我们熟悉的images、javascript、CSS

PS:routes是路由文件

PS:views中视图文件,express默认使用的模板引擎是jade

第四步:完善项目架构

  使用任意的文本编辑器打开package.json文件,可以看到:

项目中已经有了express和jade,但我们想要完成项目,这些还远远不够,

我们会需要像watch、less、copy等等这样的包来进行辅助

你可以像我一样直接把它们全部写入到这个文件里,像这样:

当然:你也可以根据自己的需要,一个个进行安装,但记得在你的npm命令中不需要再使用 -g 了

好了,现在执行”cd appname && npm install“命令

PS:很明显,它的意思是进入项目的同时检测package.json文件安装里面列举出的所有包

  PS:这样是不是很省事儿,免去了一条条的npm install …命令

好的,接下来,你需要创建一个”Gruntfile.js“文件放在package.json的同级目录下,

你可以把这里的代码拷贝,做一些相应的改动即可

它用于控制那些需要执行的包,比如它们:

第五步:规范化前端引入文件

  前端总会因为各种原因,而需要引入一些文件支持

我们熟悉的就有jQueryBootstraphtml5shivrespond

这些文件愈多,当我们管理、更换版本时就愈不方便

这时,前面安装的bower就起到作用了,可以这么做:

在public文件夹下创建”bower.json“文件

它的写法就像这样:——代码你可以在bower官网首页找到

紧接着,再创建”.bowerrc“文件控制它们的存放目录(比如放到当前目录的libs文件夹下)

里面写上这么一条就行:

好嘞,现在在该目录下执行”cd public && bower install“命令

原理还是那样:进入public的同时检测bower.json文件,下载所有列举的文件,放入.bowerrc文件指定的目录

第六步:启动

使用cmd在app.js文件所在位置,执行”nodemon app.js“命令

这时,就可以在浏览器中输入 localhost:3000 来试试你的成果了

如果,你希望改动了某些文件(比如coffe、less等)后,会自动进行编译等操作,

那得再开启grunt的监听:

新开一个cmd,执行”grunt watch“命令,像这样:

PS:想要执行watch命令,一定要安装相应的包哦 ^_^

 

总结:在Node.js下搭建项目,难免会跟大量的包打交道,搞清楚它们的作用,按需使用。

参考:
How to install Node.js and NPM on Windows

Node.js Get Started and Miscellaneous

Basics of Node.js for MEAN Stack Development
from:http://www.cnblogs.com/prolifes/articles/3659623.html

Git快速入门

版本控制系统可以分为集中式(CVCS, Centralized Version Control System, 例如CVS、Subversion)和分布式(DVCS, Distributed Version Control System,例如Git)版本控制系统。

传统的集中式版本控制系统,本地只保存代码库的一个版本拷贝。 所有历史版本都保存在服务器。GIT 与之最大的不同是,本地不仅保存一个快照,而且保存着整个代码库(repository)。因此它可以“离线”工作。

GIT 使用 SHA-1 哈希码(40个字符)来标识提交,同时保证本次提交后整体(一个快照)的完整性。

文件状态分为:未跟踪 (untracked) 和已跟踪 (tracked),已跟踪又分为三种状态: 已暂存(staged),已修改(modified),已提交(committed)

一般过程如下:

1) 新建文件,该文件状态为“未跟踪”,位于工作区;

2) 用 git add a.txt  加入该文件,状态变为已跟踪的“已暂存”,位于暂存区;

3) 用 git commit a.txt -m “ha”  提交该文件,状态变为“已提交”,位于代码库(repository )。

当文件处于已跟踪的状态下,

4)编辑该文件并保存,状态变为“已修改”,位于工作区;

5) 重复步骤2、3,可提交代码至代码库。

我们创建一个测试项目来感受下如何通过命令行,使用Git对文件进行版本控制。

创建版本库

在多数版本控制系统,例如Subversion,工作目录与版本库是分开存放的。而在Git中,版本库(.git目录)是与工作目录树(Working Trees)并排放在同一个目录中的。

在Git中创建版本库,首先要决定把项目源代码存放在哪里。本例中,要创建一个简单的HTML页面,所以给这个项目取名为test。首先创建一个同名目录“test”,并进入到这个目录,然后输入命令git init。整个过程如下:

D:\test>git init

Initialized empty Git repository in D:/test/.git/

创建完成。从现在开始,这个Git版本库就可以用来记录和跟踪该项目的代码了。

添加初始文件

前面的操作已经创建了一个空版本库,现在该往里添加文件了。现在我们创建一个名为index.html的文件,并添加标题文本“Hello world”。详细内容如下:

<html>

<body>

<h1>Hello World!</h1>

</body>

</html>

创建了一个简单的HTML文件后,就可以开始跟踪版本了。我们会向这个文件不断添加更多的内容。要想让Git跟踪这个文件,须先让它知道这个文件要分两步走:首先使用git add命令把该文件添加到版本库的索引(index);然后使用git commit命令提交。

D:\test>git add index.html

D:\test>git commit -m “inital version”

[master (root-commit) 96707ef] inital version

1 file changed, 5 insertions(+)

create mode 100644 index.html

文件或文件列表可以作为git add命令的参数。

git commit命令创建一个提交记录。提交记录是存储在版本中的历史记录,每提交一次创建一个记录,并标记出代码的演进。Git把提交者的姓名和邮件地址,以及提交留言,都添加到提交记录中。

前面命令中参数-m的作用是,告诉Git本次提交的注释为initial version。对于任何版本控制系统,适当书写的提交留言都是极其重要的。它可以说明提交的原因:新添加的文件是做什么用的?修改那行代码的原因是什么?

现在我们已经提交了一个文件到版本库中。运行命令git log可以看到这个提交相关的信息:

D:\test>git log

commit 96707ef87920925b664ea3cafc5c4926bee20de8

Author: jag <jag@gmail.com>

Date:   Fri Sep 19 09:23:47 2014 +0800

inital version

命令git log运行后输出的第一行显示提交名称,该名称是Git自动产生的SHA-1码。Git通过它来跟踪提交。Git使用该哈希码可以保证每个提交的名称都是独一无二的。这在分布式的环境中非常重要。第二行是提交者的信息。第三行是提交日期。第四行是提交的注释。

用命令git commit显示的七位字符来表示一个提交,通常已经足够了,没有必要使用完整的40位哈希码。但是命令git log将显示完整的40位哈希码。

修改文件

下面开始学习怎样处理文件修改。

刚才的HTML文件里还没有<head>和<title>元素。下面为该文件添加这些元素:

<html>

<head>

<title>Hello World in Git</title>

</head>

<body>

<h1>Hello World!</h1>

</body>

</html>

修改完毕,Git可以检测到文件被修改。命令git status会显示工作目录树的状态,即当前的视图状态。Git中的工作目录树与Subversion和CVS中的工作拷贝差不多是一个概念。

D:\test>git status

On branch master

Changes not staged for commit:

(use “git add <file>…” to update what will be committed)

(use “git checkout — <file>…” to discard changes in working directory)

modified:   index.html

no changes added to commit (use “git add” and/or “git commit -a”)

上面的输出结果表明Git检测到了修改,但还不知道如何处理它们。修改过的文件在Changed but not updated下列出来,如果要提交,须要暂存(stage)修改。

暂存修改,以准备把修改提交到版本库。Git中有三个地方可以存放代码。第一个地方是工作目录树,编辑文件时可以直接在这里操作。第二个是索引(index),也就是暂存区(staging area)。暂存区是工作目录树和版本库之间的缓冲区。第三个是版本库。暂存区中存放的是准备提交到版本库中的修改。

回头看命令git add,它可以暂存对index.html刚刚做的修改。它跟前面添加一个新文件时使用的是同一个命令,只不过,这次它告诉Git要跟踪的是一个新的修改而非新的文件。

D:\test>git add index.html

D:\test>git status

On branch master

Changes to be committed:

(use “git reset HEAD <file>…” to unstage)

modified:   index.html

暂存修改过的index.html后,执行命令git status可以看到,输出信息中的标题从Changed but not updated变成了Changes to be committed。如果打开颜色开关,index.html这一行会由红色变为绿色。

使用命令git commit时,不要忘记使用带-m的参数,并在参数后面加上提交注释,以解释修改的原因。如下所示:

D:\test>git commit -m “add <head> and <title> to index”

[master 12e743e] add <head> and <title> to index

1 file changed, 3 insertions(+)

命令git log可以快速浏览提交的注释。

D:\test>git log

commit 12e743e19386b25ed22d8dc8ac49771233774e26

Author: jag <jag@gmail.com>

Date:   Fri Sep 19 09:57:54 2014 +0800

add <head> and <title> to index

commit 96707ef87920925b664ea3cafc5c4926bee20de8

Author: jag <jag@gmail.com>

Date:   Fri Sep 19 09:23:47 2014 +0800

inital version

获取历史文件

如果要获取某个老版本的文件,则可以使用git checkout命令,并指定文件名,如下所示:

D:\test>git checkout ed941ed97975757490256fb2b956c27d900e1059 index.html

一旦熟悉了以上命令后,我们使用GUI进行可视化操作时也将信手拈来,如下图所示:

在eclipse中也有相应的插件,如下图所示:

到目前为止,我们已经感受了如何使用Git,包括添加新文件、修改文件、查看版本库的历史记录等。

http://blog.sina.com.cn/s/blog_66e177dd0100j4rk.html
http://wangcong.org/blog/archives/283
git/github初级运用自如
git – 简明指南
图解Git
怎样使用 GitHub?
pro git  book

from:http://jag522.iteye.com/blog/2118196?utm_source=tuicool

 

协变(Covariance)与逆变(contravariance)

许多程序设计语言类型系统支持子类型。例如,如果CatAnimal的子类型,那么Cat类型的表达式可用于任何出现Animal类型表达式的地方。所谓的变型(variance)是指如何根据组成类型之间的子类型关系,来确定更复杂的类型之间(例如Cat列表之于Animal列表,回传Cat的函数之于回传Animal的函数…等等)的子类型关系。当我们用类型构造出更复杂的类型,原本类型的子类型性质可能被保持、反转、或忽略───取决于类型构造器英语type constructor的变型性质。例如在C#中:

  • IEnumerable<Cat>IEnumerable<Animal>的子类型,因为类型构造器IEnumerable<T>是协变的(covariant)。注意到复杂类型IEnumerable的子类型关系和其接口中的参数类型是一致的,亦即,参数类型之间的子类型关系被保持住了。
  • Action<Cat>Action<Animal>的超类型,因为类型构造器Action<T>是逆变的(contravariant)。(在此,Action<T>被用来表示一个参数类型为Tsub-T一级函数英语First-class function)。注意到T的子类型关系在复杂类型Action的封装下是反转的,但是当它被视为函数的参数时其子类型关系是被保持的。
  • IList<Cat>IList<Animal>彼此之间没有子类型关系。因为IList<T>类型构造器是不变的(invariant),所以参数类型之间的子类型关系被忽略了。

编程语言的设计者在制定数组、继承、泛型数据类等的类型规则时,必须将“变型”列入考量。将类型构造器设计成是协变、逆变而非不变的,可以让更多的程序俱备良好的类型。另一方面,程序员经常觉得逆变是不直观的;如果为了避免运行时期错误而精确追踪变型,可能导致复杂的类型规则。为了保持类型系统简单同时允许有用的编程,一个编程语言可能把类型构造器视为不变的,即使它被视为可变也是安全的;或是把类型构造器视为协变的,即使这样可能会违反类型安全。

在一门程序设计语言的类型系统中,一个类型规则或者类型构造器是:

  • 协变(covariant),如果它保持了子类型序关系≦。该序关系是:子类型≦基类型。
  • 逆变(contravariant),如果它逆转了子类型序关系。
  • 不变(invariant),如果上述两种均不适用。

C#

Java

Scala

Arrays covariance

+

(unsafe at runtime)

+

(unsafe at runtime)

_

(arrays are invariant by design)

Though, there is support for Java’s “covariant” arrays, of course.

Arrays contravariance

_

_

_

Generics variance

(covariance/contravariance)

+

Defined by a generic type creator (definition-site).

(Restricted to generic interfaces and generic delegates)

+

Defined by clients of generic type using wildcards (use-site).

+

Defined by a generic type creator (definition-site).

Also, there are existential types that cover Java’s wildcards functionality.

Overriding: return type covariance

_

+

+

Overriding: parameter type contravariance

_

_

_

【参见】

Covariance and contravariance http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

http://zh.wikipedia.org/wiki/%E9%A1%9E%E5%9E%8B%E7%B3%BB%E7%B5%B1

Comparing covariance/contravariance rules in C#, Java and Scala
http://www.codeproject.com/Articles/899319/Comparing-covariance-contravariance-rules

 

P NP问题理解

P和NP的定义

要理解P和NP问题,让我们首先来看看P和NP的定义:

P: The complexity class of decision problems that can be solved on a deterministic Turing machine in polynomial time.

NP: The complexity class of decision problems that can be solved on a non-deterministic Turing machine in polynomial time

翻译一下就是:

P类问题是指确定型图灵机可以在多项式时间内解决的问题

NP类问题是指非确定型图灵机可以在多项式时间内解决的问题

关键词:确定型/非确定型图灵机、多项式时间,要理解P和NP问题,还得先搞清楚这两个关键词的含义。

多项式时间

要理解多项式时间,把多项式时间指数时间一起看会比较容易理解

多项式时间: m(n) = O(n^k),k为常数

指数时间: m(n) = O(k^n),k为大于1的常数

之前一直理解错误,认为O(n^2)这种属于指数时间。

确定型和非确定型图灵机

图灵机是一个抽象模型,由以下几个组成部分:

  1. 一条无限长的纸带
  2. 一个读写头,可以在纸带上左右移动并读写内容
  3. 一个状态寄存器,用来存储图灵机当前的状态
  4. 一套控制规则,根据图灵机当前状态和纸带当前内容来确定下一步操作

简直就是一个终极简化版的计算机,或者可以认为是一个状态机+input/output。这是确定型状态机,一般我们提到图灵机就是指这个。

而非确定型图灵机和确定型图灵机只有一点差别,就是:控制规则这里,根据当前状态和纸带内容确定下一步操作的时候,都可能有N个分支,N个分支中只有一个可以得到最终结果或者告知输入有错。

而对于确定型图灵机,特定的状态和纸带内容,下一步操作只能有一个。

理解P和NP

看完P和NP、多项式时间和指数时间的定义,了解了什么是确定型和非确定型图灵机,现在对理解P和NP还是没有太直观的感觉。

那么再看看NP的另外一个定义:

the class NP consists of all those decision problems whose positive solutions can be verified in polynomial time given the right information, or equivalently, whose solution can be found in polynomial time on a non-deterministic machine.

翻译一下就是:

NP类问题是指 解的正确性可以在多项式时间内(在确定型图灵机上)被验证的决定性问题,或者说,在非确定型图灵机上可以在多项式时间内求解的问题

这里涉及到一个新概念:决定性问题。那让我们先来了解一下什么是决定性问题。

决定性问题是指那些可以用是或者否可以回答的问题,比如:

x可以被y整除吗?

x是质数吗?

从A点到B点有长度小于10的路径吗?

与决定性问题相对应的是功能性问题function problem,这类问题的答案不能是简单的YES or NO,比如:

x除以y的商和余数是多少?

x的质因子有哪些?

从A点到B点最短的路径是什么?

因为已经存在标准的方法可以将功能性问题和决定性问题相互转化而且不会显著改变其计算的复杂度,因此,计算性的理论性研究集中在决定性问题上面。

Wiki 原文如下:

There are standard techniques for transforming function and optimization problems into decision problems, and vice versa, that do not significantly change the computational difficulty of these problems. For this reason, research in computability theory and complexity theory have typically focused on decision problems.

这一句很重要:

已经存在标准的方法可以将功能性问题和决定性问题相互转化而且不会显著改变其计算的复杂度

因为后面在举例说明NP问题的时候,我们需要将问题先转化为决定性问题。

比如背包问题

有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

改为决定性问题可以是:

有N件物品和一个容量为W的背包。第i件物品的费用是w[i],价值是v[i]。在总容量不超过W的情况下,总价值能否达到V?

对于改为决定性问题后的背包问题我们要验证一个解是不是正确的,很简单,只要把一个解的总容量和价值算出来,看看是否满足总容量小于等于W且总价值大于等于V。O(n)时间(多项式时间)内可以验证,所以它属于NP类问题(解的正确性在多项式时间内被验证)。

但是如果我们要计算这个解呢?如果有个算法可以在多项式时间内计算出在总容量不超过V的情况下,总价值能否达到V?这个问题的解,那么这就是P类问题了。这个算法目前还没找到,找到就不得了,因为背包问题还是个NPC问题,如果这个问题被证明为P类问题,那么就可以证明NP=P了。至于什么是NPC问题,下次再仔细掰扯掰扯~

from:http://www.708luo.com/posts/2014/12/p-np/

How to Install WordPress Manually

It is not necessary to manually install WordPress as it can be quickly installed via QuickInstall, however, if you are having trouble with this method, this article will cover the steps needed to install WordPress manually.

Step 1: Download WordPress

  1. Download the WordPress package to your local computer from http://wordpress.org/download/.
  2. Unzip the downloaded file to a folder on your local computer.

Step 2: Upload WordPress to Hosting Account

 

There are three available options for uploading WordPress to a hosting account.

 

Step 3: Create MySQL Database and User

WordPress stores its information in a database. Therefore, a database will need to be created.

  1. Log into cPanel.
  2. In the Databases section, click the MySQL Database Wizard icon.
  3. For Step 1: Create A Database, enter the database name and click Next Step.
  4. For Step 2: Create Database Users, enter the database user name and password and click Create User.
  5. For Step 3: Add User to the Database, click the All Privileges checkbox and click Next Step.
  6. For Step 4: Complete the task, make note of the database name, username and password, as you will need them for Step 4See Below below.

Step 4: Configure wp-config.php

The wp-config-sample.php file contains the database information and tells the WordPress application which database to pull information from. This step must be completed to ensure the correct database information is associated with the WordPress installation.

The wp-config-sample.php file can be found in File Manager in the folder where WordPress is installed. To modify the file:

  1. Log into cPanel.
  2. In the Files section, click the File Manager icon.
  3. In the pop-up box, select Web Root and check the box  for Show Hidden Files (dotfiles), then click Go.

    If you don’t see the pop-up box, you may have selected the “Skip this question, and always open this directory in the future when opening File Manager” option.

    To make the pop-up reappear, simply click reset all interface settings at the very bottom of your cPanel.

  4. From the left navigation menu in File Manager, click public_html to expand the folder.
  5. Click the folder containing the WordPress installation.
  6. On the right side of the File Manager screen, locate the wp-config-sample.php file.
  7. Right click on the file, select Rename and change the name of the file to wp-config.php. Click the Rename File button.
  8. Right-click on the wp-config.php file and select Code Edit. When the file opens, look for the following information:

    define(‘DB_NAME’, ‘database_name_here’);

    /** MySQL database username */
    define(‘DB_USER’, ‘username_here’);

    /** MySQL database password */
    define(‘DB_PASSWORD’, ‘password_here’);

    1. Replace database_name_here with the name of the database you created (above in Step 3: Create MySQL Database and User See Below).
    2. Replace username_here with the username of the database you created.
    3. Replace password_here with the password of the database that you created.
  9. When done editing, click the Save Changes button, then close the file.

Step 5: Run the Installation

Open a new browser window and go to the installation page to run the installation script. Depending on where you installed the script, you will find it at either of the following URLs:

http://yourdomain.com/wp-admin/install.php

http://yourdomain.com/blog/wp-admin/install.php

Be sure to replace yourdomain.com in the example above with your actual domain name.

You should now see a welcome page that says “Welcome to the famous five minute WordPress installation process!”

Step 6: Complete the Installation

On this page, fill in the fields for:

  • Site Name
  • Username
  • Password (needs to be entered twice)
  • Email address (login information will be sent to this email address)
  • Select whether or not to have the search engines index the site

Click Install Now, and you should be taken to the final screen, showing the following message:

Success! WordPress has been installed.

from:http://support.hostgator.com/articles/specialized-help/technical/wordpress/how-to-install-wordpress-manually

refer:http://code.tutsplus.com/tutorials/beginning-with-wordpress-installing-wordpress-manually–wp-32372

http://www.360doc.com/content/08/0107/04/12542_951370.shtml