chenzhigang 2017-09-14T02:19:16+00:00 https://chenzhigang.github.io/ BrainFuck编译器 2014-09-09T00:00:00+00:00 chenzhigang http://chenzhigang.github.io//2014/09/BrainFuck ###BrainFuck编译器的java实现

#####Brainfuck简介

  • Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF。

  • 这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

    下面是这八种状态的描述,其中每个状态由一个字符标识:

  字符 含义

  > 指针加一

  < 指针减一

  + 指针指向的字节的值加一      - 指针指向的字节的值减一      . 输出指针指向的单元内容(ASCII码)

  , 输入内容到指针指向的单元(ASCII码)

  [ 如果指针指向的单元值为零,向前跳转到对应的]指令的次一指令处

  ] 如果指针指向的单元值不为零,向后跳转到对应的[指令的次一指令处

  (按照更节省时间的简单说法,”]”也可以说成“向后跳转到对应的”[“状态”。这两解释是一样的。)

  (第三种同价的说法,”[“意思是”向前跳转到对应的”]”“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。”)

   /**
     * BrainFuck 编译器
     *
     * @author: chenzhigang
     * @version:
     * date: 2014年8月25日
     * mailto: chenzhigang@foxmail.com
     * blog : http://chenzhigang.github.io/
     * review 
     */
    public class BrainFuckMachine {
        static int[] datas = new int[2048]; //状态区域
        static int p	= 0 ; //状态区域的指针
        static int pc 	=0; //命令的指针
        public static void main(String[] args) {
            //String code ="++++++++++[>++++++++++<-]>++++.+.";
            String code="++++++++++[>+++++++>++++++++++>+++>+<<<<-]"
                    + ">++.>+.+++++++..+++.>++."
                    + "<<+++++++++++++++.>.+++.------.--------.>+.>.";
            run(code);
        }
        public static void run(String code){
            char[] cmds = code.toCharArray();
            while(true){
                switch(cmds[pc]){
                case '>':
                    p++;
                    break;
                case '<':
                    p--;
                    break;
                case '+':
                    datas[p]++;
                    break;
                case '-':
                    datas[p]--;
                    break;
                case '.':
                    System.out.print((char)datas[p]);
                    break;
                case ',':
                    break;
                case '[':
                    if(datas[p] ==0){
                        findNext(cmds);
                    }
                    break;
                case ']':
                    if(datas[p] !=0){
                        findPre(cmds);
                    }
                    break;
                }
                pc++;
                if(pc > cmds.length-1){
                    System.out.println();
                    System.out.println("程序运行结束 !");
                    break;
                }
            }
        }
        /**
         * 向后找 ]
         * @param cmds
         */
        public static void findNext(char[] cmds){
            while(true){
                pc++;
                if(pc > cmds.length-1){
                    System.out.println("代码不符合语法规范");
                    return;
                }
                if(cmds[pc]==']'){
                    return;
                }

            }
        }

        /**
         * 向前找 [ 
         * @param cmds
         */
        public static void findPre(char[] cmds){
            while(true){
                pc--;
                if(pc < 0){
                    System.out.println("代码不符合语法规范");
                    return;
                }
                if(cmds[pc]=='['){
                    return;
                }
            }
        }
    }
]]>
Trello的使用 2014-08-20T00:00:00+00:00 chenzhigang http://chenzhigang.github.io//2014/08/TrelloBlog ###任务管理与协作平台Trello介绍

  1. Trello简介

    • Trello 是由国外的软件公司Fog Greek开发上线的项目跟踪与团队协作的工具平台。Trello使用目前非常流行的看板(Board,之后会有介绍)来跟踪管理项目。看板可以清楚的看到项目进度和卡住的地方。
  2. Trello的优点
    • 没有使用人数的限制。

    • 简洁易用。不会因为纠结于使用工具的复杂性,而忽视了使用的目的。对于企业提供了团队协作,任务跟踪的功能,对于个人,也是时间管理的工具。

    • 运营和管理的一个困难是跟踪团队的工作内容,Trello 主要解决这个问题。而强调团队协作是可以让同一地域和不同地域的人协同工作,任何人只要能连上公网就可以基于Trello工作。没有时间地域限制。

    • Trello支持各种终端,比如PC, Ios和Android应用,各主要应用市场都提供了免费的Trello App下载,实现移动互联。

    • Trello完全免费。节省了开发以及购买软硬件的成本。

    • 与同类的项目管理工具相比 ,Trello是稳定并且用户众多的。横向比较的另一个特点是Trello可以按照需求定制任务列表流(一个Board可以定义多个List以构成列表流,之后会有介绍),通常最简单也最好用的是Trello默认的任务列表流: To Do-> Doing->Done这样的流向,任务(Card)是流动的元素。定义任务是在To do列表,任务开始可以将任务拖动到Doing列表,任务完成可以将任务再拖动到Done列表。不同的列表表示任务处于不同阶段。 任务可以直接在页面上从所在List拖动到目标List,这是看板管理的特点。又比如Trello的帮助Board定义的任务列表流:Basis->Intermediate->Advanced,如下图

    • 对于开发团队,可以创建任务列表流如下:新需求收集->需要分析-需求排期->开始研发->测试->发布->培训

  3. Trello的缺点
    • Trello通过公网访问,存在被墙的可能性,但是微乎其乎。

    • 帮助和主要元素是英文(仅需要理解),日常工作中定义的任务,列表都可以是中文。英文几乎不是问题。

    • 机密敏感信息最好不要通过附件上传。尽量只使用Trello做任务管理。因为数据不在本地。

  4. Trello的主要元素

    Trello的元素就是在操作的过程中,使用到的一些对象

    • 比如看板(Board),任务列表(List),任务(或者项目,Card),可执行可检查步骤(Checklist),活动(Activity)等。每个元素都有对应的操作。比如将鼠标移动到List和Card上会显示下拉钮,里面是当前元素对应的操作菜单。Board的对应操作是点击右上角的Show sidebar,然后点击Menu会出现对应的菜单。通常Board,List操作是由相应的管理员负责。项目执行人需要熟悉Card, Checklist等操作。项目跟踪人往往只需要通过看板了解项目的进度以及添加评论(Activity会提到)。

    看板(Board,管理员需要熟悉)

    • 浏览和管理任务时,希望能够在一块看板上按顺序将各个列表排列出来。Board元素支持这样的功能。下图左上角的Boards可以将个人能看到的所有Board列出来。Board默认就是蓝色背景。示例的Board名称为”信息技术部“,个人理解Board对于一个企业来讲,可以对应到部门或者对应到部门中团队,如果项目是跨部门协作,也可以定义跨部门Board,比如“零售信息技术协作”。

    • Trello默认新建Board会包含三个列表,分别是To Do,Doing,Done。默认的列表名称可以修改,比如修改为待办,办理中,办结。
    • 通常有这三个列表就可以应付日常管理的工作。如果需要添加List, 可以通过看板上的“Add a list”添加定制的list,比如添加新的列表“总结”。或者按照需要重新定义整个列表流。

    • Board对应的操作菜单是Show sidebar显示的菜单列表。Board的主要操作是添加成员。将来Board成员主要有二种:执行者、跟踪者。执行者就可以指定任务。跟踪者主要是跟踪Board中任务的执行情况。添加Board成员直接点击Add Members即可。因为Board个人理解对应一个团队或机构或跨机构。所以Board成员通常也是该团队或机构的成员。通常每个部门指定一个Board管理员。由该管理员添加部门的所有成员和跟踪者。

    Label设置

    • Label是用来划分任务。每个Label有一个对应的颜色来标志任务属于哪种类型。Board通过Show sidebar->Menu->Settings->Edit label names设置Label。常见的Label的设置比如按照时间管理划分为紧急,重要,普通三种类型。还可以根据业为如下类型: 某公司DBA团队按任务的状态分类:
    • 某开发团队按照任务的性质或类型分类: + 按照协作的小组:
    • 按照优先级划分: 列表(List,管理员需要熟悉)
    • 列表是指任务列表,可以把列表理解为放置任务的容器。任务定义和拖动都是在列表中进行。列表如图默认是横向排列。

    • 人为将List划分为不同阶段是方便管理和跟踪项目。项目跟踪人员可能查看待办的任务有哪些,正在办理的任务有哪些,办结的任务又有哪些。某个任务执行进度是多少(进入对应任务查看任务完成百分比,以及通过查看任务的Checklist观察任务被卡在哪里)。

    • List新建后需要通过List下拉菜单先做归档(Archive),然后再Delete。
    • 归档List,List会从Board上消失,如果Archive之后,还想复原List到Board,可以Show sidebar->Menu->Achived Items->选中已经归档的List,Send to Board

    任务(Card,每个项目成员都需要熟悉)

    • 任务列表List中的每个Card表示一个任务,任务具体指项目或者比项目粒度更小的一些事情。具体到信息技术,比如开发某个功能点,提数,培训,写文档都可以。只要需要花时间完成的工作都是任务。如果任务是一个项目,项目的完成周期很长,完全可以把”项目“拆分成多个Card。

    • 任务的发起可以是任何人。任务需要定义在待办列表(To do)中。假设2014年信息技术部的主要任务是:机房搬迁、网点建设、ODS集中、全年保障等。

    • 那么可以在To Do列表中新建任务, 新建任务是点击To do列表中的Add a card添加。
    • 当有资源可以保证开始任务时,就可以将任务拖动到办理中列表(Doing), 指定任务的执行者(点开任务后,Assign给指定的人,可以同时指定给多人)。任务的执行者点击任务,可以通过Add checklist添加任务的可执行步骤(先点击Add checklist添加Checklist,使用默认的Title即可,添加之后光标会自动定位到Add Item,每个Item就是一个具体的步骤,输入所有的步骤之后,Checklist创建完成)以及任务的结束时间(Due date,通过右侧Due Date菜单项添加任务的完成时间,在接近完成时间以及超过完成时间,会有不同的提示)。

    • 任务的执行者完成任务之后,可以将任务从Doing拖动到Done表示办结。

    • 办结的任务可以归档。归档的目的是保持面板上任务列表中的任务保持当前任务。任务在被移动到办结列表中后,就可以归档,将任务变成历史任务。可以象恢复归档的列表一样,恢复已经归档的历史任务,将其变为当前任务,只有当前任务会在面板的列表中显示。

    • Card中还可以上传附件,附件的内容可以是任务的需求文档也可以是表示任务完成的结果内容,比如报表,状态值。附件的类型可以是视频,声音,文档等格式。

    • Card可以设置Label来标记该Card属于哪种类型。点击Edit Labels从Board中已经定义好的Label来标记任务。比如“紧急”。

    任务在不同列表中流动

    • 介绍了Card的主要设置之后,Card做为元素在任务列表中流动是常用操作,一个完整的示例如下:

    • 假设Card“ODS集中“的执行者可以开始该项任务,那么任务的执行者可以将任务从To Do拖到Doing。添加任务的Checklist,Due Date,上传任务需求文档。
    • 如果任务完成(执行者将Checklist项全部勾选),那么可以将任务从Doing拖到Done表示完结

    • 在完成列表中,可以将任务归档。归档操作之后,Done列表不再会显示已归档的历史任务:

    可执行步骤(Checklist,每个成员需要熟悉)

    • 可执行步骤是观察任务完成情况的指标,跟踪人员可以跟踪任务进度或者卡在哪里。 Checklist本身是在Card中添加。如果任务比较小,可以不设置Checklist。如果任务比较大,需要由任务的执行者细化为若干步骤。如果任务是跨部门合作的,每个部门的执行者可以添加自己的Checklist。总之,Checklist只有执行者最清楚怎么去细化。多个执行者可以分别定义多个Checklist。假设任务“ODS集中”可以分为以下几个步骤:了解现有ODS系统并熟悉ODS集中的背景和原因、ODS集中总行培训、ODS集中分行实施、ODS集中后问题修复,那么新建Checklist并Add Item如下:
    • 任务的执行者每完成一个步骤,就可以勾选相应的步骤。Checlist的进度条会显示相应的百分比。比如完成了步骤“了解现有ODS系统并熟悉ODS集中的背景和原因”并勾选后,进度条显示25%。

    Activity(跟踪者和执行者等人需要熟悉)

    • Activity与Checklist一样,也是在Card的设置面板中显示。Activity表示与当前任务相关的动作。默认会记录Card的移动,归档等操作。Activity还有一个重要的功能是可以写评论。达到与相关人员沟通协作的目的。下图是Card “ODS集中”的Activity列表。里面记录了该Card相关的动作。
  5. 如何跟踪任务进度(Board管理员和跟踪者需要熟悉)
    • 任务跟踪者如果单纯跟踪任务进度,只需要Board的管理员将跟踪者添加为Board的成员即可。只要成为任何一个Board的成员,登陆Trello就会显示该用户的所有可见的Board,进而可以进入想要跟踪的Board跟踪该Board中的任何任务。下图中用户登陆后可见的所有Board。 注意,Starred Boards中的Board是用星号标记过,表示经常使用的Board。
    • 下面是“信息技术部”管理员将跟踪人员加入为Board成员的过程:

      • 点击进入“信息技术部”Board, 点击Show sidebar->Add Members将任务跟踪者加入到当前Board, 添加Board成员时可以使用跟踪人员的名称,但是最好使用可以唯一标志的邮箱(需要任务跟踪人员将Trello的注册邮箱提供给Board管理员添加)。
      • 在部门管理员邀请任务跟踪者加入部门的Board后,任务跟踪者登陆Trello,就可以在首页看到该部门的Board。 + 类似操作将任务跟踪者添加到他想要查看的任意Board里。跟踪者的首页就会列出可查看的所有Board,进而查看Board中的任务。
  6. 机构(补充介绍,只需要管理员了解)
    • 如果某人被指定为Board管理员之后,除了可以通过右上角的“+”新建团队的Board外,还可以新建Organization。机构的目的个人理解是做一些有限的权限控制。比如将Board设置为机构可见。Board默认创建之后是私有的。只有Board成员可见。通过机构可以扩大Board的可见范围,即使某人没有添加为Board成员,但是如果添加为机构的成员,并且该Board是机构可见。那么该人员登陆Trello后,可以通过某些路径跟踪到该Board。下图显示创建机构之后,如何添加机构的成员以及设置机构的可见性。
    • 查看创建的机构不仅可以通过左上角的“Boards”查看到,还可以通过个人的Profile中查看,如下图Organizations所列机构:
    • 机构的visible分为Public、Private,Public表示机构是公开的,可以被任何人访问到,一般公共的机构这样设置,企业设置为Private。

    • Board的可见设置分为三种:Private、Organization、Public。默认为Private表示加入Board成员可见并且可编辑。Organization表示加入机构的成员可见。Public表示公网上的任何人可见。一般企业设置为Private或Organization。
    • Organization还有一个好处是避免被动重复添加Board成员的工作,而将这个工作交给Organization中的成员主动完成。

    • 假设某个部门包含了多个团队,Board管理员需要为每个团队都新建一个Board,但是每个Board都可能需要全部门的成员加入。此时Board管理员没必要为每个Board添加重复的人员。而是将主动权交给Organization中的成员。前提是将Board设置为Organization可见并且通过Board的Show sidebar | Menu | Settings | Allow Org Members To Join设置为Organization的成员可主动加入Board。这样设置一次Organization可以服务多个Board,同时将Board添加成员的工作量分散到了机构的每个成员身上。这与Board管理员直接往Board里Add Member效果一样。只是一个主动申请,一个被动分配。
    • 类似的设置还有Menu | Settings | Commenting Permissions,可以设置Organization的成员即使没有加入Board,也可以发表评论。
  7. Trello的注册方式
    • 使用外网可以访问的邮箱,登陆https://trello.com,点击页面右上角的Sign Up, 输入Name(可以是姓名),Email(外网访问邮箱),Password(Trello登陆密码)。注意,注册之后,一定要使用邮箱将帐户激活才可以有效使用Trello。 在激活之后,可以将注册邮箱提供给Board管理员用来将注册用户添加到Board成员。

    • Board的创建根据具体情况建立。比如任务跟踪者需要了解哪个部门的计划和任务执行情况,就需要为该部门新建Board。并将执行者和跟踪者都加入到该Board里。

]]>
SVN的安装与使用 2014-08-20T00:00:00+00:00 chenzhigang http://chenzhigang.github.io//2014/08/SVNBlog ###SVN的安装

  1. VisualSVN的安装
    • 下载VisualSVN,下载地址:点击下载
    • 双击软件按照默认进行安装
    • 安装完后在开始菜单栏上会有VisualSVN的文件夹,里面会有如下信息
    • 点击VisualSVN Server Manager选项,会显示如下信息
    • 以上如果都没有出错,恭喜你VisualSVN安装成功了
  2. TortoiseSVN的安装
    • 下载VisualSVN,下载地址:点击下载
    • 双击软件按照默认进行安装
    • 安装成功后,在桌面上单击右键即可以看到SVN Checkout以及TortoiseSVN的选项
    • 打开SVN Checkout后会显示如下信息
    • 当鼠标移到TortoiseSVN选项上时会显示如下信息
    • 以上如果都没有错,那么恭喜你TortoiseSVN安装成功了

