• Archive by category "IT相关知识"

Blog Archives

prolog语言安装

Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/prolog-install/

前言

最近在研究逻辑推理的一些问题,无意中发现了一门编程语言prolog就是解决推理问题的。这可太好了,直接勾起了我们的兴趣,马上动手试一下。本文是prolog编程语言的初探,一切从零开始,就让我们揭开prolog的神秘的面容吧。

目录

  1. 什么是prolog语言
  2. 在Ubuntu中安装prolog
  3. 在Win10中安装prolog
  4. 5分钟上手
  5. 躲不过的错误:DWIM could not correct goal

1. 什么是prolog语言

prolog(Programming in logic)是一种面向演绎推理的逻辑型程序设计语言,最早于1972年由柯尔麦伦纳(Colmeraner)及其研究小组在法国马赛大学提出。prolog以处理一阶谓词演算为背景,由于其简单的文法、丰富的表达力和独特的非过程语言的特点,很适合用来表示人类的思维和推理规则,从而一问世就赢得了人工智能研究和应用开发者的广泛兴趣。

Prolog实际上就是一种基于逆向规则的演绎推理技术,只不过对规则和目标的表示有严格的限制.再加上演绎推理控制机制自身的简单性,难以适用于复杂的应用域。

Prolog 语言仅有三种语句:事实(Fact)、规则(Rule)和问题(Question)。

  • 事实,是prolog中最简单的谓词,它和数据库中的记录十分相似。事实用来说明一个问题中已知的对象的性质和它们之间的关系。
  • 规则,由几个互相依赖的简单句(谓词)组成。用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系。
  • 问题,是把事实和规则写入Prolog程序之后,就可以想Prolog询问有关问题的答案,询问的问题就是程序的运行目标。

从语言的描述来看,很抽象、很强大的样子,就让我们为体验一下吧。

2. 在Ubuntu中安装prolog

本文使用的Linux是Ubuntu 20.04.1 LTS Server 64bit的系统,安装Prolog数据库软件包可以通过apt实现。

简单地3条命令就可以实现


# 增加swi-prolog源到配置文件
~ sudo apt-add-repository ppa:swi-prolog/stable

# 更新源
~ sudo apt update

# 安装
~ sudo apt install swi-prolog

查看prolog安装版本,为最新的8.2.3


~ swipl --version
SWI-Prolog version 8.2.3 for x86_64-linux

启动prolog的命令行


~ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.3)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?-

启动后,出现 ?- 这个符号,表示启动正常,进入到了prolog的运行时环境。

3. 在Win10中安装prolog

我们需要从官网下载prolog的window的安装包,最新版本为8.2.3,https://www.swi-prolog.org/download/stable

然后,一路(next)安装就行,安装完成后,我们找到SWI-Prolog的快捷方式启动。

启动后,出现的操作界面和Linux是一致的,我们就可以在这个环境中运行prolog的脚本程序了。

4. 5分钟上手

接下来,我们初步认识一下prolog编程,做一个5分钟上手的小例子。

4.1 语句以 . 为结束标志
在prolog编程中,每条命令执行完,需要输入 . 表示语句运行结束。如果不输入 . 就会默认自动换行处理,第一次是 ?- 提示符,第二行为 | 提示符。

查看当前的运行路径,以.结尾


?- pwd.
% c:/users/bsspi/documents/prolog/
true.

%% 没有输入.,默认自动换换行,再第二行输入 .
?- pwd
|    .
% c:/users/bsspi/documents/prolog/
true.

4.2 切换路径

通常来说,每个项目都会运行在不同路径中,所以我们需要切换工作路径。


?- cd('c:/work/prolog').
true.

%% 查看路径
?- pwd.
% c:/work/prolog/
true.

4.3 语法帮助

查看帮助命令,使用 help(命令). ,分别查看pwd命令和append命令。

查看append命令的帮助


?- help(append).
                                                                          Availability: built-in

append(+File)
    Similar to tell/1, but positions the file pointer at the end of File rather  than truncating
    an existing file. The pipe construct is not accepted by this predicate.

                                Availability: :- use_module(library(lists)). (can be autoloaded)

append(+ListOfLists, ?List)
    Concatenate a list of lists. Is true if  ListOfLists is  a list  of lists,  and List  is the
    concatenation of these lists.

         ListOfLists  must be a list of possibly partial lists 

                                Availability: :- use_module(library(lists)). (can be autoloaded)

append(?List1, ?List2, ?List1AndList2)
    List1AndList2 is the concatenation of List1 and List2
true.

查看pwd命令的帮助


?- help(pwd).
Warning: No help for pwd.
Warning: Use ?- apropos(query). to search for candidates.
true.

4.4 输出到控制台

输出hello world


?- write("hello world").
hello world
true.

连续输出 hello world fens.me


?- write("hello world "),write("fens.me").
hello world fens.me
true.

连续输出 hello world fens.me,中间中nl换行


?- write("hello world "),nl,write("fens.me").
hello world 
fens.me
true.

4.5 加载官方例子
prolog官方为了能够让大家让手方便,提供了一个简单的例子的脚本,我们可以加载这些脚本,看看官方的脚本编写语法。

加载swi软件demo目录下的likes.pl文件


?- [swi(demo/likes)].
true.

查看likes文件中定义的sam都喜欢什么东西,用X标识X为变量,每次只显示一行,按 ; 换行继续显示,可以用来查看sam都喜欢什么东西。


?- likes(sam, X).
X = dahl ;
X = tandoori ;
X = kurma ;
X = chow_mein ;
X = chop_suey ;
X = sweet_and_sour ;
X = pizza ;
X = spaghetti ;
X = chips.

编辑likes.pl文件


?- edit(likes).
true.

会自动弹出一个prolog编辑器,可以看到likes.pl文件的源代码。
我们可以输入一些参数进行判断。


# sam喜欢dahl吗
?- likes(sam,dahl).
true .

# sam喜欢chop_suey吗
?- likes(sam,chop_suey).
true .

# sam喜欢curry吗
?- likes(sam,curry).
false.

查看indian餐列表


?- listing(indian) .
indian(curry).
indian(dahl).
indian(tandoori).
indian(kurma).

4.6 创建自定的命令
首先,需要创建一个本地的文件叫abc.pl。

定义 hello 命令,输出Hello world。


?- edit(file(abc)).
true.

在打开的文件abc.pl中,添加下面内容


hello : format('Hello world ~n').

加载abc.pl文件,输出hello命令。


?- [abc].
true.

?- hello.
Hello world
true.

在运行环境修改hello命令,失败。


?- hello : format('Hello fens.me ~n').
false.

?- hello.
Hello world
true.

4.7 完成退出
在我们完成工作任务后,最后用halt命令进行退出运行环境。


?-  halt.

退出prolog环境。

5. 躲不过的错误:DWIM could not correct goal

第一次使用prolog时,不管从哪里复制的过来的例子,都会出现 ERROR: Unknown procedure: love/2 (DWIM could not correct goal) 的错误。我也试了很多次,才搞明白这个错误的问题。

