•       今天成功地搞定了VPN,虽然说速度也就那样子,不过比起之前用代理的效果还是赞了很多。在这里和大家分享下!

          1、安装xl2tpd

           安装xl2tpd其实是一个很简单的事情,但是呢,要小心的是也许你并没有安装成功。我是吃过这个苦的,在这里我先说说我没有安装成功的case。

          A、到 www.xelerance.com/software/xl2tpd/去下载xl2tpd-1.1.12.tar.gz。

           #tar zxvf xl2tpd-1.1.12.tar.gz
           #cd  xl2tpd-1.1.12
           #make
           #make install
           #mkdir /etc/xl2tpd/

           但是我用rpm -q xl2tpd,发现并没有安装成功。

          B、找一个速度快的代理,直接通过yum安装xl2tpd。如果速度不够快的话,会time out连接不上source。可以另外找台电脑,给自己开个代理。至少我是这么做的。

          yum install xl2tpd

          2、写配置文件

          #mkdir /etc/xl2tpd/
          #cd /etc/xl2tpd/
          #vi xl2tpd.conf

          xl2tpd.conf的内容如下:

          [global]                              ; Global parameters:
          port = 1701                           ; * Bind to port 1701
          [lac zju]                             ; Example VPN LAC definition
          lns = lns.zju.edu.cn                  ; * Who is our LNS?
          refuse pap = yes                      ; * Refuse PAP authentication
          require authentication = no           ; * Require peer to authenticate
          name = zealot@a                       ; * Report this as our hostname
          ppp debug = yes                       ; * Turn on PPP debugging
          pppoptfile = /etc/l2tpd/zju.options   ; * ppp options file for this lac
          其中name就是你的VPN帐号。

          #vi zju.options

          zju.options的内容如下:

          asyncmap 0
          noauth
          crtscts
          lock
          hide-password
          modem
          netmask 255.255.255.0
          proxyarp
          lcp-echo-interval 30
          lcp-echo-failure 4
          ipcp-accept-local
          ipcp-accept-remote
          noipx

          3、编辑密码文件

          #vi /etc/ppp/chap-secrets

          chap-secrets的内容如下:
          # Secrets for authentication using CHAP
          # client        server  secret                  IP addresses
          *       *               "password"                * 

          password是的的VPN密码,保留引号。

          4、添加hosts

          #mkdir /var/run/xl2tpd
          然后,在/etc/hosts加入一行
          10.5.1.9 lns.zju.edu.cn 

          5、运行与调试

          启动 l2tpd

          # /etc/init.d/xl2tpd start
          终端这里出现Starting xl2tpd:并且没有什么错误提示就ok了
          然后发送连接到 vpn 的命令
          # echo "c zju" > /var/run/xl2tpd/l2tp-control
          之后运行一下 ifconfig(如果你的path没有设置好的话,就用全路路径/sbin/ifconfig),如果看到 ppp0 设备,那么恭喜你成功了!
          ppp0      Link encap:Point-to-Point Protocol 
                    inet addr:172.16.37.39  P-t-P:172.16.255.1  Mask:255.255.255.255
                    UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
                    RX packets:267606 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:189248 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:3
                    RX bytes:375656610 (358.2 MiB)  TX bytes:11688257 (11.1 MiB) 

          路由配置

          要让校内的网络资源仍然通过原先的路由,而校外资源则通过 vpn,需要配置 一下路由。连接到 vpn 以后,用 ip route(如果你的path没有设置好的话,就用全路路径/sbin/ip route)查看当前路由。

          # ip route
          222.205.64.1 dev ppp0 proto kernel scope link src 222.205.74.23
          222.205.9.0/24 dev eth0 proto kernel scope link src 222.205.9.2
          default via 222.205.9.1 dev eth0
          可以看出默认路由是通过网关,而不是 vpn ,我们希望 10.* 、 210.32.* 和 222.205.* 使用默认路由

          # ip route add 10.0.0.0/8 via 222.205.9.1 dev eth0
          # ip route add 222.205.0.0/16 via 222.205.9.1 dev eth0
          # ip route add 210.32.0.0/16 via 222.205.9.1 dev eth0

          注意 222.205.9.1 要替换成你刚才 ip route 所看到的 default 一句里面的那 个地址。

          然后删除原来的默认路由

          # ip route del default

          注意不要先删除默认路由再设置 10.* 的路由,因为 vpn 服务器在 10.* 网段,删除默认路由将直接导致 vpn 断开。

          设置其他地址使用 vpn ,地址可以通过 ifconfig 查看

          # ifconfig
          ppp0 Link encap:Point-to-Point Protocol
          inet addr:222.205.74.23 P-t-P:222.205.64.1 Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1442 Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:40 (40.0 b) TX bytes:46 (46.0 b)

          就是 P-t-P 那里的地址,这里是 222.205.64.1 ,然后设置新的默认路由

          # ip route add default via 222.205.64.1 dev ppp0

          这样 vpn 就配置完毕可以使用了。 

          6、VPN连接脚本

          #!/bin/bash
          ########################################
          # Shell script to (re)connect to VPN
          # pluskid <pluskid.zju@gmail.com>
          ########################################
          ####################
          # Variables
          ####################
          ## How many seconds to wait for the ppp0 to come up each try
          TIMEOUT=10
          ## How many times to try to bring up ppp0 until fail
          N_RETRY=3
          ## Interface default to use
          INTERFACE=eth0
          ## How many seconds to wait for l2tpd to restart
          L2TPD_TIMEOUT=10
          ## For xl2tpd: /etc/init.d/xl2tpd
          ## For l2tpd: /etc/init.d/l2tpd
          L2TPD_SCRIPT=/etc/init.d/xl2tpd
          ## For xl2tpd: /var/run/xl2tpd/l2tp-control
          ## For l2tpd: /var/run/l2tp-control
          L2TPD_PIPE=/var/run/xl2tpd/l2tp-control
          ####################
          # Commands
          ####################
          function usage
          {
          echo "$1 login to the school VPN."
          echo "$1 [-h] [-r]"
          echo " Default to connect to VPN."
          echo " -r reconnect."
          echo " -h help, i.e. show this information."
          }
          function connect
          {
          if ppp0_alive ; then
          echo "Already connected."
          else
          bring_up_ppp0 && setup_route
          fi
          }
          function reconnect
          {
          restart_l2tpd && bring_up_ppp0 && setup_route
          }
          ####################
          # Internal utility functions
          ####################
          function super_user
          {
          if [ "$UID" = "0" ]; then
          return 0 # Yes, super user
          else
          return 1
          fi
          }
          function ppp0_alive
          {
          if /sbin/ifconfig | grep -s 'ppp0' > /dev/null ; then
          return 0 # Yes, connected
          else
          return 1
          fi
          }
          function bring_up_ppp0
          {
          for i in $(seq $N_RETRY)
          do
          echo -n "Trying to bring up ppp0"
          echo "c zju" > $L2TPD_PIPE
          for j in $(seq $TIMEOUT)
          do
          if ppp0_alive; then
          echo " Done!"
          return 0 # Yes, brought up!
          fi
          echo -n "."
          sleep 1
          done
          echo
          done
          echo "ERROR: Failed to bring up ppp0!"
          return 1
          }
          function setup_route
               {
          echo "Setting up route..."
          STATIC=$(/sbin/ip route | grep '^default' | cut -d" " -f3)
          # If already set the route before, we cannot find
          # the original default route any more. But fortunately,
          # the route previously setted often won't change and
          # we can just safely ignore this task
          if [ ! -z $STATIC ]; then
          /sbin/ip route add 10.0.0.0/8 via $STATIC dev $INTERFACE
          /sbin/ip route add 222.205.0.0/16 via $STATIC dev $INTERFACE
          /sbin/ip route add 210.32.0.0/16 via $STATIC dev $INTERFACE
          /sbin/ip route add 239.43.1.1 via $STATIC dev $INTERFACE
          /sbin/ip route del default
          fi
          PPP=$(/sbin/ifconfig | sed -n '/P-t-P/s/^.*P-t-P:\([0-9.]*\).*$/\1/p')
          /sbin/ip route add default via $PPP dev ppp0
          echo "Done!"
          }
          function restart_l2tpd
          {
          echo "Restarting l2tpd..."
          $L2TPD_SCRIPT restart
          for i in $(seq $L2TPD_TIMEOUT)
          do
          if [ -e $L2TPD_PIPE ]; then
          echo "Done!"
          return 0 # Successfully restarted!
          fi
          sleep 1
          done
          echo "ERROR: Failed to restart l2tpd!"
          return 1 # Failed to restart l2tpd
          }
          ####################
          # Main
          ####################
          if ! super_user ; then
          echo "ERROR: You must be super user to run this utility!"
          exit 1
          fi
          if [ $# -lt 1 ]; then
          connect
          elif [ "$1" = "-h" ]; then
          usage
          else
          reconnect
          fi 

     

          将以上内容保存为 vpn.sh ,然后添加可执行权限 chmod +x vpn.sh ,之后直接执行就可以连接 vpn : ./vpn.sh ,加参数 -r 表示重新连接, -h 显示帮助信息。 

     

  • 下面就以Windows Vista系统为例,详细的说明一下配置的过程。

    1. 下载JDK
    可以在Sun公司的网站上下载到免费的JDK软件,具体地址:http://java.sun.com/javase/downloads/index.jsp。注意选择正确的操作系统(这里选择Windows),我下的是jdk-6u3-windows-i586-p.exe。

    2. 安装JDK
    直接点击安装就可以了,但是建议不要将JDK放在诸如Program Files等含有空格的文件夹中,这样会使以后的调试变得不方便。作为例子,这里将JDK装在 D:\JAVA\jdk 文件夹中。注意下载的安装程序会同时提示安装JRE,建议安装在 D:\JAVA\jre 就可以了。

    3. 配置坏境
    在开始菜单中的计算机处敲击右键,选择属性,出现系统文件夹。点击左栏的“高级系统设置”,弹出“系统属性”选单,选择“高级”选项卡中的“环境变量”选项。在上部的用户变量处添加以下的三个键值。
      名称=值
      java_home=c:\JAVA\jdk (安装路径)
      classpath=.;%java_home%\lib\tools.jar;%java_home%\jre\lib\rt.jar;
      path= %java_home%\bin
    注意classpath键值的最前面是一个句点和一个分号,句点表示的是当前文件夹。4.调试如果没有java的可视化编辑器的话,建议去http://www.eclipse.org下载eclipse,我用的是eclipse-java-europa-winter-win32。代开eclipse编辑器,点击New->Java Project,创建名为welcome的Java工程,在src处点击右键,添加.java源文件。输入以下代码:public class welcome
    {
       public static void main(String[] args)
       {
          String[] greeting = new String[2];
          greeting[0] = "Welcome to Core Java";
          greeting[1] = " I am kale.";      for (String g : greeting)
             System.out.println(g);
       }
    }

    如果运行成功,可以在Console窗口看到以下两行信息:     

    Welcome to Core Java
    I am kale.

    则以上的设置是正确的。 

  • 古堡救美游戏

    描述
    一个命令行游戏,让玩家在一个有很多楼层和很多房间的古堡中探险,玩家的任
    务是找到公主并带她离开古堡。房间有很多种,不同种类的房间有不同的出口,
    有的房间里有怪物。如果遇到怪物,游戏就失败了。
    游戏启动时,玩家位于古堡一楼的大厅,程序显示大厅的信息:房间的名字、有
    几个出口、每个出口的名字(如"east"、"south"、"up")。
    Welcome to the lobby. There are 3 exits as: east, west and up.
    Enter your direction to go:
    然后玩家可以输入出口的名字来进入那个出口联接的房间,如
     east
    则游戏进入那个房间,程序显示那个房间的信息,如大厅一样。玩家则可以继续
    选择下一个房间。
    一旦进入有怪物的房间,则显示怪物的信息并结束游戏。
    一旦进入有公主的房间,则显示公主的信息,玩家还必须寻找出去的路直到大
    厅,然后从大厅寻找出口离开古堡。
    所有的显示信息和用户输入都采用英文,以简化程序。

    要求
    1. 至少三种不同种类的房间;
    2. 至少五个房间;
    3. 怪物和公主所在的房间是随机的。

    分析
    先对古堡就行数据抽象,古堡(Castle)包含了许许多多的房间(这里称之为格子(Lattice)),可以抽象为一个Castle类,该类包含以下信息:Castle内的所有Lattice,Monster在古堡内的分布情况,Princess在古堡内的定位信息。Castle类内的成员函数只有两个,一个是对随机分布进行实现的Random函数,另一个是Castle类的构造函数,用于对古堡内所有Lattice的初始化。

    Castle类定义如下:
    class Castle
    {
    private:
     Lattice Rooms[TotalLattice];
     int MonsterIn[TotalLattice];
     int PrincessIn[TotalLattice];
    public:
     int Random();
     Castle();
    };

    然后对古堡(Castle)内的每一个格子(Lattice)作进一步的数据抽象,每个房间(包括大厅)都是Lattice类的一个具体对象,该类包含以下信息:房间的名称,是否有Monster,是否有Princess,Exits的个数,各个出口指向的目的Lattice的指针,各个出口的(二进制)状态。Lattice类的成员函数有以下几个:判断是否Monster In,判断是否Princess In,打印房间(Lattice)的Info,对各个格子状态的初始化函数。

    Lattice类定义如下:
    class Lattice
    {
    public:
     char RoomName[20];
     int Monster;
     int Princess;
     int OpenDoor;
     int DoorState[6];
     Lattice *east , *west , *south , *north , *up , *down;

     int isMonsterIn();
     int isPrincessIn();
     void PrintLatticeInfo();
     int Init(char *Name, int M , int P, Lattice *E , Lattice *W , Lattice *S , Lattice *N , Lattice *U , Lattice *D );
    };
    以上的类定义及成员函数的实现都写在CastleBeauty的头文件中。现在开始考虑整个古堡救美游戏(CastleBeauty)的实现。

    main函数的主体结构为:
    int main()
    {
     WelcomeInfo();
       //进入游戏显示欢迎信息

     while(1)
     {
      GameLoop();
       //游戏主体,返回有两种情况:遇见Monster,救出Princess
      cout<<endl<<"Do you wanna to try it again (Yes / No) :";  //询问是否再玩一次
      cin>>Choice;

      if(choice is not yes)  //判断是否继续
       break;
     }

     return 0;
    }

    至于GameLoop函数的实现也很简单:
    int GameLoop()
    {
     Castle CastleOne;
       //定义一个古堡的实例
     int GetPrincess = false;   int isFirstTime = true;

     Lattice *CurrentLattice = &CastleOne.Rooms[1];  //一楼的中间那间是大厅

     while(!GetPrincess || Not yet return to the Hall)
     {
      CurrentLattice->PrintLatticeInfo();
      //显示当前进入的Lattice的Info

      if(Monster is in Current Lattice)      //如果Monster在
      {
       cout<<endl<<"Monster is in the room , game  over!!!"<<endl;
       return 0;
      }

      if(Princess is in Current Lattice)     //如果Princess在
      {
       cout<<endl<<"Princess is in the room , lead her out of this castle and avoid meeting the monster!!!"<<endl;
      }

      int loop = true;
      while(loop)
      {
       cout<<"Enter your direction to go: ";
       cin>>Choice;
                
       parse the choice and go to the corresponding room.
      }
     }

     cout<<endl<<"Congratuations!!!"<<endl;
     cout<<"You have succeed in leading the princess out of the castle!!!"<<endl;

     return 0; 
    }
    至此我们的程序也就算是完成了,当然这是比较基本的实现,程序员也可以进一步Develop这个古堡救美的游戏,虽然只是在文本模式下的小游戏,还是可以进一步设置难度等级(Easy , Normal , Difficult),也可相应记录玩家的Mark以及Rank等。

  •      Robocup仿真组中期检查的Dead LineApril 5th,到现在代码还是维持在最初水平。昨晚信誓旦旦地决定要把Goal Keeper的函数demeer_goalie()写好,写到一半发现底层代码用的是Portugal2000年夺得世界冠军时候的代码,于是觉得我的水平应该很难超越的样子。只是重新组织了代码的结构,编译完打开Sever开始比赛测试下效果,发现我的Goal Keeper傻掉了,除了会盯着球看以外,其他什么都不会做了。每次都是眼睁睁地看着球进去,无动于衷。Zzz...上半场临近结束时就被弱弱的底层代码踢了个3:0,惊叹守门员的价值所在!剩下DefenderMidfielderAttacker的战术什么的都还没有想好,时间过得好快,我做的又好慢,真麻烦。

        今年想做SRTP,团队算是组好了:小董、俞辰、木木和我。里面最让我放心的是小董,做事最踏实了,而且CS曾经的NO.1实力是摆在那里的,外加任劳任怨,完全的实力派的劳模形象。zzz...瞻仰瞻仰...==身为组长的我惭愧下。项目基本上也定好了,写个Linux的发行版,虽然从大一就开始接触了Linux操作系统,最初的ubantu 6.10到现在的Fedora 7.0。不过都只是玩玩的水准,确切的说连玩玩都不是很深入,所以现在讲到要写这么个Linux的发行版本,还真的是什么都不懂得状态。

        制作Linux发行版本主要是以需求为原则对软件包其进行取舍,得到适合实际需要的Linux系统。但既然是作为一个SRTP的项目,就没有什么需求方面的约束,完全是怎么高兴就可以怎么设计的活。基本的想法就是利用比较熟悉的Fedora版本,通过软件包管理器(RedHat Package Manager),对各种软件进行挑选,去精华去糟粕。至于发行版的名称嘛,别人怎么叫是别人的事,我是觉得应该叫做"羽衣甘蓝 1.0"版,算是单纯背后的小自私吧!嘿嘿^^

        至于能不能通过学校的项目审批又是另一回事了,毕竟我能做的只是尽量把"SRTP学生立项申请表"填写好,其它的就不是我能决定的了.

        最后,这篇boke算是写完了,只是不知道该把它归为哪一类,虽然不算是纯技术文档,但也和技术有点关系,总之有别于"花野"里面纯煽情的文字,于是还是放在"走很长路"里,顺便说这个分类名完全copy自小若澜的space...(若澜,老大不好,没有做好榜样啊啊...