###SVN的使用

  1. VisualSVN用户、组别登信息的配置
    • 打开VisualSVN的VisualSVN Server Manager选项,出现如下信息:
    • 其中,Repositories:源码仓库;User:用户名称;Groups:组名
    • 在Repositories中创建一个文件夹,如名为CloudAtlas
    • 在CloudAtlas的文件夹下创建若干个文件夹,如下
    • 在前面的基础上创建文件夹,如下
    • 在User的文件夹下创建用户名
    • 在Groups的文件夹下创建组名
    • 给每一个用户分配到一个组 ,在four组上,右键单击 ,选择edit ,将需要分配到该组的用户分配进来,点击ok
    • 这样一个基本的用户组别配置完毕
  2. 使用TortoiseSVN进行相关的操作
    • SVN Checkout操作
      • 选择需要Checkout的路径
      • 右键点击SVN Checkout选项
      • 由上图可知 为仓库的路径,即将要被Checkout的信息的路径, 为Checkout后的存放信息的路径。
      • 选择好路径以及存放路径后,点击ok按钮有如下信息
      • 可以看到上图代码等文件夹上有一个绿色带钩的图标,这就说明Checkout成功了
    • SVN Update的操作
      • 在已经Checkout的文件夹上右击,可以看到如下信息
      • 更新完成后会提示更新成功
    • SVN Commit的操作
      • 在需要提交的文档的路径空白处右键单击,可以看到有SVN Commit选项
      • 选择SVN Commit选项,点击后,有如下信息
      • 在上图中可以看到,Recent message按钮:点击可以获取以前填写的文档描述信息;文本框:填写文档的相关描述信息;文档属性栏(Path,Extension等等):勾选要提交的文档
      • 点击上图中的ok按钮
      • 提交完成后会有提示提交成功
]]>
Hello Blog 2014-08-20T00:00:00+00:00 chenzhigang http://chenzhigang.github.io//2014/08/HelloBlog ###Hello Blog

