163博客其他文章--搬家

Win7 VPN配置 

Win7 VPN服务器及客户端配置在网上均能找到相应资料(http://www.win7china.com/html/15202.html可行),这里主要记一下搭建时碰到的问题及解决方法。

----------------------------------------------------------------

问题一:搭建VPN服务器并成功连接之后,访问不到VPN服务器所在局域网的资源,服务器及客户端上所有静态路由配置正常。不过客户端却能成功访问VPN服务器在局域网的ip。

解决办法:参考了 http://zhidao.baidu.com/link?url=5stGWiSmnwlkDX7p4lGvN__9E4ClkzHGICxhbIGtXXpUp65wYiSQq6iXmBJI-jaYOPJUkm9Z24tizf4Z7l-k6q 的解决办法,即VPN服务器为连接上的客户端分配ip时需要保证和VPN服务器在局域网ip在同一网段里。

----------------------------------------------------------------

问题二:可以访问与VPN服务器在局域网ip同一网段里的资源,但不能访问另一网段中的资源。后来查看静态路由,发现有两条默认路由:

网络目标 网络掩码 网关               接口               跃点数
0.0.0.0    0.0.0.0    192.168.X.X    192.168.X.X    XX
0.0.0.0    0.0.0.0    X.X.X.X            X.X.X.X           XX

前一条路由为走内网,后一条路由走外网。我开始时以为是顺序寻址的,所以第二条应该是无效的。但VPN服务器一直ping不到其他某网段中的资源,后来删除了第二跳路由,反而能ping到了。


Beyond compare是一款比较好用的文件对比、合并工具。
注册码:

H1bJTd2SauPv5Garuaq0Ig43uqq5NJOEw94wxdZTpU-pFB9GmyPk677gJ
vC1Ro6sbAvKR4pVwtxdCfuoZDb6hJ5bVQKqlfihJfSYZt-xVrVU27+0Ja
hFbqTmYskatMTgPyjvv99CF2Te8ec+Ys2SPxyZAF0YwOCNOWmsyqN5y9t
q2Kw2pjoiDs5gIH-uw5U49JzOB6otS7kThBJE-H9A76u4uUvR8DKb+VcB
rWu5qSJGEnbsXNfJdq5L2D8QgRdV-sXHp2A-7j1X2n4WIISvU1V9koIyS
NisHFBTcWJS0sC5BTFwrtfLEE9lEwz2bxHQpWJiu12ZeKpi+7oUSqebX+


下载链接及注册码参考自:http://www.cnblogs.com/Y4ng/p/Beyond_Compare4_key.html 


 

Git远程分支的回退

下午发现上午提交的一个版本有问题,在回退本地分支后,发现还必须要回退远程分支的版本。网上查找到的资料如下:

#新建old_master分支做备份   

git  branch  old_master    

#push到远程    

git  push  origin  old_master:old_master   

#本地仓库回退到某个版本  

git  reset  –hard  **** 

#删除远程的master分支

git  push  origin  :master 

#重新创建master分支 

git  push  origin  master

实时发现是可行的。

另一种回退方法是在远程分支服务器上进行操作,但每次切换分支时会出现
“fatal: This operation must be run in a work tree”
的错误,貌似只能修改master分支,但可以查看其他分支的log。


记第一次多用户在Git提交代码

今天第一次进行了多用户(其实就两人)在自建Git服务器提交代码。

先记录碰到的问题:
首先是本地提交代码时,进行了add,commit后,在push时碰到服务器故障,待设置好服务器后,再push时,却push了0个文件,好像是因为第一次push时,个人认为已经将修改过的文件的标志位改为已push了。后来想了个办法,用版本回退:

git reset --hard HEAD^

HEAD^表示回退一个版本,HEAD^^则是回退两个版本,HEAD~3则是3个版本了。这种方法是将本地代码也回退到某个版本,另一种方法是代码不变,只回退commit信息,即用soft替代hard(http://blog.sina.com.cn/s/blog_635675db0101bji9.html)。当时不知道有这种回退方法,导致代码都回退了。。

然后是发现其他用户新建的分支在我本地看不到,后来发现别人的总结:
"  在实际开发中,我们应该按照几个基本原则进行分支管理:
    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了"
看来其他用户新建的分支就是没必要让其他用户可见的,只需要大家最后将代码合并到某个共同的分支就行

最后是碰到冲突的问题。在本地将branch2(私有分支)的代码合并到branch1(公共分支)没问题,但将branch1提交到服务器时,出现了conflict。
解决办法:我们先将branch2最新代码在本地备份一下,然后在本地将branch1代码回退到与branch2合并前,从服务器下载branch1的代码,合并到本地的branch1,没问题,然后再将备份的代码合并到branch1,再将本地branch1的代码提交到服务器。
效果:我在本地下载branch1的代码,再合并到我的branch1里,没问题,查看代码,应该也更新成功了,和另一个用户的代码一致。

得到一个经验,要将自己写的本地代码提交到公共分支前,有以下几步:
1.新建本地分支,用户自己所进行的所有修改在这个分支里进行(可以push到服务器,当作备份);
2.从公共分支下载最新代码,合并到本地,再合并本地分支的修改,中间要确保无冲突;
3.提交完全合并后的代码。


快速为git添加一个用户

环境:用gitosis-admin管理git的权限。

前期git环境的搭建略去,主要给出快速添加一个用户的步骤:

  1. 在git bash中用“ssh-keygen -t rsa”生成公钥私钥,默认放到 “C:\Users\[用户名]\.ssh”文件夹下,可将.pub公钥的文件名改为该文件中最后一个字符串(私钥文件名不能修改,改了私钥文件导致了每次连接git都要输入密码);

  2. 将该公钥文件上传到git服务器的gitosis-admin工程中,修改gitosis.conf文件,添加相应权限。

以后连接git服务器都不用再输入密码了。


设计模式个人思考

创建型模式

我理解的参与者主要是:用户、工厂、零件生产商。一般的,零件生产商为工厂生产零件,用户调用工厂生成产品

1.抽象工厂与工厂方法的区别

我理解的抽象工厂与工厂方法的区别:
抽象工厂是先有工厂,后有用户,用户选择工厂后再创建对象;而工厂方法是根据用户需求创建对象(感觉工厂方法中工厂即用户)。
关键在于用户在实现(make或create)的时候有没有接收一个工厂实例,若有则是抽象工厂模式。
抽象工厂是由工厂生产零件,工厂模式由用户(因为该模式中工厂即用户)直接管理零件商。

网上解释的抽象工厂与工厂方法的区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

2.Builder(生成器)模式

该模式中用户值只需给出如何创建,而不用知道对象具体是如何被创建的,如盖房子时用户提出在东面开一个门,而不需指出如何开门(貌似没说清楚。。。);
对象在创建过程中,一直在工厂(接口的实现类)里加工,当对象在工厂中被创建后,用户获取返回值来获取该对象。而抽象工厂和工厂方法中在用户类维护该对象。

3.Prototype(原型)模式

比较显著的特点是需要重定义Clone并实现相应的拷贝构造器。其缺点是若对象结构包含循环引用时,构造Clone较困难。
在创建工厂时由需求(传入的参数)设置零件厂商,创建完毕后,用户调用时返回产品。

该模式与抽象工厂相同之处在于:
用户都需要通过工厂来生产产品。
该模式与抽象工厂不同之处在于:
该模式在创建工厂时传入零件厂商实例,抽象工厂中用户生产产品时需传入工厂实例;
该模式在创建工厂时,动态设置零件厂商;即该模式不需要拥有那么多工厂,而只需拥有与抽象工厂相同的零件厂商就行,从而减少工厂类的数量。个人感觉比抽象工厂更灵活。

4.Singleton(单件)模式

一个类只能创建该类或其子类的一个实例,并提供全局访问点。

总结:
工厂方法是一种标准的创建对象的方法,但若被实例化的类根本不发生变化或当实例化出现在子类可以很容易重定义的操作中,这就并不重要了。
使用抽象工厂、原型或生成器的设计往往比工厂方法更灵活,但它们也更加复杂。

结构型模式

 1.适配器模式

适配器模式分为类适配器和对象适配器。书上的结构图中,构造一个适配器与两个类产生关系。构造一个适配器首先要继承一个接口类,接下来,若:私有继承(c++中允许多继承)第二个类,则该继承属于类适配器;若适配器只是维护一个指向第二个类的指针,则属于对象适配器。但是jdk中的adapter均不是如此,以KeyAdapter为例。KeyAdapter实现两个接口:KeyListener和EventListener,而 KeyListener又继承EventListener,准确地说KeyAdapter只继承了KeyListener,且KeyAdapter中的方法都是空方法。
书上还提到一个双向适配器(p94)。

2.桥接模式

 桥接的意图是将抽象部分与实现部分分离。
抽象部分可以实现一些总体的逻辑,实现部分则实现最基本、最原子的操作。

java例子可参考http://www.blogjava.net/qinysong/articles/63024.html。

3.组合模式

较容易理解。适于有明显的类层次结构。工作重点在于对叶节点和中间节点中方法的管理。

4.装饰模式

使用于给某个对象添加一些功能(而不是整个类),这比直接生成子类要灵活。

5.外观模式(未理解)

往往与其它模式结合。其主要任务是简化接口

6.享元(flyweight)模式

对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模


 

posted @ 2018-08-21 11:26  我是包子  阅读(197)  评论(0编辑  收藏  举报