博文

我的蹭网之旅之——在网络风暴中蹒跚前进

这一两个月,我的蹭网生活一直并不顺利。 如我之前所提到的,华北电大这边提供了IPv6的接入。但是也如他们自己校内论坛上抱怨的一样——这里的内网环境十分的糟糕。 各种攻击源源不断,直接导致我的IPv6连接不稳定。最初还好,还能够稳定的使用半小时左右,最近半个月更加的变本加厉,连10秒都坚持不了了。刚开始还可以ping通,仅仅过去不到10秒钟,马上就没办法连接了。 最初,我感觉到是有网络攻击,因为接收到的网络数据包的数量远远的大于我所发送的,而我并没有开始下载,而且就算是断网了,我也可以持续不断的收到数据包。 我之前尝试了各种办法,包括用tracert跟踪路由,用show route分析路由表等等……但是只有一个结果那就是:只有那么极其短暂的几秒,我能够上网,其他的一概不可以。然后网关可以ping通,但是第二跳只有在那短暂的几秒内可以ping通,然后很快就挂掉了…… 于是我有段时间甚至放弃了,认为这可能是学校对于蹭网者做的某些限制而放弃了挣扎…… 但是我内心中的极客之魂让我不能停止尝试啊!! 于是今天再次不甘心的在网上搜索——不得不说,这鬼地方没外网,而且3G信号极其糟糕让我难上加难——但是皇天不负有心人,终于让我搜索到有人反映IPv6也有同样的时断时续的问题,虽然他所提供的办法并没有解决我的问题,但是他很明确的指出了这个问题的结症是在多网关和多IP地址导致的。 这一下至少让我更加坚定的相信我是可以去搞定这件事情的。于是我到处寻找解决方案。 网上提供了很多,最接近的提示说:所有带2002开头的IPv6地址都是错误的,而对应的网关也是假冒的一些地址。但是他给出的解决方案是修改前缀策略:即将2001的级别提高,让它能够被优先选择到。 这个很明显解决了我一部分的问题——之前访问PPG这种既有IPv4地址又有IPv6地址的网站,该死的收费系统就提示我登陆了,就是这个一直干扰了我的想法,让我认为是学校针对蹭网者做出了硬性限制。 但是问题并未完全解决,但是至少已经能够把上网的时间延长到1分钟左右。我虽然不断的删除那些涌现出来的假的网关,但是我使用delete route的速度明显没有攻击者的快,我甚至感觉不到自己已经把那个网关删除了,它就又再次恢复了。面对如此疯狂的进攻,我又不得不回到了我最初尝试的方案上,使用防火墙。 首先,我很容易...

用JS做了一个POI表头合并语句的生成器