第一次在github上创建Blog

呵呵

花图

]]>
Big Data In Action 01 vagrant 安装 2014-01-23T00:00:00+00:00 chenzhigang http://chenzhigang.github.io//2014/01/Big-Data-01 ##vagrant的介绍

虚拟开发环境

平常我们经常会遇到这样的问题:在开发机上面开发完毕程序,放到正式环境之后会出现各种奇怪的问题:描述符少了、nginx配置不正确、mysql编码不对、php缺少模块、glibc版本太低。

所以我们就需要虚拟开发环境,我们虚拟和正式环境一样的虚拟开发环境,而随着个人开发机硬件的升级,我们可以很容易的在本机跑虚拟机,例如vmware、VirtualBox等。因此使用虚拟化开发环境,在本机可以运行自己喜欢的OS(Windows、Ubuntu、Mac等),开发的程序运行在虚拟机中,这样迁移到生产环境可以避免环境不兼容导致的莫名错误。

虚拟开发环境特别适合团队中开发环境、测试环境、正式环境不同的场合,这样就可以使得整个团队保持一致的环境,我写这一章的初衷就是为了让大家和我的开发环境保持一致,让读者和我们整个大团队保持一致的开发环境。

vagrant

vagrant就是为了方便的实现虚拟化环境而设计的,使用ruby开发,基于VirtualBox的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用vagrant可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,这样我们平时还可以在开发机模拟分布式系统。

