提问的智慧

转:http://www.dianbo.org/9238/stone/tiwendezhihui.htm

在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。

  首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。 如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言,“问得好!”是发自内心的大力称赞。

  尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。

  我们不想掩饰对这样一些人的蔑视–他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间–他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。 我们称这样的人为“失败者”(由于历史原因,我们有时把它拼作“lusers”)。

  我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。

  如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要求你向我们屈服–事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿意帮助自己的人是没有 意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商业公司签个技术支持协议得了,别向黑客乞求帮助。

  如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得到有效答案的最好方法,就是象胜利者那样提问 —— 聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。

  (欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com,然而 请注意,本文并非网络礼节的通用指南,我通常会拒绝无助于在技术论坛得到有用答案的建议。) (当然,如果你写中文,最好还是寄DHGrand@hotmail.com;-)

= 提问之前 =

  在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:

  1. 通读手册,试着自己找答案。
  2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
  3. 在网上搜索(个人推荐google~~~)。
  4. 向你身边精于此道的朋友打听。

  当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。如果提问者能从答案中学到东西,我们更乐于回答他的问题。

  周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。

  小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random Hacker)通常会用无意义的字面解释来答复你,心里想着“蠢问题…”,希望着你会从问题的回答(而非你想得到的答案)中汲取教训。

  决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你要自己去“挣”回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题–一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识–去挣到这个答案。

  另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”比“请把确切的过程贴出来”更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力和决心。

= 怎样提问 =

  • 谨慎选择论坛
      小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:
  1. 在风马牛不相及的论坛贴出你的问题
  2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
  3. 在太多的不同新闻组交叉张贴
  • 用辞贴切,语法正确,拼写无误
      我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。 回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。

  正确的拼写,标点符号和大小写很重要。
  更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。

  如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错–但决不能在思考上马虎(没错,我们能弄清两者的分别)

  • 使用含义丰富,描述准确的标题
      在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力 的黄金时机。别用喋喋不休的“帮帮忙”(更别说“救命啊!!!!!”这 样让人反感的话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们, 别用空格代替问题的描述,哪怕是极其简短的描述。

  蠢问题: 救命啊!我的膝上机不能正常显示了!
  聪明问题: XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。

  如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起来象“Re:测试”或者“Re:新bug”的问题很难引起足够重视。另外,引用并删减前文的内容,给新来的读者留下线索。

  • 精确描述,信息量大
  1. 谨慎明确的描述症状。
  2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
  3. 说明你在提问前是怎样去研究和理解这个问题的。
  4. 说明你在提问前采取了什么步骤去解决它。
  5. 罗列最近做过什么可能有影响的硬件、软件变更。

  尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。

  Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。

  • 话不在多
      你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。

  这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得 到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼 你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。

  • 只说症状,不说猜想
      告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自己的理解和推论。让黑客们来诊断吧。

蠢问题: 我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好?
聪明问题: 我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种情况,开机 前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。所有 内存都换过了,没有效果。相关部分的典型编译记录如下…。

  • 按时间顺序列出症状
      对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明 应该包含操作步骤,以及电脑的反应,直到问题产生。

  如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间顺序详述。这样黑客们就知道该在你的说明中找什么。

  • 明白你想问什么
      漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒,因此也可以说他们对漫无边际的提问不大感冒。

  如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是别的),就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答者集中精力来帮你,这很凑效。要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。

  因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助–这通常和简化问题有所区别。因此,问“我想更好的理解X,能给点提示吗?”通常比问“你能解释一下X吗?”更好。如果你的代码不能工作,问问它有什么地方不对,比要求别人替你修改要明智得多。

  • 别问应该自己解决的问题
      黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。

  • 去除无意义的疑问
      别用无意义的话结束提问,例如“有人能帮我吗?”或者“有答案吗?”。 首先:如果你对问题的描述不很合适,这样问更是画蛇添足。其次:由于这 样问是画蛇添足,黑客们会很厌烦你–而且通常会用逻辑上正确的回答来表 示他们的蔑视,例如:“没错,有人能帮你”或者“不,没答案”。

  • 谦逊绝没有害处,而且常帮大忙
    彬  彬有礼,多用“请”和“先道个谢了”。让大家都知道你对他们花费时间义务提供帮助心存感激。然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。

  (我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得“先谢了”的言外之意是过后就不会再感谢任何人了。我们的建议是:都道谢。)

  • 问题解决后,加个简短说明
      问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个补充说明。补充说明不必很长或是很深入;简单的一句“你好,原来是网线出了问题!谢谢大家–Bill”比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。如果你自己不是老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。

  • 还是不懂
      如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,记得表现出你已经学到了点什么。比方说,如果我回答你:“看来似乎是zEntry被阻塞了;你应该先清除它。”,然后:一个很糟的后续问题:“zEntry是什么?” 聪明的问法应该是这样:“哦~~~我看过帮助了但是只有-z和-p两个参数中提到了zEntry而且还都没有清楚的解释:<你是指这两个中的哪一个吗?还是我看漏了什么?”

= 三思而后问 =

以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:

问题:我能在哪找到X程序?
问题:我的程序/配置/SQL申明没有用
问题:我的Windows有问题,你能帮我吗?
问题:我在安装Linux(或者X)时有问题,你能帮我吗?
问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?

提问:我能在哪找到X程序?
回答:就在我找到它的地方啊蠢货–搜索引擎的那一头。天呐!还有人不会用Google吗?

提问:我的程序(配置、SQL申明)没有用
回答:这不算是问题吧,我对找出你的真正问题没兴趣–如果要我问你二十个问题才找得出来的话–我有更有意思的事要做呢。

在看到这类问题的时候,我的反应通常不外如下三种:

  1. 你还有什么要补充的吗?
  2. 真糟糕,希望你能搞定。
  3. 这跟我有什么鸟相关?

提问:我的Windows有问题,你能帮我吗?
回答:能啊,扔掉萎软的垃圾,换Linux吧。

提问:我在安装Linux(或者X)时有问题,你能帮我吗?
回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的Linux用户组寻求手把手的指导吧(你能在这儿找到用户组的清单)。

提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!

= 好问题,坏问题 =

  最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。

蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?
// 这种问法无非想得到“STFW”这样的回答。

聪明问题:我用Google搜索过“Foonly Flurbamatic 2600”,但是没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料?
// 这个问题已经STFW过了,看起来他真的遇到了麻烦。

蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?
// 他觉得都是别人的错,这个傲慢自大的家伙

聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ,但里面没有提到跟Nulix有关的问题。这是我编译过程的记录,我有什么做得不对的地方吗?
// 他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任推到别人头上,这个家伙值得留意。

蠢问题:我的主板有问题了,谁来帮我?
// 普通黑客对这类问题的回答通常是:“好的,还要帮你拍拍背和换尿布吗?” ,然后按下删除键。

聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了A、B和C。请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。在多处理器主板上引起边带泄漏的通常原因是什么?谁有好主意接下来我该做些什么测试才能找出问题?
// 这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等天上掉答案。

  在最后一个问题中,注意“告诉我答案”和“给我启示,指出我还应该做什么诊断工作”之间微妙而又重要的区别。事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。我(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决那一问题的重要信息。

  通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论 –译者注)运作得非常出色的时候,一个Linux内核邮件列(lkml)成员表示,问题得到解决并非由于我是这个列表中的“名人”,而是因为我用了正确的方式来提问。我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,给编写这个指南的人一些指导。

= 找不到答案怎么办 =

  如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。

  总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。

  你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。

  另外,你可以向很多商业公司寻求帮助,不论公司大还是小(Red Hat 和LinuxCare 就是两个最常见的例子)。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了–完全可能如此–你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。

  对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开放源代码软件要高得多,且内容也不那么丰富)。

Copyright (C) 2001 by Eric S. Raymond
中文版 Copyleft 2001 by D.H.Grand(nOBODY/Ginux)
英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html
感谢 Eric 的耐心指点和同意,本文才得以完成并发布,
本指南 英文版版权为 Eric Steven Raymond 所有,
中文版版权由 D.H.Grand[nOBODY/Ginux] 所有

https ssl/tls

转:https://program-think.blogspot.com/2016/09/https-ssl-tls-3.html

★密钥交换/协商机制要达到啥目的?

  前一篇介绍了 SSL/TLS 的身份认证机制。这个机制是为了防止攻击者通过【篡改】网络传输数据,来假冒身份,以达到“中间人攻击/MITM”的目的。
  而今天要聊的“密钥协商机制”是:(在身份认证的前提下)如何规避【偷窥】的风险。
  通俗地说,即使有攻击者在偷窥你与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个用来加密应用层数据的密钥(也称“会话密钥”)。

★密钥交换/协商机制的几种类型

  俺总结了一下,大致有如下几种类型:

◇依靠非对称加密算法

  原理:
  拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。

  举例:
  RSA

◇依靠专门的密钥交换算法

  原理:
  这个原理比较复杂,一两句话说不清楚,待会儿聊到 DH 的那个章节会详谈。

  举例:
  DH 算法及其变种

◇依靠通讯双方事先已经共享的“秘密”

  原理:
  既然双方已经有共享的秘密(这个“秘密”可能已经是一个密钥,也可能只是某个密码/password),只需要根据某种生成算法,就可以让双方产生相同的密钥(并且密钥长度可以任意指定)

  举例:
  PSK 和 SRP(可能很多同学没听过这俩玩意儿。别担心,本文后续部分有介绍)

★基于 RSA 的密钥协商

◇概述

  这大概是 SSL 最古老的密钥协商方式——早期的 SSLv2 只支持一种密钥协商机制,就是它。(前一篇)介绍身份认证重要性的时候,也是拿 RSA 来演示。
  RSA 是一种【非】对称加密算法。在本系列第1篇的背景知识介绍中,已经聊过这种算法的特点——加密和解密用使用【不同的】密钥。并且“非对称加密算法”既可以用来做“加密/解密”,还可以用来做“数字签名”。

◇密钥协商的步骤

  (下列步骤只阐述原理,具体的协议细节在下一篇讲)

  1. 客户端连上服务端
  2. 服务端发送 CA 证书给客户端
  3. 客户端验证该证书的可靠性
  4. 客户端从 CA 证书中取出公钥
  5. 客户端生成一个随机密钥 k,并用这个公钥加密得到 k’
  6. 客户端把 k’ 发送给服务端
  7. 服务端收到 k’ 后用自己的私钥解密得到 k
  8. 此时双方都得到了密钥 k,协商完成。

◇如何防范偷窥(嗅探)

  攻击方式1
  攻击者虽然可以监视网络流量并拿到公钥,但是【无法】通过公钥推算出私钥(这点由 RSA 算法保证)

  攻击方式2
  攻击者虽然可以监视网络流量并拿到 k’,但是攻击者没有私钥,【无法解密】 k’,因此也就无法得到 k

◇如何防范篡改(假冒身份)

  攻击方式1
  如果攻击者在第2步篡改数据,伪造了证书,那么客户端在第3步会发现(这点由证书体系保证)

  攻击方式2
  如果攻击者在第6步篡改数据,伪造了k’,那么服务端收到假的k’之后,解密会失败(这点由 RSA 算法保证)。服务端就知道被攻击了。

★基于 DH 的密钥协商

◇概述

  DH 算法又称“Diffie–Hellman 算法”。这是两位数学牛人的名称,他们创立了这个算法。该算法用来实现【安全的】“密钥交换”。它可以做到——“通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥”。这句话比较绕口,通俗地说,可以归结为两个优点:

  1. 通讯双方事先【不】需要有共享的秘密。
  2. 用该算法协商密码,即使协商过程中被别人全程偷窥(比如“网络嗅探”),偷窥者也【无法】知道协商得出的密钥是啥。

  但是 DH 算法本身也有缺点——它不支持认证。也就是说:它虽然可以对抗“偷窥”,却无法对抗“篡改”,自然也就无法对抗“中间人攻击/MITM”(在本系列的前一篇,俺已经强调过了——缺乏身份认证,【必定会】遭到“中间人攻击/MITM”)。
  为了避免遭遇 MITM 攻击,DH 需要与其它签名算法(比如 RSA、DSA、ECDSA)配合——靠签名算法帮忙来进行身份认证。当 DH 与 RSA 配合使用,称之为“DH-RSA”,与 DSA 配合则称为“DH-DSA”,以此类推
  反之,如果 DH 【没有】配合某种签名算法,则称为“DH-ANON”(ANON 是洋文“匿名”的简写)。此时会遭遇“中间人攻击/MITM”。(具体的中间人攻击手法,可以参见本系列前一篇)

  关于该算法的更多介绍,可以参见维基百科(这个条目)。

◇数学原理

  (如果你属于那种“看了数学公式就犯晕的人”,可以直接略过本小节,不影响你看后续的章节)

  从概念上讲:DH 依赖的是:求解“离散对数问题”的复杂性。具体的算法如下:
  通讯双方(张三、李四)需要先约定好算法参数(algorithm parameters):一个素数 p 作为模数,一个素数 g 作为基数(g 也称为“生成元”)。这两个算法参数是可以对外公开滴。
  对于张三而言,需要先想好一个秘密的自然数 a 作为私钥(不能公开),然后计算 A = ga mod p 作为自己的公钥(可以公开)。
  对李四而言也类似,先想好一个秘密的自然数 b 作为私钥(不能公开),然后计算 B = gb mod p 作为自己的公钥(可以公开)。
  张三和李四互相交换各自的公钥。
  然后张三计算出 k = Ba mod p,李四计算出 k = Ab mod p

  该算法至少确保了如下几点:

  1. 张三和李四分别计算出来的 k 必定是一致的
  2. 张三和李四都无法根据已知的数来推算出对方的私钥(张三无法推算出 b,李四无法推算出 a)
  3. 对于一个旁观者(偷窥者),虽然能看到 p,g,A,B,但是无法推算出 a 和 b(就是说,旁观者无法推算出双方的私钥),自然也无法推算出 k

  举例
  前面说得都是符号,比较抽象。下面拿具体数字举例:
假设约定的算法参数:模数是 97,基数是 3
张三用的私钥是 6,李四用的私钥是 21,用 python 代码演示如下(python 语言用两个连续星号表示“幂运算”,用百分号表示“取模运算”):
p = 97
g = 3

a = 6
b = 21

A = (ga) % p
B = (g
b) % p

print((Ba) % p) # 47
print((A
b) % p) # 47
  最后打印出来的两个 47 就是双方都计算出了【相同的】结果(这个数值可以用作之后的“会话密钥”)

  上面因为是举例,用的数字都比较小。在实战中需要注意如下几点,以降低被攻击的风险。

  1. p 必须是质数且足够大(至少300位)
  2. a,b 也要足够大(至少100位),且必须是随机生成。
  3. g 必须是质数,【不】需要很大,比如 2 或 3 或 5 都可以。g 如果太大并【不能】显著提升安全性,反而会影响性能。

◇密钥协商的步骤

  (下列步骤只阐述原理,具体的协议细节在下一篇讲)

  1. 客户端先连上服务端
  2. 服务端生成一个随机数 s 作为自己的私钥,然后根据算法参数计算出公钥 S(算法参数通常是固定的)
  3. 服务端使用某种签名算法把“算法参数(模数p,基数g)和服务端公钥S”作为一个整体进行签名
  4. 服务端把“算法参数(模数p,基数g)、服务端公钥S、签名”发送给客户端
  5. 客户端收到后验证签名是否有效
  6. 客户端生成一个随机数 c 作为自己的私钥,然后根据算法参数计算出公钥 C
  7. 客户端把 C 发送给服务端
  8. 客户端和服务端(根据上述 DH 算法)各自计算出 k 作为会话密钥

◇如何防范偷窥(嗅探)

  嗅探者可以通过监视网络传输,得到算法参数(模数p,基数g)以及双方的公钥,但是【无法】推算出双方的私钥,也【无法】推算出会话密钥(这是由 DH 算法在数学上保证的)

◇如何防范篡改(假冒身份)

  攻击方式1
  攻击者可以第4步篡改数据(修改算法参数或服务端公钥)。但因为这些信息已经进行过数字签名。篡改之后会被客户端发现。

  攻击方式2
  攻击者可以在第7步篡改客户端公钥。这步没有签名,服务端收到数据后不会发现被篡改。但是,攻击者篡改之后会导致“服务端与客户端生成的会话密钥【不一致】”。在后续的通讯步骤中会发现这点,并导致通讯终止。
  (下一篇讲具体协议的时候会提到:协议初始化/握手阶段的末尾,双方都会向对方发送一段“验证性的密文”,这段密文用各自的会话密钥进行【对称】加密,如果双方的会话密钥不一致,这一步就会失败,进而导致握手失败,连接终止)

★DH 的变种

◇基于“椭圆曲线”的 ECDH

  DH 算法有一个变种,称之为 ECDH(全称是“Elliptic Curve Diffie-Hellman”)。维基条目在“这里”
  它与 DH 类似,差别在于:
DH 依赖的是——求解“离散对数问题”的困难。
ECDH 依赖的是——求解“椭圆曲线离散对数问题”的困难。

  ECDH 的数学原理比 DH 更复杂。考虑到本文读者大都【不是】数学系出身,俺就不展开了。
  ECDH 跟 DH 一样,也是【无认证】的。同样需要跟其它签名算法(比如 RSA、DSA、ECDSA)配合。

◇对 DH 和 ECDH 进行“临时密钥”的改良——DHE 和 ECDHE

  刚才介绍的 DH 和 ECDH,其密钥是持久的(静态的)。也就是说,通讯双方生成各自的密钥之后,就长时间用下去。这么干当然比较省事儿(节约性能),但是存在某种安全隐患——无法做到“前向保密”(洋文是“forward secrecy”)。
  为了做到“前向保密”,采用“临时密钥”(洋文是“ephemeral key”)的方式对 DH 和 ECDH 进行改良。于是得到两种新的算法——DHE 和 ECDHE。(这两种新算法的名称,就是在原有名称后面加上字母 E 表示 ephemeral)。其实算法还是一样的,只是对每个会话都要重新协商一次密钥,且密钥用完就丢弃。
  (估计很多同学不太了解“前向保密”这个概念。俺会在本系列中单独开一帖,介绍“前向保密”的概念及其好处)

★基于 PSK 的密钥协商

◇概述

  PSK 是洋文“Pre-Shared Key”的缩写。顾名思义,就是【预先】让通讯双方共享一些密钥(通常是【对称加密】的密钥)。所谓的【预先】,就是说,这些密钥在 TLS 连接尚未建立之前,就已经部署在通讯双方的系统内了。
  这种算法用的不多,它的好处是:

  1. 不需要依赖公钥体系,不需要部属 CA 证书。
  2. 不需要涉及非对称加密,TLS 协议握手(初始化)时的性能好于前述的 RSA 和 DH。
      更多介绍可以参见维基百科,链接在“这里”。

◇密钥协商的步骤

(由于 PSK 用的不多,下面只简单介绍一下步骤,让大伙儿明白其原理)

  在通讯【之前】,通讯双方已经预先部署了若干个共享的密钥。
  为了标识多个密钥,给每一个密钥定义一个唯一的 ID
  协商的过程很简单:客户端把自己选好的密钥的 ID 告诉服务端。
  如果服务端在自己的密钥池子中找到这个 ID,就用对应的密钥与客户端通讯;否则就报错并中断连接。

◇如何防范偷窥(嗅探)

  使用这种算法,在协商密钥的过程中交换的是密钥的标识(ID)而【不是】密钥本身。
  就算攻击者监视了全过程,也无法知晓密钥啥。

◇如何防范篡改(假冒身份)

  PSK 可以单独使用,也可以搭配签名算法一起使用。
  对于单独使用
  如果攻击者篡改了协商过程中传送的密钥 ID,要么服务端发现 ID 无效(协商失败),要么服务端得到的 ID 与客户端不一致,在后续的通讯步骤中也会发现,并导致通讯终止。
  (下一篇讲具体协议的时候会提到:协议初始化/握手阶段的末尾,双方都会向对方发送一段“验证性的密文”,这段密文用各自的会话密钥进行【对称】加密,如果双方的会话密钥不一致,这一步就会失败,进而导致握手失败,连接终止)

  对于搭配签名算法
  如果攻击者篡改了协商过程中传送的密钥 ID,验证签名会失败

◇补充说明

  PSK 与 RSA 具有某种相似性——既可以用来搞“密钥协商”,也可以用来搞“身份认证”。
  所以,PSK 可以跟 DH(及其变种)进行组合。例如:DHE-PSK、ECDHE-PSK
  关于 PSK 的更多细节,可以参见 RFC4279