在prolog的执行过程中,prolog要求所有的自定义命令,都必须是在指定文件中定义,所以当我们任意复制过来的命令,直接在运行环境中执行就会出现这个错误。解决的方法,就是把命令写到文件中,然后加载文件就能解决。

比如下面的例子,我们要创建一个恋爱关系,在c:/work/prolog目录下,新建一个love.pl文件。


~ notepad c:/work/prolog/love.pl

love(zhangxueyou,wangfei).
love(zhangxueyou,zhouhuimin).
love(wangfei,xietingfeng).
love(zhouhuimin,zhangxueyou).
love(xietingfeng,wangfei).
love(xietingfeng,zhouhuimin).
love(liudehua,zhouhuimin).
loves(X,Y):-love(X,Y),love(Y,X).  %恋人
rival_in_love(X,Y):-love(X,Z),not(love(Z,X)),love(Z,Y). %情敌

直接在prolog的运行环境中运行,第一行命令,出现错误 (DWIM could not correct goal)


?- love(zhangxueyou,wangfei).
ERROR: Unknown procedure: love/2 (DWIM could not correct goal)

接下来,我们加载c:/work/prolog/love.pl文件



# 加载文件
?- ["c:/work/prolog/love"].
true.

# 判断是否恋人关系
?- love(zhangxueyou,wangfei).
true .

# 判断是否恋人关系
?- love(liudehua,wangfei).
false.

# 判断是否情敌关系
?- rival_in_love(liudehua,wangfei).
false.

通过上面的操作,我们就完成了prolog语言的初次尝试,prolog安装很简单,语法上有点奇怪。随后我将进一步学习prolog语法,以及能用prolog来解决什么问题的尝试。

希望本文能让所有的prolog新手快速上手,顺利完成prolog语言的初探。

转载请注明出处:
http://blog.fens.me/prolog-install/

打赏作者

AI-900认证考试攻略

架构师的信仰系列文章,主要介绍我对系统架构的理解,从我的视角描述各种软件应用系统的架构设计思想和实现思路。

从程序员开始,到架构师一路走来,经历过太多的系统和应用。做过手机游戏,写过编程工具;做过大型Web应用系统,写过公司内部CRM;做过SOA的系统集成,写过基于Hadoop的大数据工具;做过外包,做过电商,做过团购,做过支付,做过SNS,也做过移动SNS。以前只用Java,然后学了PHP,现在用R和Javascript。最后跳出IT圈,进入金融圈,研发量化交易软件。

架构设计就是定义一套完整的程序规范,坚持架构师的信仰,做自己想做的东西。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/certificate-ai900/

前言

刚考完AZ-900的考试,还在感叹Azure生态的强大,不管是架构上和还是功能上的。本来想休息一下,现在又有了新的契机,可以继续完成AI-900的认证课程。虽然AI-900的课程还是属于入门级的,却能让我更多的了解微软的产品体系和产品规划的思路,我觉得比实际做具体的代码开发,或者功能实现更有意义。关于AZ-900的考试详细介绍,请参考文章AZ-900认证考试攻略

坚持学习,顺利通过考试。

目录

  1. 考试契机
  2. 学习路径
  3. 复习准备

1. 考试契机

为了参加智子学院的“MCP导师认证计划”,以微软认证专家的身份,为企业提供技术咨询服务。智子学院要求参与者必须在1个自然月内完成AI-900 Azure AI Fundamentals的认证考试,同时智子学陆院免费提供考试券。有了这样的一个要求,自然地就开始了学习的过程。

客观地说,微软的Azure相关技术体系确实庞大,如果没有深入去学习这些知识,真的无从下手用微软产品。而且更难得的是,微软的docs文档条理清楚,每个技术点都有详细的介绍,不仅有技术细节,架构的描述,还有从社会意义角度的说明,真是非常有心。让我学习在过程中,不仅是知识的学习,还有对于产品规划的认识。

微软认证体系:

考试完成后,会获得一份考试能力评估表,来告诉你哪部分做的好,哪部分做的不好。我考试的能力评估表:我考了830分(700通过),总体来说还是不错的成绩。

最后,就获得的证书电子版的证书 Microsoft Certified: Azure AI Fundamentals。

2. 学习路径

Microsoft Certified: Azure AI Fundamentals ,AI-900认证考试是Azure AI的基础使用的认证,包括机器学习和深度学习等智能算法,在结构化数据、图片、文字和语音的应用,主要涉及5大部分内容。

  • 描述 AI 工作负荷和注意事项
  • 描述 Azure 上机器学习的基本原理
  • 描述 Azure 上的计算机视觉工作负荷的功能
  • 描述 Azure上自然语言处理(NLP)工作负荷的特性
  • 描述 Azure 上的对话式 AI 工作负荷的功能

微软docs上,给出了AI-900完整的学习路径,https://docs.microsoft.com/zh-cn/learn/certifications/azure-ai-fundamentals

学习大纲
第一部分:描述 AI 工作负荷和注意事项
人工智能 (AI) 为令人惊异的新的解决方案和体验赋能,Microsoft Azure 提供了易用的服务来帮助你入门。

  • 1.1 Azure 上的 AI 入门

第二部分:描述 Azure 上机器学习的基本原理
机器学习是人工智能的核心,很多新式应用程序和服务都依赖于预测机器学习模型。 了解如何使用 Azure 机器学习在不编写代码的情况下创建和发布模型。

  • 2.1 使用 Azure 机器学习中的自动化机器学习
  • 2.2 使用 Azure 机器学习设计器创建回归模型
  • 2.3 使用 Azure 机器学习设计器创建分类模型
  • 2.4 使用 Azure 机器学习设计器创建聚类分析模型

第三部分:描述 Azure 上的计算机视觉工作负荷的功能
计算机视觉是人工智能 (AI) 的一个领域,在该领域中,软件系统旨在通过摄像头、图像和视频以可视方式感知这个世界。 AI 工程师和数据科学家可以通过混合使用自定义机器学习模型和平台即服务 (PaaS) 解决方案(包括 Microsoft Azure 中的众多认知服务),来解决多种特定类型的计算机视觉问题。

  • 3.1 使用计算机视觉服务分析图像
  • 3.2 使用自定义视觉服务对图像进行分类
  • 3.3 使用自定义视觉服务检测图像中的对象
  • 3.4 使用人脸服务检测和分析人脸
  • 3.5 使用计算机视觉服务读取文本
  • 3.6 利用“表单识别器”服务分析收据

第四部分:描述 Azure上自然语言处理(NLP)工作负荷的功能
自然语言处理功能支持能看到用户、听到用户的声音、与用户交谈和理解用户的意图的应用程序。 凭借文本分析、翻译和语言理解服务,Microsoft Azure 让你能够轻松构建支持自然语言的应用程序。

  • 4.1 使用文本分析服务分析文本
  • 4.2 识别和合成语音
  • 4.3 翻译文本和语音
  • 4.4 使用“语言理解”创建语言模型