Vagrant会创建一些共享文件夹,用来给你在主机和虚拟机之间共享代码用。这样就使得我们可以在主机上写程序,然后在虚拟机中运行。如此一来团队之间就可以共享相同的开发环境,就不会再出现类似“只有你的环境才会出现的bug”这样的事情。

团队新员工加入,常常会遇到花一天甚至更多时间来从头搭建完整的开发环境,而有了vagrant,只需要直接将已经打包好的package(里面包括开发工具,代码库,配置好的服务器等)拿过来就可以工作了,这对于提升工作效率非常有帮助。

vagrant不仅可以用来作为个人的虚拟开发环境工具,而且特别适合团队使用,它使得我们虚拟化环境变得如此的简单,只要一个简单的命令就可以开启虚拟之路。

#vagrant安装配置

vagrant底层用的是Virtual Box作为虚拟机,vagrant只是一个让你可以方便设置你想要的虚拟机的便携式工具,所以第一步先安裝vagrant和Virtual Box。

VirtualBox安装

VirtualBox是Oracle开源的虚拟化系统,它支持多个平台,所以你可以到官方网站:https://www.virtualbox.org/wiki/Downloads/ 下载适合你平台的virtualbox最新版本并安装,它的安装过程都是傻瓜化安装,一步一步执行就可以完成安装。

