昨天没有更新文章,因为这两天都在忙着开发一个德州扑克的游戏。项目是公开的,挂在github上:https://github.com/DingXuefeng/Nayav 本来是想用object C来写的,后来还是决定用我最熟悉的C++来写了。

这个项目的终极目的是编写一个可以和人类抗衡的扑克AI,有自己的个性,会使诈,bluff the bluffer等等,并且极度冷静。如果能有别人一起开发就最好啦。

目前我有如下几个体验:

  1. 实现一个看上去简单(但往往超级复杂)的功能,一定要一步一步,先写一些dummy method。
  2. 如果一个class太大了,应该refraction把它分成两个或者更多的小类。重构的技巧是把所有的m_xx的类变量变成Get_xx()的方法,然后把Get_xx()内容从 return m_xx换成return Get_secondClass()->Get_xx();,然后就可以把m_xx变量直接搬到secondClass中去了。可以写两个get,分别对应Gettter和Setter:
    1. const X& Get_xx() const { return xx; }
    2. X& Get_xx() { return xx; }
  3. 如果一个method里面不包含本类的任何属性,这个method可以安全的移动到secondClass。

一个例子

class A {

public:

A : m_a(0) {};

void initialize_a() { m_a= 99; };

void doSomething() { m_a += 1; return m_a; };

private:

int m_a;

};

首先变成这样:

class A {

public:

A : m_a(0) {};

void initialize_a() { Get_a() = 99; };

void doSomething() { Get_a() += 1; };

private:

const int &Get_a() const { return m_a; }

int &Get_a() { return m_a; }

int m_a;

};

然后

class A {

public:

A : m_a(0) {};

void initialize_a() { Get_a() = 99; };

void doSomething() { Get_a() += 1; };

private:

const int &Get_a() const { return Get_b()->Get_a(); }

int &Get_a() { return Get_b()->Get_a(); }

B m_b;

};

class B {

private:

const int &Get_a() const { return m_a; }

int &Get_a() { return m_a; }

int m_a;

friend class A;

};

最后把method也搬过来

class A {

public:

void initialize_a() { Get_b()->inialize_a(); };

void doSomething() { Get_b()->doSomething(); };

private:

B m_b;

};

class B {

public:

B() : m_a(0) {};

void initialize_a() { Get_a() = 99; };

void doSomething() { Get_a() += 1; };

 

private:

const int &Get_a() const { return m_a; }

int &Get_a() { return m_a; }

int m_a;

friend class A;

};

 

 

 

 

Since the Chinese input method has not been installed ( and I’m not planning to install it), I will write this article in English.

Why CentOS 6, and why net install?

  1. Because my VPS provider LocVPS does not provide with CentOS 7, and I want to keep the local debugging computer almost the same as the production computer.
  2. Because I want to install CentOS on my USBKey, and I want burned the installation iso on that USBKey.

How to?

  1. Prepare your USB Key.
    1. At first I tryied UltraISO, which is a popular software. However maybe my UltraISO is too old, some error showed when I start from the USBKey burned by it. After google, I decided to use “dd for windows“, which works well.
    2. Dowload dd for windows from its website
    3. unzip it to a directory, and open a command window, cd into that directory.
    4. use dd –list to find your USBkey identification (Intruction), which should looks like \\?\Device\Harddisk1\Partition0 (tips: not the RDA one)
    5. Download the centos iso for net install (from say, USTC)
    6. dd if=your_centos_for_net_install.iso of=\\?\Device\Harddisk1\Partition0 –progress
    7. reboot and start from your USBKey. (Useually press F12 and choose “USB Key …”, if not search google for your BIOS)
  2. Start install
    1. Setup your IPV4 (and IPV6 address), the mask, and Name Server(DNS Server)!! I did not set the DNS server for the first time and failed.
    2. Choose URL installation method
    3. URL: http://mirrors.ustc.edu.cn/centos/6/os/x86_64 (tips: os, not isos; IHEP does not provide this img)
    4. Go!!
    5. Just use the whole disk (your installing USB Key). It’s ok, and I’m using it now.
    6. Choose desktop, or you will regret for it.
  3. Edit the etc
    1. edit /etc/bashrc, add the following lines:    alias vi=’vim’
      alias grep=’grep –color’
      alias ls=’ls –color’
      export LC_ALL=en_US.UTF-8
    2. edit ~/.bashrc, add the following lines:
      alias setssh=’eval $(ssh-agent -s); ssh-add ~/.ssh/id_rsa’

That’s it.

今天好累呢,就少写一点吧。

上网其实就是向远程服务器下载网页,浏览器通过翻译把网页变成我们现在看到的样子。我们在浏览器地址栏输入www.gmail.com到最后我们看到gmail登陆界面分成两个过程:

  1. 请问“www.gmail.com”的IP地址是多少?dns服务器会告诉你,“www.gmail.com的ip地址是216.58.221.133”。
  2. 请转交给216.58.221.133,内容为【我想下载“/ ”这个网页】。

什么叫中间人攻击呢?

假设你在Starbuck上wifi,想登陆gmail邮箱,那么你就会问www.gmail.com的ip地址是多少。正常情况下你应该等你的dns服务器告诉你,但是某个黑客会告诉你:www.gmail.com的ip地址是10.0.1.99(其实是黑客电脑的ip地址)。