第五部分:描述 Azure 上的对话式 AI 工作负荷的功能
对话式 AI 是一种人工智能工作负载,它可处理 AI 代理与人类用户之间的对话。

  • 5.1 使用 QnA Maker 和 Azure 机器人服务构建机器人

学习的内容很有意思,与我目前的工作有大量的交集。我们在用R语言进行独立开发和实现的,也可以通过本次的学习,看看如果能利用微软的产品,来完成复杂的机器学习的任务。

3. 复习准备

虽然,微软docs已经有了完整的学习大纲,真学起来还是要花点时间的,重点就在于名词解释。没想到在Azure AI里体系里,定义这么多的产品和新名词。虽然我已经用过了各种云的服务和产品,但对于全面的AI产品也并不是太了解,所以借着这次考认证,正好是全面的学习。

Azure机器学习算法备忘单,用于Azure的机器学习设计器,Azure 机器学习包含来自分类、推荐系统聚类、异常检测、回归和文本分析系列的大型算法库。每个都旨在解决不同类型的机器学习问题。

3.1 名字解释
下面开始,名词解释:

Azure Machine Learning designer,Azure机器学习设计器使您可以在交互式画布上直观地连接数据集和模块,以创建机器学习模型。

Resource: Pipelines,Datasets,Compute resources,Registered models,Published pipelines,Real-time endpoints

可以使用的云资源: 计算实例:数据科学家可用于处理数据和模型的开发工作站。 计算群集:用于按需处理试验代码的可扩展虚拟机群集。 推理群集:使用已训练模型的预测服务的部署目标。

Computer Vision :基于云的Computer Vision API使开发人员可以访问用于处理图像和返回信息的高级算法。通过上传图像或指定图像URL,Microsoft Computer Vision算法可以根据输入和用户选择以不同方式分析视觉内容。通过快速入门,教程和示例,学习如何以不同的方式分析视觉内容。

Azure Custom Vision用户自定义图像识别服务,可让您构建,部署和改进自己的图像标识符。图像标识符根据图像的视觉特征将标签(代表类或对象)应用于图像。与Computer Vision服务不同,Custom Vision允许您指定标签并训练自定义模型以检测它们。

Facial recognition: 将面部识别功能嵌入到您的应用中,以提供无缝且高度安全的用户体验。 不需要机器学习专业知识。 功能包括:人脸检测,可感知图像中的人脸和属性; 与您最多100万人的私人存储库中的个人匹配的个人标识; 感知到的情感识别,可以检测到各种面部表情,例如幸福,轻蔑,中立和恐惧; 以及图像中相似面孔的识别和分组。

Optical Character recognition(OCR): 光学字符识别,该功能可从图像中提取打印或手写的文本。您可以从图像中提取文本,例如车牌照片或带有序列号的容器,以及文档(发票,账单,财务报告,物品等)中的文本。

Object detection : 对象检测类似于标记,但是API返回找到的每个对象的边界框坐标(以像素为单位)。例如,如果图像包含狗,猫和人,则“检测”操作将列出这些对象及其在图像中的坐标。 您可以使用此功能来处理图像中对象之间的关系。 它还使您可以确定图像中是否存在同一标签的多个实例。

Text Analytics:一种AI服务,可在非结构化文本中发现洞察力,例如情感,实体和关键短语

Natural Language Processing(NLP):自然语言处理(NLP)用于执行诸如情感分析,主题检测,语言检测,关键词提取和文档分类之类的任务。NLP可用于对文档进行分类,例如将文档标记为敏感或垃圾邮件。 NLP的输出可用于后续处理或搜索。 NLP的另一个用途是通过识别文档中存在的实体来汇总文本。 这些实体还可以用于用关键字标记文档,从而可以基于内容进行搜索和检索。 实体可以合并为主题,摘要描述每个文档中存在的重要主题。 检测到的主题可以用于对文档进行分类以进行导航,或者在给定所选主题的情况下枚举相关文档。 NLP的另一种用途是对文本进行情感评分,以评估文档的正面或负面基调。

Key phrase extraction : 关键短语提取技能可评估非结构化文本,并为每条记录返回关键短语列表。

Named Entity Recognition(NER): 命名实体识别(NER)是在文本中标识不同实体并将其分类为预定义类或类型的能力,例如:人员,位置,事件,产品和组织。

Sentiment Analysis:情感分析功能,可评估文本并返回每个句子的情感分数和标签。 这对于检测社交媒体,客户评论,论坛等中的正面和负面情绪很有用。

Translator:转换器是基于云的机器翻译服务,并且是用于构建智能应用程序的Azure认知服务认知API系列的一部分。 转换器易于集成到您的应用程序,网站,工具和解决方案中。 它使您可以添加70多种语言的多语言用户体验,并且可以在具有任何操作系统的任何硬件平台上用于文本翻译。

Language Detection:语言检测技能可检测输入文本的语言,并针对请求提交的每个文档报告一个语言代码。 语言代码与指示分析强度的分数配对。

Speech recognition and speech synthesis:语音识别和合成样本,语音识别确实是一种令人称奇的人类能力,尤其是当您认为正常对话需要每秒识别10到15个音素时。事实证明,尝试制造机器(计算机)识别系统很困难。另一方面,各种语音合成系统已经使用了一段时间。尽管功能有限且通常缺乏人类语音的自然质量,但这些系统现在已成为我们生活中的常见组成部分。

Classification : 分类,是一种机器学习方法,它使用数据来确定项目或数据行的类别,类型或类别。 例如,您可以使用分类来:将电子邮件过滤器分类为垃圾邮件,垃圾邮件或良品。确定患者的实验室样本是否癌变。根据客户对销售活动的响应倾向对其进行分类,确定情绪是正面还是负面。

Regression : 回归,是一种广泛用于从工程到教育的领域的方法。 例如,您可以使用回归来基于区域数据来预测房屋的价值,或者创建有关未来入学人数的预测。

Clustering: 聚类,是一种将数据点分组为相似聚类的方法。

Cross-Validate Model: 交叉验证模型模块将带有标签的数据集以及未经训练的分类或回归模型作为输入。 它将数据集划分为一定数量的子集(折叠),在每个折叠上构建模型,然后为每个折叠返回一组准确性统计信息。 通过比较所有折痕的准确性统计信息,您可以解释数据集的质量并了解模型是否易受数据变化的影响。

Anomaly Detection: 异常检测,包含机器学习中的许多重要任务:确定潜在的欺诈交易。指示已发生网络入侵的学习模式。寻找异常患者群。检查输入到系统中的值。根据定义,异常是罕见事件,因此很难收集代表性的数据样本用于建模,可通过使用不平衡的数据集来解决构建和训练模型的核心挑战。

QnA Makter :QnA Maker。 该认知服务支持创建和发布具有内置自然语言处理功能的知识库。可轻松在您的数据上创建自然的对话层。 它可用于从您的自定义知识库(KB)信息中为任何给定的自然语言输入找到最合适的答案。使用此认知服务,你可以快速构建一个可以问答知识库,用它构成用户和 AI 代理之间对话的基础。