vagrant安装

最新版本的vagrant已经无法通过gem命令来安装,因为依赖库太多了,所以目前无法使用gem来安装,目前网络上面很多教程还是类似这样的命令,那些都是错误的。目前唯一安装的办法就是到官方网站下载打包好的安装包:http://downloads.vagrantup.com/ 他的安装过程和Virtual Box的安装一样都是傻瓜化安装,一步一步执行就可以完成安装。

尽量下载最新的程序,因为VirtualBox经常升级,升级后有些接口会变化,老的vagrant可能无法使用。

检测是否安装成功,打开终端命令行工具,输入vagrant,是不是已经可以运行,如果不行,请检查PATH里面是否有vagrant所在的路径。

vagrant配置

当我们安装好Virtual Box和vagrant后,我们要开始考虑在VM上使用什么操作系统了,一个打包好的操作系统在vagrant称为Box,即Box是一个打包好的操作系统环境,目前网络上什么都有,所以你不用自己去制作操作系统或者制作Box:vagrantbox.es上面有大家熟知的大多数操作系统,你只需要下载就可以了,下载主要是为了安装的时候快速,当然vagrant也支持在线安装。

建立开发环境目录

我的开发机是windows,所以我建立了如下的开发环境目录,读者可以根据自己的系统不同建立一个目录就可以:

F:\\Boxes

下载box

前面讲了box是一个操作系统环境,实际上它是一个zip包,包含了vagrant的配置信息和VirtualBox的虚拟机镜像文件.我们这一次的实战使用官方提供了一个box:Ubuntu lucid 64 http://files.vagrantup.com/lucid64.box

当然你也可以选一个自己团队在用的系统,例如centos、Debian等,我们可以通过上面说的地址下载开源爱好者们制作好的box。当然你自己做一个也行,下一节我会讲述如何自己制作包。

添加box

添加box的命令如下:

vagrant box add base 远端的box地址或者本地的box文件名

vagrant box add 是添加box的命令

base是box的名称,可以是任意的标题,base是默认名称,主要用来标识一下你添加的box,后面的命令都是基于这个标识来操作的。

例子:

vagrant box add base http://files.vagrantup.com/lucid64.box
vagrant box add base https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
vagrant box add base CentOS-6.3-x86_64-minimal.box
vagrant box add "CentOS 6.3 x86_64 minimal" CentOS-6.3-x86_64-minimal.box

我在开发机上面是这样操作的,首先进入我们的开发环境目录F:\Boxes,执行如下的命令

vagrant box add base lucid64.box

安装过程的信息

Downloading or copying the box...
Extracting box...te: 47.5M/s, Estimated time remaining: --:--:--)
Successfully added box 'base' with provider 'virtualbox'!

box中的镜像文件被放到了:C:\Users\当前用户名\.vagrant.d\boxes\目录下。

通过vagrant box add这样的方式安装远程的box,可能很慢,所以建议大家先下载box到本地再执行这样的操作。

初始化

初始化的命令如下:

vagrant init

如果你添加的box名称不是base,那么需要在初始化的时候指定名称,例如

vagrant init "CentOS 6.3 x86_64 minimal"