★基于 SRP 的密钥协商

◇概述

  SRP 是洋文“Secure Remote Password”的缩写。这个算法有点类似于刚才提到的 PSK——只不过 client/server 双方共享的是比较人性化的密码(password)而不是密钥(key)。该算法采用了一些机制(盐/salt、随机数)来防范“嗅探/sniffer”或“字典猜解攻击”或“重放攻击”。
  这个算法应该用得很少——OpenSSL 直到2012年才开始支持该算法。所以俺这里就不展开了。有兴趣的同学可以去看 RFC2945 的协议描述。

◇密钥协商的步骤

  (由于 SRP 用的不多,俺偷懒一下,略去此小节)

★各种组合的一览表

vue

从ng转站vue已经一个星期了,在这里记录自己学习经历

读文档

第一步 通读文档,因为有中文文档所以难度大大减小,不过的提一句 vue的社区很山寨,qq群付费,相对于ng群太少了,总结社区不活跃,曾经想加一个,问的是作者名字的三个字母,那时候我真不太清楚,好吧有点水,但我知道他是中国人,之后我就回 本是同根生,相煎何太急,就给我拒了,太没情怀了,算了我也就懒得加了,一直活跃在ng社区,虽然是ng但是不排斥其他框架我们什么都讨论。我是来安利的~

练习

可以从 vue/example/todomvc开始 只有几个文件 来感受一下,如果你能直接上手也行,对于具体业务对vue的了解更直观。

读前人的博客

这很有帮助相信我,站在巨人的肩膀上总能看的更远

总结:多读,多看,多写,至于问不问你自己考量

从ng转站vue第二个星期了(16.4.16)

上手项目是最快的学习途径

目前的重点转到了业务处理上,在购物车页进行实践,和ng的处理方式大同小异

他们两者都是采用双向绑定,只是实现原理不同,采用一个源数据控制页面

他们也有相同问题 双括号 ,ng使用ng-bind,vue中v-bind却不是这么用的,你可以用v-text or v-html

绑定到页面上

目前不足并要做的

  1. 一切皆组件,这是一种理念,就像ng,dom操作要放在指令中
  2. 最佳实践,我决定取扒别人的源码,目前的代码都是屎一样放到一个vue文件里

编辑器推荐

经过今天的尝试,目前支持最好的是atom,vscode 最差,sublime没试过,不过应该和atom不相上下

  1. atom
  2. webstorm
  3. vs code

总结:

  1. 文档一定要熟(个人绝得文档还不够详细)
  2. 看大量博客(会越来越多)
  3. 看视频(找找还是有的)学习实践经验 (非熟手)

从ng转站vue第三个星期了(16.4.25)

ps: 之前没想通travis的好处,现在好像发现了,让我试试~ OK的不需要自己装环境,但是如果构建失败就麻烦了

坑集

  1. checkbox 区分对象与字符串

    1
    <input type="checkbox" id="inlineCheckbox2" class="px" v-model="addr.isDefault" v-bind:true-value="'y'" v-bind:false-value="'n'">
  2. 驼峰命名法

居然隔了一个月(16.5.27)

一直忙于业务花了好长时间不停的改bug,测试都无语了,没改一个bug总会引入其他的,这都是不可预测的,想想引入测试但是真能有作用吗?总得试试
今天又填了一个大坑 vue 的驼峰命名法,说实在的如果是以前我应该很快就能定位问题,事实上在本地都可以,只是报警告,但到了预发环境就会出问题~
还有keep-live 也是个大坑,谢天谢地总算把图片轮播这一块解决了,之后就是组件抽离和测试了

开启 HTML5 History 模式

  1. 原来的请求都将失效
变化 开启前 开启后
url http://192.168.1.121:8080/#!/mine 5http://192.168.1.121:8080/mine
必须含有#! 不包含#!
main.js var router = new VueRouter() var router = new VueRouter({hashbang:true,history: true,saveScrollPosition: true,transitionOnLoad: true})
history 不开启 开启
scroll 不记录位置信息 记录位置信息

Hexo使用攻略

转载:http://ijiaober.github.io/categories/hexo/

(一)Hexo简介

你可能需要一个方便的工具来记录思想、整理笔记、表述观点,并且传播给更多的人。Hexo就是一个不错的工具。
Hexo,是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在github和Heroku上。
引用官方的话,hexo:

1
2
快速、简单且功能强大的 Node.js 博客框架。
A fast, simple & powerful blog framework, powered by Node.js.

我们可以用hexo创建自己的博客,托管到github或Heroku上,绑定自己的域名,用markdown写文章。本博客即使用hexo创建并托管在github上。

为什么要用Hexo

不可思议的快速 ─ 只要一眨眼静态文件即生成完成
支持 Markdown
仅需一道指令即可部署到 GitHub Pages 和 Heroku
已移植 Octopress 插件
高扩展性、自订性
兼容于 Windows, Mac & Linux

谁能使用Hexo

这是一个免费开源的博客程序,任何人都可以使用和修改。但是不同于wordpress,hexo由于需要使用Github,Git,Markdown,Node.js这样的工具,好多插件、widget都需要自己安装、设置。所以适合那些有一定计算机基础,喜欢折腾的人。但是,不要担心,只要跟着本教程走,就能很方便地让你熟练的使用起来。
Hexo

(二)Hexo安装和部署

详见:hexo搭建转载

(三)Hexo的配置和使用

基本配置

在Hexo中,有两个配置文件,一个是用来配置整站信息的,位于项目更目录下的_config.yml文件。另外一个是对主题的配置,位于themes目录下你所采用的主题目录里,文件名同样是_config.yml。
首先,我们来看第一个配置文件,整站信息配置:

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
76
# Hexo Configuration