最近的项目里面要用到POI,不得不说,这比我之前用到的PHPExcel的效率高太多了,本来是件很轻松的事情了。结果碰到的问题就是这个项目的部署限制非常多,不允许在项目目录下放置Excel模板文件,也不允许在数据库中使用BLOB字段存放模板。这样就导致需要手动的将现有的Excel文件的标头用POI语句写出来。 本来这个事情也不算是个很困难的问题,但是碰到一些特别复杂的多行标头,麻烦就来了……因为行特别多,合并单元格需要数来数去的很麻烦,这就让我萌生了想要自动化完成的想法。 还好,Excel自07版之后就是以XML文件为基础的,不再是以二进制文件为基础的了,这样就不需要借助一些第三方工具来读取二进制的配置,只需要把相关的XLSX模板转化为XML文件,然后对XML文件进行操作就好了。 演示在 这里 具体的使用方式如下: 首先先把模板文件另存为Excel 07以上的格式,即XLSX格式。 将文件的后缀名改为RAR,例如原有的为01.xlsx,变更后即为01.rar。 用WinRAR或者其他压缩工具解包。得到一个文件夹。提取其中的xl/worksheets/sheet1.xml文件。(如果有多个标签页,应该是挨个编号的) 把内容拷贝到下面的文本框中,点生成语句,就会自动生成POI语句了。 源代码如下: $().ready(function(){ $("#submit").click(function(){ if($("#input").val() == ""){ alert("请输入内容!"); return false; } //开始从XML文件中把 列抓出来 var str = $("#input").val(); str = str.replace(/^[\s\S]+ /,""); str = str.replace...

最近的工作感触,记录一下

首先就是发现自己对Jquery的理解还是皮毛啊,根本就没有发现它的精髓,一直都只是会用一些change、blur之类的事件+匿名函数的方式,但是上次遇到了动态添加元素并且绑定事件的情况下就没辙了,后来发现Jquery还有live这样的事件委派发方法。 当需要在页面上动态的添加元素,并且同时要给元素添加事件的时候,老的办法自然就是在HTML里面写上一大堆的onclik=、onchange=之类的,但是作为代码洁癖的我自然是不能这么写的,之前我采用的办法是把之前写的绑定事件再次绑定,但是这次我碰上了麻烦,因为我发现这样做了之后之前存在的同类元素的事件并没有消失,重复绑定之后造成了事件会重复执行。Live这样的事件委派方法就解决了这样的问题了。 先看看Live方法的定义: .live() 方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。传递给 .live() 的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM 树的根节点上。在我们的例子中,当点击新的元素后,会依次发生下列步骤: 生成一个click事件传递给 <div> 来处理  由于没有事件处理函数直接绑定在 <div> 上,所以事件冒泡到DOM树上 事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。 执行由 .live() 绑定的特殊的 click 事件处理函数。 这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测 $(event.target).closest('.clickme') 能否找到匹配的元素来实现的。 如果找到了匹配的元素,那么调用原始的事件处理函数。 由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。 它的作用基本上和.bind() 的作用是完全一致的,只是似乎对部分事件的支持不足,但是在新版本中基本上也修正了。 $("p").live("click", function(){     $(this).after("<p>It Wor...

今天终于顺利把eclipse的项目导入到IntelliJ IDEA中了

这东西我一直都是没搞定的...今天阴差阳错的尝试居然终于搞定了... 之前一直没搞定主要的原因就在于确实缺少这方面的教材,加上我的IntelliJ IDEA的版本又很高(11.1),导致网上根本没有类似的教材.不过终于让我摸索出来了. 首先自然还是新建项目,然后选择从eclipse中导入已有项目 然后Ctrl+Alt+Shift+S,设置Project Structure: 选择Project,设置好Project的JDK(这一步一般都会在导入项目的时候强制让你去做) 然后设置好你的输出目录,我这里保持默认就可以了 然后切换到Modules,首先把自己已有的框架添加进去,比如我现有的项目用了Spring和Hibernate,那么就直接点击+号,然后把它俩添加进来,设置不用更改,保持默认就可以了。之后再添加Web,更改Web Resource Directories,把第一个项目改为原项目的WebContent目录。 然后这个时候下方应该出现了两个让你Fix一下的错误了,点击它,让它自动生成Artifacts,它会自动的生成一个[项目名称]:war exploded的设置,保持它的设置不用改变就可以了。 理论上它现在应该添加了一个output root下有WEB-INF和Web facet resources的文件夹结构。 然后点击Run,选择Edit Configurations,添加一个Tomcat的路径,Deployment下使用我们刚才添加的那个Artifacts,然后保持默认就可以了…… 然后,如果你的项目是GBK的项目,记得在File-Setting-File Encoding里面把默认的文件编码改为GBK。 这样就应该可以正常的启动由eclipse创建的项目了。

一边学Python,一边学算法

不带着问题去学习永远是没有什么成就的。 于是为了更好的学习Python,我还是决定开始看算法的研究书,然后用Python来实现这些算法。在学习算法的同时巩固Python的知识。 今天看的是《计算机程序设计艺术》第一卷,用Python验算了欧几里得的求最大公约数的算法 算法的描述是: 有数m和n,求它的公约数的方法是: 1.找到m和n之间的最大数,求它们的余数 2.如果余数为0,则其中较小的那个数即为所求 3.如果余数不为0,则将较大的数置为较小的那个数值,将较小的那个数值置为1中产生的余数,继续进行步骤1 于是产生的程序如下(Python3): __author__ = 'Siglud' # -*- coding: utf-8 -*- def find_greatest_common_divisor(x, y): '''查找最大公约数函数 根据计算机程序设计艺术中第一节的算法来求最大公约数''' temp = x > y and x%y or y%x if temp == 0: return x > y and y or x else: if (x > y): return find_greatest_common_divisor(y,temp)#此处一定要有Return,否则还会执行一轮 else: return find_greatest_common_divisor(x,temp) x = input("请输入x的值:") y = input("请输入y的值:") print(find_greatest_common_divisor(int(x),int(y))) 值得注意的是以下几点: 如果要在Python的程序中使用中文,记得加注释:# -*- coding: utf-8 -*- ,这样才能顺利的进行调试。 在递归的调用中记得一定要用return调用下一轮的函数,否则最后还会执行一轮,这样产生的数据就是错误的了。 ...

开始了,我愉快的蹭网生活~

莫名其妙的跑到华北电力来了...然后莫名其妙的连上了他们的校园网... 结果很正常的...需要登录= = 但是我却惊讶的发现虽然我其他啥都不能用,但是却可以用Google Talk... 最初我以为是Talk连接的是其他端口导致可以使用,后来验证发现并不是如此...结果打开笔记本就发现我获取到了IPv6的地址.... 果然,现阶段的防火墙对IPv6的概念都是0....于是所有走IPv6的数据连接都可以毫无障碍......=v= 于是顺理的上了PPG(PPG一直都有IPv6的地址),然后上去求助找打了Google的HOST,甚至连Twitter都畅通无阻了.... 剩下的就等IPv6的代理,好让我畅游外网了...=3=

今天骑车骑在路上突然想到以前犯的错误

犯错误不可悲,可悲的是不知道自己犯了错 今天骑车骑在路上的时候突然想起来以前做毕业设计的时候,在座的老师的提问。 问题是:你们做的这个内网OA系统所采用的是什么样的加密?可以保证用户不会越权读取其他人的信息? 我当时的回答是Base64……在座老师的笑而不语…… 于是今天我不得不重新的更正一下:不应该用Base64,应该用RSA。 因为RSA是非对称加密,可以保证发信息的人的信息的有效性和安全性。而Base64不能算是加密,只能算是一种编码,主要用于邮件方面对附件等二进制信息的传输。与之相对应还有DES,这个是对称加密,主要用于文件保密,但不能适用在需要点对点阅读传输的情况下