初始化过程的信息:

A `Vagrantfile` has been placed in this directory. 
You are now ready to `vagrant up` your first virtual environment! 
Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.

这样就会当前目录生成一个 Vagrantfile的文件,里面有很多配置信息,后面我们会详细讲解每一项的含义,但是默认的就可以开箱即用。

启动虚拟机

启动的命令如下:

vagrant up

启动过程的信息:

Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'base'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- /vagrant

链接到虚拟机

上面已经启动了虚拟机了,我们现在就可以通过ssh链接到虚拟机,我开发机可以这样链接:

登录显示

我们就可以像链接到一台服务器一样进行操作了。

window机器不支持这样的命令,必须使用第三方客户端来进行链接,例如putty、Xshell4等.

xshell为例:

主机地址: 127.0.0.1

端口: 2222

用户名: vagrant

密码: vagrant

系统信息

进入系统之后我们可以看一下系统的基础信息:

系统信息

配置详解

在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、vagrant的一些基础配置。vagrant是使用ruby开发的,所以它的配置语法也是ruby的,但是我们没有学过ruby的人还是可以跟着他的注释知道怎么配置一些基本项的配置。

  1. box设置

     config.vm.box = "base"
    

    上面这配置展示了vagrant要去启用那个box作为系统,也就是上面我们输入vagrant init Box名称时所指定的box,如果沒有输入Box名称的話,那么默认就是base,Virtual Box提供了VBoxManage这个command line工具,可以让我们设定VM,用modifyvm这个命令让我们可以设定VM的名称和内存大小等等,这里说的名称指的是在Virtual Box中显示的名称,我们也可以在Vagrantfile中进行设定,在Vagrantfile中加入如下这行就可以设定了:

     config.vm.provider "virtualbox" do |v|
       v.customize ["modifyvm", :id, "--name", "fle4y", "--memory", "512"]
     end	
    

    这行设置的意思是调用VBoxManage的modifyvm的命令,设置VM的名称为fle4y,VM的内存为512MB,你可以类似设置来个性化设置你的VM。

  2. 网络设置

    Vagrant有两种方式来进行网络链接,一种是host-only(主机模式),意思是主机和虚拟机之间的网络互访,而不是虚拟机访问internet的技术,也就是只有你一個人自High,其他人访问不到你的虚拟机。另一种是Bridge(桥接模式),该模式下的VM就像是局域网中的一台独立的主机,也就是说需要VM到你的路由器要IP,这样的话局域网里面其他机器就可以访问它了,一般我们设置虚拟机都是自high为主,所以我们的设置一般如下:

     config.vm.network :private_network, ip: "11.11.11.11"
    

    这里我们虚拟机设置为hostonly,并且指定了一个IP,IP的建议最好不要用192.168..,因为很有可能和你局域网里面的其他机器IP冲突,因为你可以尽量使用类似11.11..这样子的。

  3. hostname设置 hostname的设置非常简单,Vagrantfile中加入下面这行就可以了:

     config.vm.hostname = "go-app"
    

    设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的,例如Puppet或是Chef,都是通过hostname來做识别的,既然设置那么简单,所以我们就別偷懒,设置一个。

  4. 同步目录 我们上面介绍过/vagrant目录默认就是当前的开发目录,这是在虚拟机开启的时候默认挂载同步的。我们还可以通过配置来设置额外的同步目录:

      config.vm.synced_folder "F:/share", "/home/vagrant/share"	
    

    上面这个设定,第一个参数是主机的目录,第二个是虚拟机挂载的目录

  5. 端口转发

     config.vm.network :forwarded_port, guest: 80, host: 8080	
    

    这一行的意思是把Host机器上8080端口传来的数据forward到虚拟机的80端口的服务上,例如你在你的虚拟机上,使用Nginx跑了一个Go应用,那么你在host机器上在浏览器中打开http://localhost:8080时,vagrant就会把这个请求传到VM里面跑在80端口的Nginx服务上,因此我们可以通过这个设置来帮助我们去设定host和VM之间,或是VM和VM之间的信息交互。

修改完Vagrantfile的配置后,记得要用vagrant reload的命令重启VM才能使得VM可以用新的配置

###常用链接

给我捐款

回到主页

]]>