1. Docs: http://hexo.io/docs/configuration.html
2. Source: https://github.com/hexojs/hexo/
# Site 这里的配置,哪项配置反映在哪里,可以参考我的博客
title: GoonX #站点名,站点左上角
subtitle: 我走的很慢,但我从不后退。 #副标题,站点左上角
description: GoonX #给搜索引擎看的,对站点的描述,可以自定义
author: ijiaober #默认在站点左下角可以看到
email: ijiaober@qq.com #邮箱
language: zh-CN #语言包设置。
# URL #访问地址等信息设置,可根据需要自己修改。
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://ijiaober.github.io #访问域名
root: /
permalink: :year/:month/:day/:title/ #具体内容页的存储路径结构
tag_dir: tags #标签目录名
archive_dir: archives #归档目录名
category_dir: categories #分类目录名
# Directory #默认文章和生成目录设置
source_dir: source
public_dir: public
# Writing 文章布局、写作格式的定义
new_post_name: :title.md # File name of new posts
default_layout: post
auto_spacing: false # Add spaces between asian characters and western characters
titlecase: false # Transform title into titlecase
max_open_file: 100
filename_case: 0
highlight:
enable: true
backtick_code_block: true
line_number: true
tab_replace:
# Category & Tag 分类和标签设置
default_category: uncategorized
category_map:
tag_map:
# Archives 默认值为2,如果这里都修改为1,相应页面就只会列出标题,而非全文
## 2: Enable pagination
## 1: Disable pagination
## 0: Fully Disable
archive: 1
category: 1
tag: 1
# Server 本地预览服务信息,默认端口是4000,有需要的话可以自己修改
## Hexo uses Connect as a server
## You can customize the logger format as defined in
## http://www.senchalabs.org/connect/logger.html
port: 4000
logger: false
logger_format:
# Date / Time format 日期格式
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: MMM D YYYY
time_format: H:mm:ss
# Pagination 每页显示文章数,可以自定义
## Set per_page to 0 to disable pagination
per_page: 5
pagination_dir: page
# Disqus Disqus 插件,我们会替换成“多说”
disqus_shortname:
# Extensions 这里配置站点所用主题和插件
## Plugins: https://github.com/hexojs/hexo/wiki/Plugins
## Themes: https://github.com/hexojs/hexo/wiki/Themes
theme: light
exclude_generator:
# Deployment 站点部署到github要配置

1. Docs: http://hexo.io/docs/deployment.html
deploy:
type: github
repository: https://github.com/ijiaober/ijiaober.github.io.git
branch: master

当你根据自己的需要修改了配置以后,就可以依次使用hexo g和hexo s命令,然后通过localhost:4000来查看效果了。
我们再来看看主题下的配置文件:

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
menu: #右上角导航菜单,冒号前面是菜单名,后面是访问路径。
Home: /
Archives: /archives
About: /about

widgets: #站点右边栏,可以调整顺序和增减内容,会自动调用主题layout/_widget目录下的同名文件。
- search
- category
- tagcloud
excerpt_link: Read More #列表页里Read more链接名称,可以替换成’查看更多‘等。
plugins:
twitter: #右边栏要显示twitter展示的话,需要在此设置
username:
show_replies: false
tweet_count: 5
addthis: #分享设置
enable: true
pubid:
facebook: true
twitter: true
google: true
pinterest: true
fancybox: true #图片效果,默认
google_analytics: #google_analytics统计ID
rss: #生成RSS路径

使用

详见:本地创建博客

(四)Hexo的分类和标签设置

到这里,我们已经了解了如何配置一个Hexo博客,并且通过

1
2
3
4
$ hexo n ‘name’
$ hexo g
$ hexo s
$ hexo d

几个常见命令来新建、更新、预览、同步你的博客。
这一节,我们来分享一下Hexo里关于分类和标签的设置技巧。
新建一个页面
首先,我们通过hexo n “name”命令来新建一个页面,在source/_posts目录下找到刚才新建的name.md文件,用记事本或者sublime text打开。
我们看到默认的页面是这样的:

1
2
3
4
title: name
date: 2014-08-05 11:15:00
tags:
---

可以编辑标题、日期、标签和内容,但是没有分类的选项。我们可以手动加入categories:项,或者打开scaffolds/post.md文件,在tages:上面加入categories:,保存后,重新执行hexo n ‘name’命令,会发现新建的页面里有categories:项了。
scaffolds目录下,是新建页面的模板,执行新建命令时,是根据这里的模板页来完成的,所以可以在这里根据你自己的需求添加一些默认值。
设置分类列表
在我们编辑文章的时候,直接在categories:项填写属于哪个分类,但如果分类是中文的时候,路径也会包含中文。
比如分类我们设置的是:
categories: 编程
那在生成页面后,分类列表就会出现编程这个选项,他的访问路径是:
*/categories/编程
如果我们想要把路径名和分类名分别设置,需要怎么办呢?
打开根目录下的配置文件_config.yml,找到如下位置做更改:

1
2
3
4
5
6
7
# Category & Tag
default_category: uncategorized
category_map:
编程: programming
生活: life
其他: other
tag_map:

在这里category_map:是设置分类的地方,每行一个分类,冒号前面是分类名称,后面是访问路径。
可以提前在这里设置好一些分类,当编辑的文章填写了对应的分类名时,就会自动的按照对应的路径来访问。
设置标签
在编辑文章的时候,tags:后面是设置标签的地方,如果有多个标签的话,可以用下面两种办法来设置:

1
2
3
4
5
6
7
tages: [标签1,标签2,...标签n]
or
tages:
- 标签1
- 标签2
...
- 标签n

(五)Hexo导航菜单设置

在Hexo里,默认的导航菜单只有Home和Archives两项,那么我们怎么来增加其他的导航菜单进去呢?
首先打开主题的配置文件_config.yml:

1
2
3
4
menu:
Home: /
Archives: /archives
About: /about

我们看到的menu:部分是设置菜单的,我们在下面加了一项设置About: /about
象上一节设置分类一样,前面部分是名称,后面部分是访问路径,当然名称神马的你可以用中文,访问路径你也可以直接设置到其他站点的任何页面。
我们这个示例里,设置About的访问路径为:/about。
下面我们来建立这个about,运行命令:
hexo n page ‘about’
会在source目录里生成一个对应的_posts目录,该目录下的about.md,就是你访问About时的页面。

(六)Hexo主题安装

嘿,我们搭建好了Hexo,设置好了导航菜单和分类,写了一些文章并且同步到GitHub上了,可我们不满足,我们想要页面看起来更好看一些。
我们可以通过安装主题的方式来快速选择喜欢的样式!
打开Hexo的Themes;
找到你心仪的主题并且点击主题名称进入详细页面;
找到install这一项,复制下面的内容,比如Light主题的安装内容为:

1
git clone https://github.com/hexojs/hexo-theme-light.git themes/light

在Hexo目录下运行上面复制的内容,就会自动下载该主题到你的Themes目录。
下载完毕后,在站点配置文件_config.yml里设置对应的主题名称:

1
theme: light

根据自己的需要,配置主题的配置文件_config.yml;
OK,我们成功的安装了一个主题

(七)设置Hexo里的评论和分享

现在我们的Hexo安装了漂亮的主题,并且设置了导航菜单,也发布了几篇文章,是不是急不可耐的想和大家一起分享你的内容了?
在和朋友们分享文章的时候,有两个必不可少的功能,评论 和 分享,这一节我们就来了解一下这两个设置。

评论设置

在Hexo中,默认使用的评论是国外的Disqus,不过因为国内的”网络环境”问题,我们改为国内的“多说”评论系统。

注册多说账户

访问多说网站,点击登录,根据自己的习惯选择一个登录方式。
登录后根据提示填写一些基本信息,下一步就跳转到 工具 —- 获取代码 这页了。复制这里的通用代码备用。
修改comment文件
打开themes/主题名/layout/_partial/comment.ejs这个文件 ,在下面位置粘贴刚才复制的代码:

1
2
3
4
5
<% if ( page.comments){ %>
<section id="comment">
此处粘贴通用代码
</section>
<% } %>

记得粘贴完后,替换代码里的标题、网址、ID三项信息。
标题可以用<%= item.title %>来替换,
网址可以用<%- config.url %><%- config.root%><%- item.path %>来替换,
ID可以用<%- item.path %>来替换。

分享设置

访问百度分享,复制代码备用。
找到themes/light/layout/_partial/post/share.ejs页面,用刚才复制的代码替换里面的内容,搞定。
如果想要调换分享图标可参考百度分享的说明来修改。

1
2
3
4
5
6
7
我使用了disqus

_config.yml 添加
disqus_shortname: 你自己申请的shortname

themes> _config.yml 添加
comment_provider: disqus

(八)为Hexo添加RSS和Sitemap

添加RSS

用npm安装插件:

npm install hexo-generator-feed
在配置文件里引用插件。在hexo/_config.yml添加代码:

1
2
plugins:
- hexo-generator-feed

在导航上添加RSS链接。打开themes/light/_config.yml文件,rss:部分修改为rss: /atom.xml,然后在menu部分添加Rss: /atom.xml。完成后代码类似下面的效果:

1
2
3
4
menu:
Home: /
Archives: /archives
Rss: /atom.xml

### 添加Sitemap
和RSS一样,需要下载个插件。
安装插件:

npm install hexo-generator-sitemap
引用插件,同样在hexo/_config.yml中添加代码:

1
2
3
plugins:
- hexo-generator-feed
- hexo-generator-sitemap

访问/sitemap.xml就能看到站点地图了。

grunt+requirejs+angularjs

步骤:

  • cd demo文件夹下
  • 安装grunt-cli

npm install -g grunt-cli //全局安装 -g

  • 手动生产或自动生产 package.json

自动 npm init //之后按需 输入name和version。。。

  • 创建 Gruntfile.js

touch Gruntfile.js

  • 安装插件 插件的用法详见 grunt官網

    1
    2
    3
    4
    5
    6
    7
    8

    npm install grunt --save-dev

    npm install grunt-contrib-uglify --save-dev

    npm install grunt-contrib-watch --save-dev

    npm install grunt-contrib-requirejs --save-dev
  • 运行
    grunt

Gruntfile 配置如下

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
module.exports = function (grunt) {

// 项目配置
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
index: {
src: ['scripts/App/indexApp.js', 'scripts/Controllers/indexCtrl.js'],//要压缩的源文件
dest: 'scripts/<%= pkg.name %>.min.js'//压缩后的输出位置
}
},
watch: {
scripts: {
files: ['scripts/**/*.js'],
tasks: ['requirejs'],
options: {
spawn: false
}
}

},
requirejs: {
compile: {
options: {
baseUrl: ".",
paths: {requireLib: 'scripts/requireMain/require'},
include: 'requireLib',//如果需要把require也压进去(这样整个项目只需要一个js文件了),设置其path,并
name: 'scripts/requireMain/indexMain',
out: 'scripts/requireMain/index.js',//输出的文件名
// optimize:'none',//注释掉此行即可同时把合并后的js文件压缩
mainConfigFile: 'scripts/requireMain/indexMain.js'//用已写好的main.js文件来处理模块依赖关系
}
}
}
});

// 加载提供"uglify"任务的插件
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-requirejs');


// 默认任务 使用 requirejs
grunt.registerTask('default', ['requirejs', 'watch']);
};