Azure Bot Service: 专为机器人开发而构建的托管服务
Conversation AI: 会话式AI是计算中的下一个用户界面(UI)浪潮。 我们已经从必须学习和适应计算机的世界演变为现在正在学习如何理解和与我们互动的计算机。 与计算机的自然交互从语言,语音和语义理解开始,并通过支持丰富的多模型交互而继续。

Language Understand (LUIS), 语言理解(LUIS)是基于云的对话式AI服务,将定制的机器学习智能应用于用户的对话式自然语言文本,以预测整体含义并提取相关的详细信息。LUIS的客户端应用程序是任何以自然语言与用户通信以完成任务的会话应用程序。客户端应用程序的示例包括社交媒体应用程序,AI聊天机器人和启用语音的桌面应用程序。

Text Analytics一种AI服务,可在非结构化文本中发现洞察力,例如情感,实体和关键短语。

Ink Recognizer: 一种AI服务,可识别数字墨水内容,例如手写,形状和墨水文档布局。

Form Recognizer: 由AI驱动的文档提取服务可以理解您的表格。

Cortana: Cortana是Microsoft的个人生产力助手,可以帮助您节省时间并将精力集中在最重要的事情上。

Principles for Responsible AI:指导AI开发和使用的六项原则:公平性,可靠性和安全性,隐私性和安全性,包容性,透明度和问责制。

  • Fairness: 公平性,人工智能系统应公平对待每个人,并避免以不同方式影响处境相似的人群。例如,假设你创建了一个机器学习模型来为银行的贷款审批应用程序提供支持。 该模型应在不考虑任何基于性别、种族或其他因素的偏见的情况下,对是否应批准贷款做出预测,这些偏见可能导致特定的申请人群遭受不公平的差别待遇。
  • Reliability and safety: 可靠性和保障性,AI 系统应可靠且安全地运行。 例如,大家思考一下基于 AI 的自动驾驶软件系统,或诊断患者症状并推荐处方的机器学习模型这些案例。 这些系统一旦出现不可靠性,就可能会给生命安全带来重大风险。
  • Privacy and security:隐私性和安全性,AI 系统应该保护并尊重隐私。 AI 系统所基于的机器学习模型依赖于大量数据,这些数据可能包含必须保密的个人详细信息。 即使对模型进行了训练且系统已投入生产,它仍可能在使用新数据进行预测或采取行动时侵犯隐私或安全。
  • Inclusiveness,包容性,包容性设计实践可以帮助系统开发人员理解和解决产品环境中可能无意排除人员的潜在障碍。 AI 系统应该成为人们的有力助手,并与人互动。 AI 应不分身体能力、性别、性取向、种族或其他因素,造福社会各个阶层。
  • Transparency, 透明度,透明度的关键部分是我们所说的可理解性,即对AI系统及其组件的行为的有用解释。要提高清晰度,就要求利益相关者理解其工作方式和原因,以便识别潜在的性能问题,安全和隐私问题,偏见,排他性做法或意想不到的结果。AI 系统应该是可理解的。 应让用户能充分了解系统的用途、工作方式以及局限性。
  • Accountability,问责制,设计和部署AI系统的人员必须对其系统的运行方式负责。组织应借鉴行业标准来制定问责制规范。应有相关人员对 AI 系统负责。 设计和开发基于 AI 的解决方案的人员应在管理和组织原则的框架内工作,以确保解决方案符合定义明确的道德和法律标准。

Azure Kubernetes Service (AKS):Azure Kubernetes服务(AKS)使在Azure中部署托管Kubernetes群集变得简单。 AKS通过将大部分责任转移给Azure来降低管理Kubernetes的复杂性和运营开销。作为托管的Kubernetes服务,Azure可为您处理关键任务,例如运行状况监视和维护。 Kubernetes母版由Azure管理。您仅管理和维护代理节点。实时节点必须部署在AKS集群上。

3.2 模拟考试

整理完上面的名词解释,准备工作就算到位了,最后就是找份模拟题练练手。由于AI-900的认证考试是近期刚推出的,所以网上没有太多的复习资料,也没有什么攻略。

我发现的免费模拟题只有CertBolt网站上提供了,可以用 CertBolt Microsoft AI-900 模拟题库,共有55道题目。另外,在qubits42网站上有20模拟题,链接已经不能访问了。我整理成了AI模拟题PDF文件供大家下载,练习一下也就够用了。

毕竟是初级认证,考试都是基础知识,按照微软的文档进行复习准备,大概率都是可以通过的,本文的目的也是帮助大家准备考试,做到心中有底。

3.3 现场考试

最后,就是按照约好的时间,去考试中心完成考试,要带2种证明身份的证件。进到考场后,包要存起来,不能带任何东西,不能吃东西,不能喝水,不能与其他人说话等等,可以提前交卷。交卷后,找工作人员,拿到考试评估单,就可以回家庆祝了。与AZ-900的现场考试流程一样,大家可以参考文章AZ-900认证考试攻略

本文主要是记录一下考试的前后经历,对于IT的小伙伴们,考个认证系统地学习知识,还是很有用的。未来的成就,都是之前的积累,爆发就在未来的某个瞬间。祝大家考试顺利!

刚刚又获得一张免费考试券,下一个要考啥呢!微软会一直从知识上面鞭策我们学习。

转载请注明出处:
http://blog.fens.me/certificate-ai900/

打赏作者

选择下一版Microsoft Edge 的十大理由

ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者

  • 张丹(Conan), 程序员/Quant: Java,R,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/microsoft-edge-10-reasons

前言

Microsoft Edge这个主题,是在MITT深圳大会上我进行分享的一个主题,不是我所擅长,属于M365的主题。但是我很好奇心,想看看Edge到底是什么。我虽然一直在使用浏览器,但大部分时间都是被chrome占据着,并没有对Edge有太多的关注。在大会前收到了微软MVP组招募新的产品讲师,本着兴趣和好奇,接下了这个主题。在分享后,我也已经开始尝试下一代的Edge为办公的便利性体验了。

目录

  1. 下一版Microsoft Edge 介绍
  2. 下一版Microsoft Edge 的10大特性

1. Microsoft Edge 介绍

下一版Microsoft Edge是面向企业的一个浏览器Microsoft Edge for business,它的定位与Chrome面向个人的浏览器的定位有很大的差别。本次大会分享获得了一些微软官方的材料的支持,我也仔细的学习了一下,然后转换成了中文的材料,写出本文给大家介绍一下。MITT大会分享的材料,PPT下载

尽管Microsoft Edge for business仍处于预览阶段,但已发布beta版本可以日常使用了,下载Microsoft Edge for business。在Beta版本中,您将看到个性化您的体验的新方法以及对14种语言的支,有新的标签页自定义功能,可以设置布局来选择打开新网页时想要看到的内容。还可以通过插件商店或其它基于铬的网上商店,如Chrome网上应用店,添加自己喜欢的扩展。

2. 下一代 Microsoft Edge 的10大特性

