情境:有一台服务器,其外网IP为10.103.25.248,作为宿主机其上运行着许多虚拟机,网络方式为NAT,宿主机的内网IP为192.168.83.1,其中一台虚拟机的ip为192.168.83.131,其8000端口运行着WEB服务,现在需要使10.0.0.0/24的外网计算机能够访问虚拟机上的8000服务。

  因为192.168.83.131是服务器的内部虚拟网络,对外是不可见的,所以需要将虚拟机8000服务映射到宿主机外网IP 10.103.25.248的某端口上上,这就是端口映射,亦即PNAT。

选定端口

  查看宿主机端口占用情况:

1
2
3
root@dell:~# sudo lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2466 confluence 37u IPv6 23593 0t0 TCP localhost:8000 (LISTEN)

  8000已被使用,选择使用空闲的8880端口,即实现10.103.25.248:8880 <===> 192.168.83.131:8000的映射。

Read More

  堆排序我已经遗忘得差不多了,只记得有这么一种方式,且时间复杂度为n*log(n)。下面要做的是根据其算法描述来自行实现,作为一种练习。

关于堆

  看了一下wiki的前两段,大致知道了此处堆实质是二叉树,常用一维数组来表示,有一个很重要的规律,对于以0开头的数组:左右子节点的序号分别为2*i+1, 2*i+2

  作为一个喜欢用理解帮助记忆的人,想弄明白为何如此。

  1. 对每个节点,i = 前(上层及左边)节点数,这是显然的。
  2. 本层的节点数 = 所有上层节点数之和 + 1。(等比数列)
  3. 所以对每层最左节点2*i为本层最右节点,2*i+1, 2*i+2是下层第一二节点,自然是i的子节点
  4. 自i每右移1,2×i移2,依然是其左右子结点。

  以上是堆的父子节点序号对应规律,是进行节点操作的基础。

Read More

原题

请用C语言编写一个函数char hexStr2DecStr(char hexStr),将类似1B, 1C这样字符串转化为十进制字符串26, 27,输入字符串的范围了[0,1000]。
注意不要使用函数库。

一种解法

  以上是题目内容,这个其实没有什么算法,就是看你对C语言的熟悉程度。事实上我已经很久没有编写过C程序,许多语法特点都已经和java混淆了,但是考虑到面试笔试有不少C程序,所以既然遇到就拿来练习一下吧。

  题目要求不使用函数库,这对我这种C语言渣渣来说正中下怀,因为我根本不记得什么函数库。

Read More

  之前在做SDN网络控制器时,写过一个dijkstra的最短路径算法,现在回顾重温一下。
  
  以下面的图为测试样本:


  
  dijkstar算法的大致思想是(假设起点为A):每新到达一个点V,探测所有与该点直接相邻的点(V’)及之间的距离d(V,V’),如果V`是第一次探测到,那么记录其距离d(A,V’) = d(A,V) + d(V,V’),如果已有记录但d(A,V) + d(V,V’)小于之前的记录,则更新记录;直到所有点都被遍历。

Read More

  快速排序,算法经典。我这里要做的,就是分析其设计思想并一步步来实现它。

分治法

  快速排序采用的是“分治法”,其英文名现能体现其特点”divide and conquer”,分割&征服。具体到本算法是这样的:
(以数组从小到大排序为例)

  1. 从数组是选取一个基准数,根据大于或小于该基准数将元素分列到数组左右两端
  2. 对上一步分割出的左右两子数组再次执行步骤1
  3. 循环递归,直到子数组长度为1

Read More

  Windows有一个很奇怪的设定:对一个文件共享服务器只能使用同一用户名,但是我们知道Samba是允许在同一服务器上创建分属于不同用户的共享目录的,这是一个自然而然的需求,Linux本来就是一个多用户操作系统,同为多用户系统的Windows的这种设定就显得非常奇怪,据微软官方的解释是为了安全,然而我并没有看出来这属于哪门子的安全。

  吐槽归吐槽,然而从XP到Win8也没有改变,现在我在Linux服务器上分别设置了两个共享目录,一个公用一个私用,然而当我接入其中的一个目录之后,连接下一个目录进系统自动使用之前的用户/密码,导致权限出现问题……

  我们只能workaround。

Read More

  校园网关登录的常规方式是打开浏览器打开任意(百度)网址,就会自动重定向到登录页面,输入用户名密码即可。但是对于远程Linux服务器或者实验用的虚拟机来说,通常是没有浏览器或者Xserver的,那么就只能用脚本来登录了。

  校内论坛上有同学早些时候放出的版本,但是已经失效了,应该是登录页更新所致,粗略一看脚本并不复杂,所以不如自己搞一个。

网页登录时的后台动作

  祭出Chrome,看看在点击登录按钮时,浏览器做了什么(省去查看网页代码的麻烦)。

  用Chrome打开登录页,按F12打开页面审查,切换到network页,输入用户名&密码点击登录:


Read More

要理解TCP的连接和断开其实不难,需要自己代入情境,如果是你来设计网络协议你会如何做。

连接建立

情况: 通信质量无法保障(IP层的不可靠性)的情况下,如何保证两者可靠通信。

  1. A: 在家吗,我想过来玩?[SYN]
  2. B: 在,你过来吧。[SYN,ACK]
  3. A: 好的。[ACK]
  4. (完成)A出发…

  所谓三次握手,其实是发了三次包,代表一次握手过程中的三个步骤而已。

Read More

  测试需要安装了一个apache,由于80端口已经被nginx占用了,于是修改到了8800端口。然后当访问地址时,总是提示找不到/目录。

1
2
3
4
5
Not Found
The requested URL / was not found on this server.
Apache/2.2.22 (Ubuntu) Server at dell Port 8800

  查看error.log,发现许多

1
2
3
[Fri Apr 24 15:36:30 2015] [error] [client 10.210.106.16] File does not exist: /etc/apache2/htdocs
[Fri Apr 24 15:36:30 2015] [error] [client 10.210.106.16] File does not exist: /etc/apache2/htdocs
[Fri Apr 24 15:36:31 2015] [error] [client 10.210.106.16] File does not exist: /etc/apache2/htdocs

  显然apache将/etc/apache2/htdocs当作了根目录,试着创建该目录,能正常访问了。
  但是显然根目录设置于此是不合适的,根据网上的搜索结果更改sites-availabe , sites-enabled都没有解决问题。
  用find命令在/etc/apache2下查找htdocs字段,也没有结果。
  最后在一个不起眼的小页面上找到了答案。
创建文件:

1
/etc/apache2/conf.d/default-documentroot

内容为:

1
DocumentRoot /var/www #你想设置的目录

问题解决。

  树的遍历应该是一个很基础的问题,但如果要求选手写算法一次通过却不容易,所以又拿来好好研究(熟悉)一番,力求以后再遇到这样的问题能够快速准确地解决。

  以下给出了四种遍历的一种或多种解法,为了快速表达,使用了python语言。四种遍历分别是层序、前序、中序和后序,所谓层序就是由上到下一次遍历一层,所谓前中后则是父节点的打印顺序,N代表父节点,LR代表左右子节点的话,NLR为前序,LNR为中序,LRN为后序。

Read More