[demo](https://github.com/yuluhuang/ng-requirejs)

Running MongoDB on Windows

将mongo安装在非系统盘

我不久前使用MongoDB,根据development box
从官网下载MongoDB,按照自己的需求下载不同版本,我下载的是 64-bit Zip文件。 .msi文件是安装到Program Files目录下的(默认),但是我更喜欢把安装文件(zip包)和数据库文件(创建数据库后生成)放在一起使而且不必使用Admin运行.

取出zip文件放到 c:\MongoDB

进入 c:\MongoDB,创建一个data子目录,进入并创建db子文件夹和log子文件夹,bin文件夹已经存在,最后
你的文件夹结构如下,

1
2
3
4
5
c:\mongodb
\bin
\data
\db
\log

配置 MongoDB

添加一个文件 c:\MongoDB\mongod.cfg包含以下内容

1
2
3
4
5
6
7
8
9
systemLog:
destination: file
path: c:\mongodb\data\log\mongodb.log
logAppend: true
storage:
dbPath: c:\mongodb\data\db
net:
bindIp: 127.0.0.1
port: 27017

logdb的路径还有端口号都是默认,需要改变也很容易。注意ip只绑定127.0.0.1,因为那是不安全的,所以我不想暴露在network上,更多配置选项 see the documentation.

测试MongoDB

运行以下命令

C:\MongoDb\bin>mongod.exe -f ..\mongod.cfg
然后在另一个 command window(win+R),运行服务确定他能成功运行。

当我connecting时出现以下错误,所以我关闭了服务

1
2
3
4
5
6
7
8
9
10
11
12
13
c:\MongoDb\bin>mongo
MongoDB shell version: 2.6.1
connecting to: test
> use admin
switched to db admin
> db.shutdownServer()
2014-06-10T14:28:35.567-0400 DBClientCursor::init call() failed
server should be down...
2014-06-10T14:28:35.571-0400 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2014-06-10T14:28:36.579-0400 warning: Failed to connect to 127.0.0.1:27017, reason: errno:10061 No connection could be made because the target machine actively refused it.
2014-06-10T14:28:36.579-0400 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
> exit
bye

将其作为一个service安装

我们现在知道我们的配置是正确的,所以我想去安装一个service让他总是运行

启动一个 Administrator command prompt(拥有管理员权限)

win7 :win+R 进入cmd ,之后按住 CTRL+SHIFT+ENTER

win8:WIN+X 之后按A

现在运行命令

sc.exe create MongoDB binPath="C:\MongoDB\bin\mongod.exe --service --config=C:\MongoDB\mongod.cfg" DisplayName="MongoDB 2.6 Standard" start="auto"
你应该看到

[SC] CreateService SUCCESS
现在你可以根据以下命令开启和关闭服务(如果不能启动,手动开启服务 任务管理器-服务)

1
2
net start MongoDB
net stop MongoDB

如果你想卸载服务

sc.exe delete MongoDB

原文连接

hexo搭建转载

小白独立搭建博客–Github Pages和Hexo简明教程
2016年03月16日 ⁄ Android开发经验 ⁄ 共 9767字 ⁄ 字号 小 中 大 ⁄ 评论关闭
首先欢迎各位来参观我的博客:Ryane’s Blog

Github地址:https://github.com/ryanlijianchang/ryanlijianchang.github.io

摘要:这是一篇有关如何使用Github Pages和Hexo搭建自己独立博客的详尽教程,里面介绍了如何使用和配置Hexo框架,如何将Hexo部署到自己的Github项目中,域名注册,以及域名的绑定,还有我在搭建自己博客过程中所遇到的各种困难。

##前言
我是一名安卓入门开发者,但,我只是入门!而且我对网站开发以及前端的知识几乎是零基础,所以在自己刚接触这个东西的时候,我像很多人一样,都是上网找教程,但是要知道,那都是程序员的教程。所以对于我这个网站技术小白来说,真是很难受,所以藉此机会写一篇让小白看得懂的教程。如果你是一个小白而且又想做自己的博客,可以,请跟着我的脚步,我会带你真真正正做一个属于你自己的博客。

如果你还不知道你为什么要做一个博客,推荐你看:《我为什么写博客》

##入门门槛

  1. 必须耐得住折腾。
  2. 刻苦的学习精神和耐心。

##关于Github

###一、Github的优点

  • GitHub是基于git实现的代码托管。git可能是目前最好用的版本控制系统了,非常受欢迎。
  • GitHub可以免费使用,并且快速稳定。
  • Github上面的世界很精彩,用久了你的眼界会开阔很多。

###二、什么是Github Pages
Github Pages可以被认为是用户编写的、托管在github上的静态网页。

###三、为什么要使用Github Pages

  • 可以绑定你的域名(但暂时貌似只能绑定一个)。
  • 简单快捷,使用Github Pages可以为你提供一个免费的服务器,免去了自己搭建服务器和写数据库的麻烦。

##安装Node.js
在 Windows 环境下安装 Node.js 非常简单,仅须到官网下载安装文件并执行即可完成安装。

像我的是Windows 64位,直接下载安装,不需要配置环境变量。

##安装Git
下载 msysgit 并执行即可完成安装。(上官网要翻墙,如果你的是64位,可以点击此处下载)

怎么打开Git?


##Hexo
Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

###一、Hexo安装
桌面右键鼠标,点击Git Bash Here,输入npm命令即可安装

npm install hexo-cli -g
npm install hexo –save

#如果命令无法运行,可以尝试更换taobao的npm源
npm install -g cnpm –registry=https://registry.npm.taobao.org

###二、Hexo初始化配置

创建Hexo文件夹

安装完成后,根据自己喜好建立目录(如F:\Blog\Hexo),直接进入F:\Blog\Hexo文件夹下右键鼠标,点击Git Bash Here,进入Git命令框,执行以下操作。

hexo init
npm install

安装 Hexo 完成后,Hexo 将会在指定文件夹中新建所需要的文件。Hexo文件夹下的目录如下:

安装Hexo插件

如果想不出错,就将下面的插件都安装完。

npm install hexo-generator-index –save
npm install hexo-generator-archive –save
npm install hexo-generator-category –save
npm install hexo-generator-tag –save
npm install hexo-server –save
npm install hexo-deployer-git –save
npm install hexo-deployer-heroku –save
npm install hexo-deployer-rsync –save
npm install hexo-deployer-openshift –save
npm install hexo-renderer-marked@0.2 –save
npm install hexo-renderer-stylus@0.2 –save
npm install hexo-generator-feed@1 –save
npm install hexo-generator-sitemap@1 –save

本地查看效果

执行下面语句,执行完即可登录localhost:4000查看效果

hexo generate
hexo server
登录localhost:4000,即可看到本地的效果如下:

##将博客部署到Github Pages上
那么现在本地的博客已经搭建起来了,但是我们只可以通过本地连接查看我们的博客。那么我们现在需要做的就是把本地的博客发布到服务器上,让别人也可以连接我们的博客,而Github Pages就帮我完成了这件事情。但是Github Pages的代码就是寄存在Github上面的。那么接下来我们需要在Github上面创建一个新的项目。

###一、注册Github账户

  1. 访问Github首页
  2. 点击右上角的 Sign Up,注册自己的账户

###二、创建项目代码库

  1. 注册完登陆后,我们就创建一个我们自己的Github Pages项目。点击New repository
  2. 创建要点如下:

###三、配置SSH密钥

配置Github的SSH密钥可以让本地git项目与远程的github建立联系,让我们在本地写了代码之后直接通过git操作就可以实现本地代码库与Github代码库同步。操作如下:

第一步、看看是否存在SSH密钥(keys)

首先,我们需要看看是否看看本机是否存在SSH keys,打开Git Bash,并运行:

cd ~/. ssh
检查你本机用户home目录下是否存在.ssh目录

如果,不存在此目录,则进行第二步操作,否则,你本机已经存在ssh公钥和私钥,可以略过第二步,直接进入第三步操作。

第二步、创建一对新的SSH密钥(keys)

ssh-keygen -t rsa -C “your_email@example.com

#这将按照你提供的邮箱地址,创建一对密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]

直接回车,则将密钥按默认文件进行存储。此时也可以输入特定的文件名,比如/c/Users/you/.ssh/github_rsa

接着,根据提示,你需要输入密码和确认密码(说到这里,如果你很放心,其实可以不用密码,就是到输密码的地方,都直接回车,所以每次push就只管回车就行了。所谓的最安全的密码,就是没有密码 哈哈)。相关提示如下:

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

输入完成之后,屏幕会显示如下信息:

Your identification has been saved in /c/Users/you/.ssh/id_rsa.
Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

第三步、在GitHub账户中添加你的公钥

运行如下命令,将公钥的内容复制到系统粘贴板(clipboard)中。

clip < ~/.ssh/id_rsa.pub

接着:

  1. 登陆GitHub,进入你的Account Settings.

2.选择SSH Keys

3.粘贴密钥,添加即可

第四步、测试

可以输入下面的命令,看看设置是否成功,git@github.com的部分不要修改:

ssh -T git@github.com

如果是下面的反馈:

The authenticity of host ‘github.com (207.97.227.239)’ can’t be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?

不要紧张,输入yes就好,然后会看到:

Hi cnfeat! You’ve successfully authenticated, but GitHub does not provide shell access.

第五步、设置用户信息

现在你已经可以通过SSH链接到GitHub了,还有一些个人信息需要完善的。
Git会根据用户的名字和邮箱来记录提交。GitHub也是用这些信息来做权限的处理,输入下面的代码进行个人信息的设置,把名称和邮箱替换成你自己的,名字必须是你的真名,而不是GitHub的昵称。

git config –global user.name “cnfeat”//用户名
git config –global user.email “cnfeat@gmail.com“//填写自己的邮箱

第六步、SSH Key配置成功

本机已成功连接到github。
如有问题,请参考:

GitHub Help - Generating SSH Keys

Error: Permission denied (publickey)

###四、将本地的Hexo文件更新到Github的库中

第一步、登录Github打开自己的项目 username.github.io

第二步、打开之后,点击HTTPS,选择HTTPS类型地址

第三步、复制地址

第四步、打开你一开始创建的Hexo文件夹(如F:\Blog\Hexo),用记事本打开刚文件夹下的_config.yml文件

第五步、在配置文件里作如下修改,保存

第六步、在Hexo文件夹下执行:

hexo g
hexo d

或者直接执行

hexo g -d

执行完之后会让你输入github的账号和密码,输入完后就可以登录我们自己的部署在Github Pages服务器上的博客了。对应的地址是 username.github.io(我的是:ryanlijianchang.github.io)。

第七步、在浏览器上输入自己的主页地址

在浏览器上输入即可看到我们自己的博客,别人电脑输入也可以哦。

##美化自己博客
那么现在我们的博客已经挂在了服务器上面,别人已经可以通过网址来登陆我们的博客了,但是我们这时就有了新的需求,就是自己的博客并不好看,那怎么办的?这很简单,要知道很多前端开发者在Hexo框架下开发了很多的主题给我们使用,我们只需要把他们的主题克隆过来,然后通过修改配置文件即可达到我们所需要的效果。

那么我们应该怎么修改呢?

一、进入Hexo的官网主题专栏

###二、挑选我们喜欢的主题
可以看到有很多主题给我们选,我们只要选择喜欢的主题点击进去,然后进入到它的github地址,我们只要把这个地址复制下来(例如我是选择:hexo-theme-next这个主题)

###三、克隆主题

再打开Hexo文件夹下的themes目录(F:\Blog\hexo\themes),右键Git Bash,在命令行输入:

git clone https://github.com/iissnan/hexo-theme-next(此处地址替换成你需要使用的主题的地址)

下载中,等待下载完成:

###四、修改Hexo配置文件

下载完成后,打开Hexo文件夹下的配置文件_config.yml

修改参数为:theme: hexo-theme-next

五、部署主题,本地查看效果

返回Hexo目录,右键Git Bash,输入

hexo g
hexo s

打开浏览器,输入 http://localhost:4000/ 即可看见我们的主题已经更换了。

###六、如果效果满意,将它部署到Github上

打开Hexo文件夹,右键Git Bash,输入

hexo clean (必须要,不然有时因为缓存问题,服务器更新不了主题)
hexo g -d

###七、打开自己的主页,即可看到修改后的效果

更多修改效果请查看对应主题的说明文档,点击此查看本主题(Next)对应的说明文档。

在博客写文章

一、用hexo发表新文章

hexo n “文章标题”
其中 我的家 为文章标题,执行命令 hexo n "我的家" 后,会在项目 \Hexo\source_posts 中生成 我的家.md文件,用编辑器打开编写即可。

当然,也可以直接在\Hexo\source_posts中新建一个md文件,我就是这么做的。
写完后,推送到服务器上,执行以下命令即可在我们的站点看到新的文章。

hexo g #生成
hexo d #部署 # 可与hexo g合并为 hexo d -g

###二、用Markdown写文章

我们注意到在 \Hexo\source_posts 文件夹下存放着我们的文章,它们的格式都是以.md格式结尾的,没错,Hexo也是支持Markdown语法的,所以当我们需要写具有格式化的文章时,我们可以使用支持Markdown语法的编辑器进行文章编译,然后保存文件到 \Hexo\source_posts 文件夹下即可。

复制进去之后,只要执行

hexo d -g

推送到我们的Github仓库即可。

那么什么是Markdown?

Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果。

Markdown有什么优点?
  • 专注你的文字内容而不是排版样式。
  • 轻松的导出 HTML、PDF 和本身的 .md 文件。
  • 纯文本内容,兼容所有的文本编辑器与字处理软件。
  • 可读,直观。适合所有人的写作语言。
我该用什么工具?
  • Windows下可以使用 MarkdownPad2。
  • 在 Mac OS X 上,我建议你用 Mou 这款免费且十分好用的 Markdown 编辑器。
  • Web 端上,我强烈推荐 简书 这款产品。

关于Markdown的更多资料可以查看如下:

将自己的域名关联到Github Pages上

很多朋友创建了自己的博客之后会选择买一个属于自己的域名,然后将自己域名绑定到自己的Github Pages博客上,其实这也并不难,只要你有个域名。

一、购买域名

如果你不是很有钱,在阿里云上,你只要几块钱就可以买到一个域名。

选择你喜欢的域名,然后购买即可。

###二、配置CNAME文件

在 \hexo\source 文件夹下创建文件 CNAME (新建记事本文件命名CNAME,然后打开)

内容为你的域名,例如我的域名是:lijianchang.xyz

在Hexo文件夹提交

hexo g -d

三、修改DNS的DNS

1.如果你是在阿里云购买域名的话,请登录阿里云网站。打开个人中心,点击域名

2.选择管理

3.修改DNS为

f1g1ns2.dnspod.net
f1g1ns1.dnspod.net

四、域名解析

  1. 打开DNSPOD,注册一个账户

  2. 点击添加域名,把你的域名添加进去,如无意外,添加完之后就是以下这个状态

  3. 此时点击添加记录,添加两个记录,一个主机记录为@, 一个为www,而记录值都是填同一个,填你的博客主页对应的ip,添加完后如下。

  4. 但是如何获取ip值呢?打开运行,输入cmd,打开命令窗口输入 ping 主页地址 , 红色部分即为你的ip值

  5. 将IP输入过去即可。等待生效,最迟72小时生效。即可通过你的域名浏览你的博客主页。

##结语
当你完成了你的博客之后,相信你的心情跟我刚做完的心情是一样的,即便很累,但是当自己的博客成型之后,自己还是有一个成就感的,那么完成后,以后的路还很长,真正想要自己博客能够积累人气,还得靠好的内容,所以认真写文章吧,相信你会受益于此的。

如果大家有什么问题的话,可以在我留言板下留言,我看到评论时会第一时间回答大家。

#参考资料:

  1. Markdown入门手册中文版
  2. Markdown–入门指南
  3. 如何搭建一个独立博客——简明 Github Pages与 jekyll 教程 by cnfeat
  4. Hexo搭建Github静态博客 by 金石开
  5. 使用SSH密钥连接Github【图文教程】 by 轩枫

本地创建博客

持续更新

使用gulp工具

  • 安装 npm i gulp gulp-connect gulp-markdown --save-dev
  • 配置gulpfile.js
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
var gulp = require("gulp"),
connect = require("gulp-connect"),
markdown = require("gulp-markdown");

gulp.task("connect", function() {

connect.server({
port: 3000,
root: "source/md2html/",
livereload: true,

});
});

gulp.task('html', function() {
gulp.src(['./source/md2html/*.html'])
.pipe(connect.reload());
});

gulp.task('md2html', function() {
gulp.src(['./source/_posts/*.md'])
.pipe(markdown())
.pipe(gulp.dest('./source/md2html'))
.pipe(connect.reload());
});

gulp.task('watch', function() {
gulp.watch(['./source/_posts/*.md'], ['md2html']);
gulp.watch(['./source/md2html/*.html'], ['html']);
});



gulp.task("default", ['connect', 'watch']);
  • 如果你不能自动刷新可以安装谷歌插件 livereload

创建博客

hexo n "xxx"

上传博客

hexo g -d