2.1 新旅程
下一代的Microsoft Edge浏览器,有了新的定位服务于企业用户的浏览器。主要的工作,不是解决过去五年的问题,而是未来五年可能会出现的问题。同时,区别于个人原来的理念,浏览的图标也有了新的变化,目前Edge还是在beta阶段。

2.2 无缝访问您所需的信息
我们每次更换电脑时,都会重新安装浏览器,在之前浏览器所积累的书签,积累的账户登录信息,使用习惯随着更换新的浏览器,这些重要个人数据都就丢失了。这种丢失在个人浏览器可能并不会有太大的影响,但是做为办公来说,重要的书签或者资料丢失,就会带来非常大的不便。

为解决这一问题,企业级的Edge提供了账户系统,通过登录浏览器账户,来保留用户的行为,以及重要的数据。在更换新的电脑或新的浏览器的时候,通过重新登陆个人账户,你的之前的行为就会恢复出来,让新的浏览器和你之前的浏览器是操作起来是完全一样的,不存在改变习惯变。

对于安全性来说,这个账户系统可以和本地计算机的开机账户绑定到一起,所以如果你信任了Windows操作系统,那么你就可以信任这个账号绑定,为你带来的便利。

使用企业级的Edge在绑了账户系统后,你还可以把Edge当成工作台桌面,他会记录你在本地系统中都做了哪操作,打开了哪些OneDrive文件等。这样就整体打通了Web操作和PC操作,让使用习惯进行合并。

2.3 找到你的东西
每次互联网都会产生大量数据,企业自身也会产生大量的数据,息无处不在,海量且巨大。据IDC预测到2025年,信息数据会到163ZB,也就是10e6的PB。这些数据有90%的数据是需要安全保护的,数据会分散的全球的各种设备中进行存储,人们工作可能要有20%以上的要用来找到有用的信息。

下一代的Edge设计,把互联网搜索与隐私搜索进行结合,基于微软的云解决方案中,当你在bing进行搜索时,你不仅可以获得互联网的搜索结果,同时你还可以获得你账户的访问权限的私有数据搜索结果。这是非常方便的,让浏览器来帮助你管理你的数据访问权限。

2.4 任何地方,任何设备
人们的生活已经离不开互联网了,工作时,在家里,旅游时,我们会用到电脑,手机,平板,电视等各种设备。Edge的目标是在所有的操作系统上,都可以进行安装,进行网络的接入。

2.5 安全性
我们在使用某些网络应用时,通常都需要保持登陆状态的,一旦我们切换到一个新的网站时,之前服务的登陆信息是不应该被带入新的网站的。比如,我们使用浏览器打开了gmail,这时邮件里有一个链接是登陆到第三方未知系统。我们在不确定的情况下,很容易就会去点击这个链接,一方面可能会泄露个人信息,另一方面也可能会点到病毒。

Edge的安全性策略,就是在我们进行不同网站的,访问权限切换时多做一层拦截,进行网站病毒的提示,或者隐私泄露的安全性提示。

2.6 简化管理
当浏览器变为工作台时,需要具备多种功能,通常安装各种各样的插件,来让支持使用。那么插件管理,工具管理就会变得比较复杂,目前chrome浏览器也存在类似的问题。

下一代的Edge增加了一个去端浏览器的特性,基于Azure让一些云端的插件,可以直接嵌入在Edge的工作环境,不仅简化了复杂的管理,更不用费劲云自己找到这些插件。

2.7 可信赖的服务

这个特性我认为是最重要的一特征,互联网上有大量的没有道德底线的公司在肆无忌惮的盗取用户隐私信息,而且已经开成的黑色产业。

Edge作为用户的企业办公级浏览器,将承担着大量的用户行为和企业隐私,那么只有自己的企业品牌和管理机制,才能保证用户对浏览器的使用是可信的。Edge提出了自己的可信服务的3个核心:

  • 对第三方不开放:保证用户行为的隐私,广告永远不会根据您的工作场所身份定位到您
  • 微软的企业同步:提供企业的账户同步,符合GDPR和Tier C标准
  • 微软的企业搜索:建立基于微软的企业搜索服务,企业搜索受到我们发布的信任措施的保护和保护

2.8 应用支持
要做到一个好的浏览器,是需要一个好的生态支持的,是一段很长的旅程。Edge对应用有3点主要的支持,包括应用程序保证,快速通道部署协助,和统一/高级支持。

Edge生态中有足够多的插件支持,可以通过Edge商店下载插件,也可以通过Chrome商店下载插件,并支持插件的快速开发和插件的快速部署,

2.9 最好的现代网络工具
Edge对于开发人员是友好的,我们可以基于Edge就完成很多的网络编程。Edge把自己定位为一个通用的开发平台,包括网络标准的支持,插件扩展的支持(PWA),渐进式Web就算程序的支持,和Web开发工具的集成,Web Driver和Selenium。

2.10 向左回退
基于H5的标准,浏览器的前进和后退,可以通过history API进行编程控制访问。但有些时候,这个H5特性会导致一些页面刷新失败。所以,Edge试图解决这个问题,当没有使用history编程时,浏览器也自动识别向左回退和向右前进。

总结一下,从Microsoft Edge for Business的规划来看,真的很有吸引力,明确地捕捉到了企业办公浏览和个人浏览的差异化需求。这是一项长期的任务,希望真的能像描述一下,做出一个好的企业级浏览器。

转载请注明出处:
http://blog.fens.me/microsoft-edge-10-reasons

打赏作者

在Ubuntu中安装Docker

Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者:

  • 张丹, 程序员R,Nodejs,Java
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/linux-docker-install/

ubuntu-docker

前言

网上已经有很多介绍Docker安装的文章,自己的安装过程记录一下,为了博客文章结构的连贯性,为写下一篇R和Docker的相遇做为环境基础,同时也给自己一个备忘。

目录

  1. Docker是什么?
  2. 在Linux Ubuntu中安装Docker
  3. Docker镜像仓库
  4. 制作自己的Docker镜像
  5. 上传Docker镜像到公共仓库

1. Docker是什么?

在互联网圈混,如果还不知道Docker你就out了。从2014年开始,docker技术在互联网技术中异军突起,2015-2016年很多公司已经对Docker开始大量研究和应用。

Docker是什么?Docker是一个开源的应用容器引擎,系统级的轻量虚拟化技术,为应用程序的自动化部署提供解决方案。

你可以快速创建一个容器,并在容器上开发和运行你们的应用程序,通过配置文件可以轻松实现应用程序的自动化安装、部署和升级。

Docker的优势

Docker倍受业界追捧,必然有它非常明显的优势和特点。

  • 轻量级资源:容器是在进程级别隔离,并使用宿主机的内核,而不需要虚拟化整个操作系统。不需要虚拟化和系统调用复杂的操作。因此节省了很大的额外开销。不需要额外的hypervisor(虚拟化技术)支持,不需要虚拟硬件,不需要额外完整的系统。
  • 可移植性:所需要的应用都在容器中,可以在任意一台docker主机上运行
  • 可预测性:宿主机和容器相互不关心对方都运行什么。只考虑所需的接口标准化。

再不动手把Docker用上,你就真的out了。