你会问:我有那么傻么,为啥我不看看这个是不是8.8.8.8发来的?你应该继续想想,你该看什么?有什么是不能伪造的?事实上,你询问www.gmail.com的那条消息会被拦截,最后你的dns根本收不到你的请求,你只会收到一份应答,你不会怀疑它的真实性。

接下来你在浏览器里面输入www.gmail.com之后,访问的其实是黑客提供给你的一个假网站(跟真的一模一样)。你输入的密码会被黑客记录下来。然后黑客会把你的请求转发给gmail,gmail以为是黑客在登陆你的邮箱,而且账号密码是对的,gmail会把你邮箱的信件发送给黑客,黑客再把内容转交给你。

这有点像中学时候传纸条,男生A坐在最后一排,女生B坐在第一排,男生A给女生B传纸条,需要经过也喜欢女生B的男生C!

男生C会偷看纸条的内容(窃取密码等)。如果男生C想要改写纸条的内容,他需要把男生A的每张纸条都撕掉,然后自己写一份纸条,这样自己的纸条前后字迹看起来才是一样的,女生B也不会怀疑,为什么两封信的字迹不一样。

那么有个问题,如果女生B跑去问老师,这个纸条的字是谁写的,这不就露馅了么?这个想法很好,这是SSL根证书策略的精华:

  1. 根据字迹判断身份(https协议下ssl证书保证网页内容的发布方身份)
  2. 由老师的信誉保证(1)的判断是真实的(ssl证书中会说明其颁发单位,该颁发单位保证证书是真实有效的)。

所以,https协议相对更加安全。

  1. 页面加载时间过长,经过查看发现是因为调用了http资源:1是腾讯的云平台,3是腾讯管家。于是,停用腾讯云平台及管家,禁用discuz tips(修改plugin/manyou/Service/DiscuzTips.php)。
  2. [media]代码无法正常显示,仔细阅读代码后发现必须按照[media=type,width,height]写入。另外,in_array(count($params), array(3, 4))的判断条件非常奇怪,因为第4个参数永远用不到。
  3. 全站http化之后ku6的swf无法正常插入。解决方法1:仅保留登陆时https。解决方法2:允许混合内容。

一般的使用情景:

  1. 你不希望你的公司的员工上班的时候打游戏、聊qq、刷微博,所以你只是把公司内部的电脑互相连起来了,它们组成了一个局域网。
  2. 但是你自己想上网,于是你拥有整个公司里唯一一个可以上网的电脑:你可以打游戏、聊qq、浏览google、YouTube、Twitter等网页。
  3. 由于工作需要,你的一部分员工需要和客服发邮件怎么办呢?你跟他们说,如果你想上mail.126.com,你就在浏览器里面输入:theOnly2WebsitesYouShouldGo-1.dingxf.cn。然后果然,那个员工登录了mail.126.com,就跟在家里登录126一模一样。

这是怎么实现的呢?

  1. 用户输入theOnlyWebsiteYouShouldGo.dingxf.cn之后,他的请求会发送到公司里唯一一台可以上网的电脑那里,这台电脑就是反向代理(Reverse Proxy Server)。
  2. 这台电脑(Reverse Proxy Server)查看用户的请求以及老板(你)的记录:
    1. theOnly2WebsitesYouShouldGo-1.dingxf.cn对应mail.126.com
    2. theOnly2WebsitesYouShouldGo-2.dingxf.cn对应www.dingxf.cn
  3. 根据记录,Reverse Proxy Server访问mail.126.com
  4. Reverse Proxy Server把126服务器传回的内容转交给用户
  5. 外界看来,是Reverse Proxy Server在访问126服务器,他们并不知道是哪个用户在访问126服务器;而对于用户,他们通过Reverse Proxy Server终于可以上网了。

以上是基本原理。

以下是设置方法:

拥有一个顶级域名(例如www.example.cn)

添加一个VirtualHost:

<VirtualHost *:443>
ServerName www.example.cn:443
DocumentRoot “/phy/dir/on/your/machine/”
Include conf.d/ssl.conf.default

SSLProxyEngine On
ProxyPass / https://www.google.com/
ProxyPassReverse / https://www.g.com/
ProxyPassReverseCookieDomain https://www.g.com/ /
ProxyPassReverseCookiePath / /
</VirtualHost>

conf.d/ssl.conf.default的内容:

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
SSLCertificateFile /your/crt/file
SSLCertificateKeyFile /your/private/key/file
SSLCertificateChainFile /your/ca-bundle/file

<Files ~ “\.(cgi|shtml|phtml|php3?)$”>
SSLOptions +StdEnvVars
</Files>

SetEnvIf User-Agent “.*MSIE.*” \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

我省略了很多内容,后面的帖子会慢慢讲~

2015.08.24,再次开通了博客。域名是blog.dingxf.cn,依旧用了LocVPS。这次不写英文博客啦!宣传自己的页面就用neutrino.dingxf.cn好了,这个是英文的。默认的主站是(www.)dingxf.cn目前还是七夕主题~)。另外还有一个acg的论坛:acg.dingxf.cn

我会不定期的更新一些文章,包括服务器搭建、neutrino方面的话题等等。

 

又到4点半啦~ 晚安!