2. 在Linux Ubuntu中安装Docker

安装Docker只需3步,下载Docker, 安装Docker,检查Docker是否成功。

Docker目前支持主流的3种操作系统的Linux, Mac, Windows的环境,本文使用的Linux系统环境为:Linux Ubuntu 14.04.4 LTS 64bit。在Ubuntu中下载和安装Docker可以直接用apt-get搞定。

由于Docker在1.7.1以后的版本指定了自己的源,所以我们需要先在APT中配置Docker的源。

更新APT的源,安装https和ca证书的库,默认这2个库都已经装了。


~ sudo apt-get update
~ sudo apt-get install apt-transport-https ca-certificates

添加秘钥GPG到APT配置中。


~ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

增加Docker的源到/etc/apt/souces.list文件中,我的版本是14.04对应ubuntu-trusty。


~ sudo vi /etc/apt/sources.list

# 增加到最后一行
deb https://apt.dockerproject.org/repo ubuntu-trusty main

接下来,就可以用可以用apt-get直接安装Docker了。


~ sudo apt-get update
~ sudo apt-get install docker-engine

安装完成,默认会启动Docker。


# 检查docker服务
~ service docker status
docker start/running, process 10013

# 检查docker进行
~ ps -aux|grep docker
root     10013  0.0  1.0 424948 40584 ?        Ssl  22:29   0:00 /usr/bin/dockerd --raw-logs
root     10022  0.0  0.2 199680 10280 ?        Ssl  22:29   0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shimdocker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc

# 检查docker版本
~ sudo docker version
Client:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 05:22:43 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 05:22:43 2016
 OS/Arch:      linux/amd64

检查Docker是否成功,运行hello-world。如果出现下面的信息,表示Docker引擎安装成功。


~ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete 
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

注意:我们在执行上面的命令的时候,经常会遇到一个错误。Cannot connect to the Docker daemon. Is the docker daemon running on this host?

比如,直接输入 docker run hello-world 命令。


~ docker run hello-world
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

这是由于权限的问题,docker默认和root权限绑定,如果不加sudo时则没有权限。

3. Docker镜像仓库

对于上面我们执行的docker run hello-world命令,是什么意思呢?

把3个词分开来看,docker代表docker程序,run代表命令,hello-world代表镜像。就是用docker启动hello-world镜像。由于我们刚装好的docker,本地并没有镜像,那么run的命令会对docker远端的仓库中,找到名叫hello-world的镜像,然后下载到本地,再运行。

Docker官方的镜像仓库访问地址:https://hub.docker.com/

我们可以在Docker官方的仓库中,搜索你感兴趣的系统、语言、技术框架等,有很多的技术都已经被docker化了。我们就可以很方便地用别人已经做好的容器,站在前人的基础上继续工作。

docker-repo

从列表中点开一项后,会有对这个镜像的详细介绍。比如,Ubuntu的镜像。

docker-repo2

如果我们想要下载这个镜像,只需要按照他的提示,在命令行输入 docker pull ubuntu 这样就行了。


~ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
2f0243478e1f: Pull complete 
d8909ae88469: Pull complete 
820f09abed29: Pull complete 
01193a8f3d88: Pull complete 
Digest: sha256:8e2324f2288c26e1393b63e680ee7844202391414dbd48497e9a4fd997cd3cbf
Status: Downloaded newer image for ubuntu:latest

下载好后镜像,会保存在本地的仓库中。查看本地的镜像。


~ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f8d79ba03c00        2 weeks ago         126.4 MB
hello-world         latest              c54a2cc56cbb        7 weeks ago         1.848 kB

目前,有2个本地镜像,一个是hello-world,另一个是ubuntu。

4. 制作自己的Docker镜像

我们也可以制作自己的镜像,然后上传到官方的仓库中,让更多的人来使用。如果要制作自己的Docker镜像,你只需要写一个Dockerfile文件就行了。

下面我们创建一个能进行网络访问的Docker,从http://fens.me网站抓取最新8篇的文章列表,并打印到控制台。

docker-curl-fensme

创建项目目录


~ mkdir fensme && cd fensme

创建Dockerfile,依赖于上文中下载的ubuntu镜像,还要需要安装curl库用于网页抓取,同时用于jq库解析JSON数据。


~ vi Dockerfile

FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl jq
CMD curl http://api.fens.me/blogs/ | jq .[]

打包,创建名为fensme的镜像。


# 打包
~ sudo docker build -t fensme .

# 查看镜像列表
~ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
fensme              latest              41b68972b35a        4 minutes ago       182.8 MB
ubuntu              latest              f8d79ba03c00        2 weeks ago         126.4 MB
hello-world         latest              c54a2cc56cbb        7 weeks ago         1.848 kB

运行fensme的镜像,这样就实现了网站数据的抓取。


~ sudo docker run fensme
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1421  100  1421    0     0    715      0  0:00:01  0:00:01 --:--:--   715
{
  "title": "R语言解读自回归模型",
  "date": 20160819,
  "link": "http://blog.fens.me/r-ar/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/08/r-ar.png"
}
{
  "title": "R语言量化投资常用包总结",
  "date": 20160810,
  "link": "http://blog.fens.me/r-quant-packages/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/08/quant-packages.png"
}
{
  "title": "R语言跨界调用C++",
  "date": 20160801,
  "link": "http://blog.fens.me/r-cpp-rcpp",
  "img": "http://blog.fens.me/wp-content/uploads/2016/08/rcpp.png"
}
{
  "title": "R语言解读多元线性回归模型",
  "date": 20160727,
  "link": "http://blog.fens.me/r-multi-linear-regression/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/07/reg-multi-liner.png"
}
{
  "title": "R语言解读一元线性回归模型",
  "date": 20160725,
  "link": "http://blog.fens.me/r-linear-regression/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/07/reg-liner.png"
}
{
  "title": "R语言中文分词包jiebaR",
  "date": 20160721,
  "link": "http://blog.fens.me/r-word-jiebar/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/07/jiebaR.png"
}
{
  "title": "2016天善智能交流会第22场: R语言为量化而生",
  "date": 20160704,
  "link": "http://blog.fens.me/meeting-hellobi-20160701/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/07/meeting-hellobi.png"
}
{
  "title": "R语言为量化而生",
  "date": 20160703,
  "link": "http://blog.fens.me/r-finance/",
  "img": "http://blog.fens.me/wp-content/uploads/2016/07/r-finance.png"
}

这个例子,我们通过Docker封装了一个非常简单的爬虫,当你需要的时候启动它,把结果写到数据库中。当执行完任务,系统资源就释放了,你需要再为它考虑。

比较简单地就可以把一个技术或一个功能Docker化,从而构建出个性化的Docker。

5. 上传Docker镜像到公共仓库

最后一步,其实就是把我们做好的Docker镜像上传到官方的仓库中,让其他的人也可以使用。

首先需要去docker hub上面注册一个账号,然后登录进去。

docker-hub-login

在docker hub上,创建一个自己的仓库。

docker-hub-create

在本地操作系统,绑定docker hub的账号


~ sudo docker login --username=bsspirit --email=bsspirit@163.com
Flag --email has been deprecated, will be removed in 1.13.
Password: 
Login Succeeded

接下来,要你刚才创建的fensme的镜像加上命名空间,对应该docker hub上面镜像名bsspirit/fensme。


# 给fensme增加命名空间
~ sudo docker tag 8496b10e857a bsspirit/fensme:latest

~ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
bsspirit/fensme     latest              8496b10e857a        About a minute ago   182.8 MB
fensme              latest              8496b10e857a        15 minutes ago       182.8 MB
ubuntu              latest              f8d79ba03c00        2 weeks ago          126.4 MB
hello-world         latest              c54a2cc56cbb        7 weeks ago          1.848 kB

上传bsspirit/fensme镜像,然后你就可以在docker hub的网站上看到你自己的镜像了。


~ sudo docker push bsspirit/fensme
The push refers to a repository [docker.io/bsspirit/fensme]
d9c50c22842b: Pushed 
4699cbd1a947: Pushed 
2bed5b3ec49f: Pushed 
3834bde7e567: Pushed 
d8d865b23727: Pushed 
latest: digest: sha256:bfea736a92b6e602d6bbca867715b0e985f2e9bc3ea4a75b545d7e009e22ac2b size: 1362

打开docker hub网站,刷新页面。

docker-repo3

最后,如果其他人需要使用这个docker镜像,像最开始介绍的,直接下载运行就可以了。


~ sudo docker run bsspirit/fensme

通过上面的操作,我们就把Docker在Linux Ubuntu中的系统安装完成。

转载请注明出处:
http://blog.fens.me/linux-docker-install/

打赏作者

用阿里云配置VPN

操作系统实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/vpn-aliyun/

aliyun-vpn

前言

每次配置虚拟机的网络环境,都要花不少的时间,这次在阿里云上捣鼓VPN又出了岔子,VPN映射的网段和阿里云的虚拟机内网网段重叠了,而且阿里云自动做了路由,导致VPN路由失效。

本文将总结一下阿里云配置VPN的问题,估计自己以后也会经常回来翻看的。

目录

  1. 网络架构
  2. 遇到的问题
  3. 如何解决问题

1. 网络架构

要开发一个互联网应用,通常我们都需要购买服务器,部署自己应用然后托管到机房。对于刚起步的小公司来说,买服务器到托管到机房成本有点高,而且可能资源用不完,这时我们就有了一个更便宜的选择就是先租虚拟主机,阿里云就提供了这种服务。当然,和国外的主机服务商比阿里云还是很贵的,而且服务还有一些差距,但和国外的其他服务商比,也只能选阿里云了。

通常在阿里云租的虚拟主机,都会包括一个外网IP(121.x.x.x)和一个内网IP(10.x.x.x),外网IP主要面向互联网的访问,内网IP可以让内网的多台计算机通过内网进行通信。

接下来,我们会对应用进行分层,有用于数据存储的服务器(大硬盘),有用于计算的服务器(CPU密集型),有用于用户访问服务器(IO密集型)。另外,对于私密性比较高的数据或应用,我们通常用到VPN进行加密访问,从而保证传输过程的安全。

aliyun

我们一旦建立VPN连接,所有外网网络访问都将走VPN的加密通道,VPN通常只是小型私密网络,所以互联网的访问连接将会被切断。那么当互联网的访问被切掉到了,我们用Putty远程连接VPN的主机,也会访问不到了,这时就需要通过内网其他主机进行代理连接。比如,当Aliyun1打开VPN后,我们就不能直接通过Putty连接了,需要先用Putty登陆Aliyun2,再通过Aliyun2走内网登陆到Aliyun1。

对于虚拟主机来说,即使只租用一台服务器也可以实现VPN的连接。当服务器进行了VPN连接,你可以从宿主机管理控制台,对连接VPN的计算机进行操作。阿里云也提供了这个功能,可以通过网页直接登陆。

aliyun-2

2. 遇到的问题

上面我们介绍的,都是标准的VPN访问流程。那么,我其实遇到了一个问题,就是阿里云的内网IP网段是10.x.x.x,连接VPN生成的私密网络的网段也是10.x.x.x,这时就造成了IP网段冲突。每个网卡都需要配置IP地址,网关,子网掩码,DNS服务器等,如果内网和外网的网段或IP发生冲突,而且两边的网络服务都不能进行修改,那么就直接无解了。幸运的是,只是A类的地址冲突了,而且B类,C类,D类的地址没有冲突。那么,可以通过把网断进行不同的映射,配置网关和路由。

其实,发现上面的问题,也是花了一些时间的。

我们先看阿里云主机的默认网络配置。


~ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:00:36:37
          inet addr:10.169.0.162  Bcast:10.169.7.255  Mask:255.255.248.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:109 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:9597 (9.5 KB)  TX bytes:6767 (6.7 KB)

eth1      Link encap:Ethernet  HWaddr 00:16:3e:00:3d:3b
          inet addr:121.41.77.206  Bcast:121.41.79.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2294 errors:0 dropped:0 overruns:0 frame:0
          TX packets:151 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:108919 (108.9 KB)  TX bytes:12624 (12.6 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

~ cat /etc/resolv.conf
options timeout:1 attempts:1 rotate
nameserver 10.202.72.118
nameserver 10.202.72.116

~ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         121.41.79.247   0.0.0.0         UG    0      0        0 eth1
10.0.0.0        10.169.7.247    255.0.0.0       UG    0      0        0 eth0
10.169.0.0      *               255.255.248.0   U     0      0        0 eth0
100.64.0.0      10.169.7.247    255.192.0.0     UG    0      0        0 eth0
121.41.76.0     *               255.255.252.0   U     0      0        0 eth1
172.16.0.0      10.169.7.247    255.240.0.0     UG    0      0        0 eth0

安装及配置VPNC


# 安装VPNC
~ apt-get install vpnc

# 配置文件
~ vi /etc/vpnc/default.conf

IPSec gateway xxx.com
IPSec ID xxx
IPSec obfuscated secret xxxxxxxxx
Xauth username xxx
Xauth password xxxxxx

启动VPN连接。


~ vpnc
Stopped Name Service Cache Daemon: nscd.
 * Starting Name Service Cache Daemon nscd                                             [ OK ]
VPNC started in background (pid: 1543)...

查看网站连接,会多出tun0的网卡,分配的IP地址为10.1.15.228。


~ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:00:36:37
          inet addr:10.169.0.162  Bcast:10.169.7.255  Mask:255.255.248.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1727 errors:0 dropped:0 overruns:0 frame:0
          TX packets:551 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:103050 (103.0 KB)  TX bytes:70120 (70.1 KB)

eth1      Link encap:Ethernet  HWaddr 00:16:3e:00:3d:3b
          inet addr:121.41.77.206  Bcast:121.41.79.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:128289 errors:0 dropped:0 overruns:0 frame:0
          TX packets:649 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5435081 (5.4 MB)  TX bytes:82302 (82.3 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.15.228  P-t-P:10.1.15.228  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1412  Metric:1
          RX packets:40 errors:0 dropped:0 overruns:0 frame:0
          TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:3328 (3.3 KB)  TX bytes:11016 (11.0 KB)

通过情况下,这样的配置已经生效了,VPN也连接正常,但VPN网络确无法访问。


~ ping testvpn
ping: unknown host testvpn

第一感觉是DNS出问题了,查看DNS还是原来的内容,没有发生变化。


~ cat /etc/resolv.conf
options timeout:1 attempts:1 rotate
nameserver 10.202.72.118
nameserver 10.202.72.116

通常VPN连接的时候,都会配置一个新的DNS,那么我们把这个DNS设置成自动更新的。


~ dpkg-reconfigure resolvconf

同时,修改tail文件,设置一个更快速的阿里云DNS服务器。


vi /etc/resolvconf/resolv.conf.d/tail

nameserver 223.5.5.5
nameserver 223.6.6.6

断开VPN再重连接VPN


~ vpnc-disconnect
Terminating vpnc daemon (pid: 1543)

~ vpnc
Stopped Name Service Cache Daemon: nscd.
 * Starting Name Service Cache Daemon nscd                                             [ OK ]
VPNC started in background (pid: 2111)...

再次查看DNS的配置,我们看到/etc/resolv.conf已经会自动更新了。


cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.1.1.1
nameserver 10.1.1.2
search xxx.test.cn
nameserver 223.5.5.5
nameserver 223.6.6.6

但通过VPN网络还是无法访问。


~ ping testvpn
ping: unknown host testvpn

检查路由表


 route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         U     0      0        0 tun0
10.0.0.0        10.169.7.247    255.0.0.0       UG    0      0        0 eth0
10.1.15.0       *               255.255.255.0   U     0      0        0 tun0
10.169.0.0      *               255.255.248.0   U     0      0        0 eth0
100.64.0.0      10.169.7.247    255.192.0.0     UG    0      0        0 eth0
121.41.76.0     *               255.255.252.0   U     0      0        0 eth1
172.16.0.0      10.169.7.247    255.240.0.0     UG    0      0        0 eth0
vpn.test.com    121.41.79.247     255.255.255.255 UGH   0      0        0 eth1

这个时候就发现了,由VPN生成的10.1.15.0被强制使用了阿里云的10.0.0.0 的路由10.169.7.247,检查网卡配置文件/etc/network/interfaces。


~  cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
address 121.41.77.206
netmask 255.255.252.0
up route add -net 0.0.0.0 netmask 0.0.0.0 gw 121.41.79.247 dev eth1

auto eth0
iface eth0 inet static
address 10.169.0.162
netmask 255.255.248.0

up route add -net 172.16.0.0 netmask 255.240.0.0 gw 10.169.7.247 dev eth0
up route add -net 100.64.0.0 netmask 255.192.0.0 gw 10.169.7.247 dev eth0
up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.169.7.247 dev eth0

最后一行发现了问题。

up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.169.7.247 dev eth0

这个网段的10.0.0.0所有IP统一会使用10.169.7.247的网关,怪不得VPN始终不通,原来是阿里云服务器默认的配置造成的问题。

3. 如何解决问题

只要定位到了问题,解决就不难。

我们看到由于阿里云的内网是10.x.x.x的,我们的几台服务器也分别是10.168.x.x, 10.169.x.x, 10.200.x.x, 10.251.x.x,我估计它是从10.1.x.x到10.255.x.x都配置了网络,所以直接对A类网段进行了配置。通过VPN生成的IP为10.1.15.228,从B类网段开始刚好与阿里云租的机器不重合,那么我们重新定义阿里云的网段配置就行了,对B类网段做映射。

修改文件 /etc/network/interfaces。


~ vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
address 121.41.77.206
netmask 255.255.252.0
up route add -net 0.0.0.0 netmask 0.0.0.0 gw 121.41.79.247 dev eth1

auto eth0
iface eth0 inet static
address 10.169.0.162
netmask 255.255.248.0

up route add -net 172.16.0.0 netmask 255.240.0.0 gw 10.169.7.247 dev eth0
up route add -net 100.64.0.0 netmask 255.192.0.0 gw 10.169.7.247 dev eth0
#up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.169.7.247 dev eth0

up route add -net 10.200.0.0 netmask 255.255.0.0 gw 10.169.7.247 dev eth0
up route add -net 10.168.0.0 netmask 255.255.0.0 gw 10.169.7.247 dev eth0
up route add -net 10.169.0.0 netmask 255.255.0.0 gw 10.169.7.247 dev eth0
up route add -net 10.251.0.0 netmask 255.255.0.0 gw 10.169.7.247 dev eth0

重启网卡


~ /etc/init.d/networking restart

竟然是无效的命令,只能重启计算机了。


~ reboot

重启后,查看路由表。


~ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         121.41.79.247   0.0.0.0         UG    0      0        0 eth1
10.168.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.169.0.0      *               255.255.248.0   U     0      0        0 eth0
10.169.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.200.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.251.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
100.64.0.0      10.169.7.247    255.192.0.0     UG    0      0        0 eth0
121.41.76.0     *               255.255.252.0   U     0      0        0 eth1
172.16.0.0      10.169.7.247    255.240.0.0     UG    0      0        0 eth0

对B类网段的配置已经生效,已经去除了对A类10网段的配置。

连接VPN。


~ vpnc
Stopped Name Service Cache Daemon: nscd.
 * Starting Name Service Cache Daemon nscd                                             [ OK ]
VPNC started in background (pid: 1368)...

查看路由表


~ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         U     0      0        0 tun0
10.1.15.0       *               255.255.255.0   U     0      0        0 tun0
10.168.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.169.0.0      *               255.255.248.0   U     0      0        0 eth0
10.169.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.200.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
10.251.0.0      10.169.7.247    255.255.0.0     UG    0      0        0 eth0
100.64.0.0      10.169.7.247    255.192.0.0     UG    0      0        0 eth0
121.41.76.0     *               255.255.252.0   U     0      0        0 eth1
172.16.0.0      10.169.7.247    255.240.0.0     UG    0      0        0 eth0
vpn.test.com    121.41.79.247   255.255.255.255 UGH   0      0        0 eth1

10.1.15.0由VPN生成的IP,没有被强制路由。

连接VPN内网计算机


~ ping testvpn
PING testvpn.xxx.com.cn (10.1.1.13) 56(84) bytes of data.
64 bytes from testvpn.xxx.com.cn (10.1.1.13): icmp_seq=1 ttl=127 time=39.5 ms
64 bytes from testvpn.xxx.com.cn (10.1.1.13): icmp_seq=2 ttl=127 time=40.4 ms

终于访问正常了,这样就完成了,通过阿里云连接VPN服务的网络配置。

本文主要记录了网络调试的一系列操作,阿里云在方便易用的同时,也会有一些额外的问题,需要大家有更多的Linux使用经验,从而有能力解决各种的VM技术问题。

转载请注明出处:
http://blog.fens.me/vpn-aliyun/

打赏作者