一个炫酷的HTML5 “闭站保护中”404页面

一个炫酷的HTML5 “闭站保护中”404页面

2年前 (2015-12-18) 浏览: 1210 评论: 3

网站一夜关键词降为0 王柏元的博客疑似被百度搜索K掉,自上个月17号以来关键词个数一路走低,直到这个月降为0,昨天甚至通过“王柏元的博客”、“王柏元”这样的关键词我的网站不在前5名、甚至无法搜索到我的网站,初步判断的原因可能是我上个月解析的www.wangbaiyuan.cn到本网站因为疏忽没有实行301重定向到wangbaiyuan.cn,导致百度搜索认为我的网站被镜像。在未找到确切原因之前,我决定通过百度站长平台采取闭站保护,防止不明原因对网站SEO进一步产生影响。     闭站保护申请期间,百度要求被保护的网站要出于不能访问状态:全站HTTP状态码设置为404,或者将服务器关机服务器。通过域名不解析的方法是不能通过闭站保护审核的。所以对于虚拟主机用户不能切断服务器电源情况下,可以采用全站404的方式申请闭站保护。 新建如下内容的index.php实现全站404 你可以将原来根目录的原index.php文件改名,新建一个index.php内容如下: 这个网页是可以访问但是http状态返回码是404,通过html5实现,能满足404要求,并且界面还是很炫酷的啦! 预览    

回溯法求无向图结点涂色最少颜色数

回溯法求无向图结点涂色最少颜色数

2年前 (2015-12-06) 浏览: 113 评论: 0

回溯法通过深度优先遍历的策略遍历解空间树,其实现过程是:从根节点出发搜索它的所有孩子树或者孩子结点,对于每个结点判断其是否满足约束条件和判定函数,如果满足则进入此结点同样以此结点搜索它的子结点。拥有子节点的结点称之为活节点,当搜索至到没有活节点时则返回原父节点继续寻找活节点,以此类推,直到回溯算法搜索完解空间树。 回溯法由于是遍历完解决问题的所有可能解,所以称它是解决问题的万能算法,只要正确构建了解空间树,通过回溯遍历解空间树即可。回溯算法可以解出解决问题的所有可能解,而在实际解决一些最优解问题时我们可以通过剪枝函数剪掉比中间结果比已求得最优解还差的子树。 无向图的m着色问题的m的最小值求解    

无向图个数最少且元素间不相连的子集

无向图个数最少且元素间不相连的子集

2年前 (2015-11-15) 浏览: 74 评论: 0

问题 设给定一个任意的无向图,将图划分若干的子集,子集集合中任意俩个节点不相连,使用贪心算法使子集个数最少。 算法步骤或流程:   构造一个向量A按结点度大小加入。 构建向量B为空,B存储最后的结果,其元素为子集 取向量A的第一个元素m(即度最大)加入向量B,遍历B中的元素,如果m与B中元素(子集)中的元素都不相连,则加入到当前子集,如果相连则创建新子集。 将向量A中m除去,重新对向量A按度大小排序,重复3 C++代码  

一瓶啤酒烫烫烫

一瓶啤酒烫烫烫

2年前 (2015-11-01) 浏览: 162 评论: 0

现在网上很多人黑程序员,“只有程序员才能听懂的笑话”常常出现在朋友圈,各种娱乐化程序员,极客人有时候也表示很无辜。听人讲起下面这个程序员的笑话,逼格算是比较高了,哈哈! 两个字符串走进酒吧。 第一个字符串对服务员说:“给我来一瓶啤酒烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”。 “请原谅我的朋友,”第二个字符串说:“他忘了加\0”。   初听这个所谓笑话的时候感觉莫名奇妙,直到昨天调代码遇到字符数组中出现的情况才明白了一二: 至于出现烫烫烫的原因,下面是从百度抠下来的解释: 在用VC写代码时,经常会遇到在栈中申请空间的并且没有被初始化的字符数组就会显示"烫烫烫烫。。。",虽然是知道编译器对栈中没有初始化的数据会进行默认的初始化工作。如下面的代码: 代码很简单,就是在栈中申请了一个大小为4个字节的字符数组。 用断点查看X的值,可以发现,“烫烫”出现了: x 0x0012ff60 "烫烫烫烫?" char [4] 查看反汇编:     简单解释一下关键句的含义: 004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh] 将获得的0CCh大小的栈空间首地址赋给edi 004113B2 B9 33 00 00 00   mov         ecx,33h rep的循环次数为33h 004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh eax = 0CCCCCCCCh 004113BC F3 AB            rep stos    dword ptr es:[edi] 将栈空间的33H个双字节赋值为0CCCCCCCCh 而0xcccc用汉语表示刚好就是“烫” oxcc正好是中断int 3的指令 起到保护作用 (参考:) 在Debug 模式下,VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。但是Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么。 未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理,0Xcdcd就是“屯”字。   ‘\0’的含义 ‘\0’在很多编程语言中代表着一段字符的结尾,编译器判断我们字符串到哪个地方结束都是根据'\0'判断的,如果遇到'\0',就停止读取字符串,如果一直没有碰到'\0',会继续往下找。

根据前中序遍历构建二叉树

根据前中序遍历构建二叉树

2年前 (2015-11-01) 浏览: 235 评论: 1

根据前序遍历和中序遍历构建二叉树的基本思想是使用递归算法;首先构建根节点的左子树和右子树,而在构建根节点的左右子树的时候又要构建左右子树根节点的左右子树, 所以很容易想到递归算法;本项目构建二叉树的主要函数是CreateBinaryTree,其参数有char *preorder, char *inorder, int n,分别是当前构建二叉树的前序排列和中序排列和结点个数;直到构建的子二叉树中节点个数为零,即完成了递归。 根据前中序遍历构建二叉树  

java中MD5 16和32位加密

java中MD5 16和32位加密

2年前 (2015-10-04) 浏览: 1608 评论: 2

java中MD5 16和32位加密,下面的Md5类中,通过构造函数Md5(String sourceStr)传入加密字符串,而get16和get32顾名思义是分别获取字符串的16位和32位MD5哈希值。Md5加密方式不能反向解密,任何一个字符串乃至一个超大文件都可以获得MD5值,并且是独一无二的。一个4G大的文件加密为一段32位字符串后,即使对文件改了哪怕一个字节,算出来的Md5和原文件的Md5都会有天壤之别,所以Md5算法常作为大文件完整性的校验。 在线Md5加密、“解密”网站 网址:http://www.cmd5.com/ 需要指出的是,虽然Md5是难以解密的,但是由于同一字符串只能得到唯一的字符串,如果我们维护一个数据库记录下一些常用字符串的原值和Md5值,当输入的Md5能在数据库中找到记录的话,就能很快找到Md5值对应的原值。即所谓“解密”。 java中MD5 16和32位加密代码  

Android模拟点击按钮

Android模拟点击按钮

2年前 (2015-10-02) 浏览: 577 评论: 0

在安卓开发过程中,常常会出现在不同的环境的情况下执行相同的操作,当然我们很容易想到的方法就是将相同的操作抽出来放在一个函数中,在执行相同或者类似的操作中只需要届时运行函数即可。如果执行的函数在不同的类或者activity(当然activity也是类),我们只需要将函数的访问等级定义为public static即可。 上面的相信即使是最基础的开发者都知道,似乎极客人在此没有什么说的必要。在一个类A中调用另一个类B的公用静态方法b时,如果方法b中使用了类B的其他变量c、d、f等等,在修改方法b为公用静态时还要将类B的变量c、d、f一并修改为静态变量,因为静态方法不允许调用非静态变量,这一改往往牵一发而动全身。 有时候我们常常会恰巧遇到这种情况:类B中执行的操作就是点击Activity某一个按钮所进行的操作。比如我们在开发一个安卓app时常常有一个应用更新的功能,进入MainActivity时,app往往在后台神不知鬼不觉地执行一下检查更新的操作,同时在APP的“关于”页面我们还能让用户手动点击button然后“检查更新”。其实这两个检查更新的执行动作是一模一样的,如果重复写在两个Activity中将十分麻烦。,这个时候我们不妨尝试一下安卓按钮的模拟点击,实现代码模拟人手点击按钮。 代码: 调用performClick()可引发 Click 事件

遭受恶意扫描下载zip攻击的惊险之旅

遭受恶意扫描下载zip攻击的惊险之旅

2年前 (2015-09-20) 浏览: 299 评论: 6

最近王柏元的博客颇不宁静,昨天已经是阿里云第三次发送主机资源超标耗用导致网站强行停机了: 我们抱歉地通知您,由于超标消耗系统资源,您在万网购买的虚拟主机免费版类型主机产品qxu10******3已关停。   极客人无奈一次又一次手动重新启动主机,而阿里云免费主机一个月只能三次手动重启站点,这令我 是十分困惑。由于极客人使用的是阿里云免费虚拟主机,其配置都受到严格的限制,更自然不及一些独立的服务器,但是对小规模的博客网站还是绰绰有余的,而由于资源耗用过度这两个月才 出现的问题。而且这两个月我的网站访问量并没有比前几个月多出多少,而且还关闭了一些如百度云观测、神马搜索等机器人的访问,应该不存在访问量过多导致主机停机。所以资源超标耗用的问题着实 让我不解。 一、分析网站日志 网站日志是访问者访问网站时,网站自动记录访问时间、访问者IP、UA、HTTP请求类型、请求网址、来源网址以及返回的状态码。 通过阿里云给我发送的通知邮件中的日期时间, 我找到了三次主机停机最后时刻的相关网站日志。除了第一次停机时的网站日志没有异常外,第二次和第三次停机时的情况竟然“神奇”般地雷同。 2015年9月19日14:10左右的网站日志 2015年9月17日18:10左右的网站日志 通过网站日志可以找到一下规律: 请求方式为HTTP head; 请求极其密集(9月17号在一分半内请求523次;9月19号在一分钟内请求424次) 主机崩溃最后一刻返回状态码:500(服务器内部错误) 请求文件类型为zip压缩文件,为www,web,wwwrroot等看似没有规律的文件名 二、我的分析结论 HEAD为http中像GET、POST一样的请求方式,与GET不同的是:客户端向服务器发送HEAD请求。服务器只会返回页面的head头部部分,这就比请求页面主体部分快得多。 上面网站日志记录的IP显然是通过HEAD扫描我的网站根目录中可能的zip文件,通过HTTP状态码,攻击者就可以知道它随机扫描的zip文件是否存在,如果存在的话就进行下载。当然,日志中清一色的404(请求的资源不存在)说明攻击者并没有得逞:获取我网站上“他想要”的zip压缩文件。这让我虚惊一场,然后,密集的请求却导致了我主机耗用资源超标。 可能你认为即使下载几个zip文件并无大碍,但是可以发现攻击者想要下载的zip文件名看似随机其实大有文章。 web、wwwroot、www是网站根目录常见用名,包括极客人在内的广大站长可能经常会将自己网站上的文件进行定期备份:全选然后压缩。就像在 计算机上压缩几个文件夹或文件一样,创建的压缩文件名往往和根目录相同。所以攻击者恶意遍历可能的 根目录名.zip,然后试图下载你的网站备份文件。而以wordpress建站系统为例,你的备份文件中的某些文件(wp-config.php)就记录了你的FTP和数据库密码,可以说,知道了FTP和数据库密码,你的网站意味着全线沦陷。 三、采取防治措施 1、禁止请求zip等压缩文件 由于虚拟主机的权限有限,我们控制用户访问行为最高效的就是在htaccess添加相关规则了,禁止请求zip等压缩文件的规则如下,请在: 上述规则会禁止请求zip\rar\gz格式的压缩文件。 2、处理head请求 head请求在http请求中并不常用,我们完全可以禁止这种请求方式: 上述规则会导致不管head方式请请求什么,都会重写到百度首页,要下载就去下载百度首页吧!    

安卓实现倒计时按钮效果

安卓实现倒计时按钮效果

2年前 (2015-08-20) 浏览: 225 评论: 5

安卓手机管家类软件,在对手机的应用权限进行管理时常常会跳出这样的弹出框。 这样的按钮出现在很多场合,系统会给一定时间比如30s提示用户选择操作“禁止”还是“允许”,并设置倒计时,并在倒计时为零后系统会为用户选择默认行为执行。这个设计十分智能化,在无人使用手机时实现了自动化处理。下面介绍使用handler和Runnable实现这样的按钮是效果: 安卓实现倒计时按钮效果 在极客人的一篇转载文章《Android使用线程更新UI的几种方法》中,提到了用在Android里使用 Runnable和 Handler.PostDelayed(Runnable,Time) 定时更新界面。下面我讲解的便是使用Runnable和 Handler.PostDelayed(Runnable,Time) 实现倒计时效果的按钮。 假设点击倒计时按钮的动作为运行函数 function(),按钮变量名为forbiddenBtn下面是实现的代码: 原理 上面代码实现的原理是使用timeHander.postDelayed(context,int)函数定时调用一个Runnable呢,这里是延时1000ms执行一下timerRunnable。调用上述倒计时的代码为: 即立即执行timerRunnable;当执行timerRunnable时,由于second初始化为30s,if语句执行else部分,second在button上显示出来后执行减1,然后通过timerHandler.postDelayed(this, 1000); 在1秒后再次执行timerRunnable,此时second=29……依此类推,当second=0时,就会执行function(),执行倒计时归零后的默认操作,

Android使用线程更新UI的几种方法

Android使用线程更新UI的几种方法

2年前 (2015-08-18) 浏览: 185 评论: 0

方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 可以实现功能,刷新UI界面。但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 方法二:(Thread+Handler) 查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。 Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。   方法三:(java习惯,不推荐) 在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。 我们需要引入import java.util.Timer; 和 import java.util.TimerTask;   方法四:(TimerTask + Handler) 实际上这样做是不行的,这跟Android的线程安全有关!应该通过配合Handler来实现timer功能的!   方法五:( Runnable + Handler.postDelayed(runnable,time) ) 在Android里定时更新 UI,通常使用的是 java.util.Timer, java.util.TimerTask, android.os.Handler组合。实际上Handler 自身已经提供了定时的功能。   然后在其他地方调用 ================================================ 知识点总结补充: 很多初入Android或Java开发的新手对Thread、Looper、Handler和Message仍然比较迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这些问题,今天就这一问题做更系统性的总结。我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。 对于从事过J2ME开发的程序员来说Thread比较简单,直接匿名创建重写run方法,调用start方法执行即可。或者从Runnable接口继承,但对于Android平台来说UI控件都没有设计成为线程安全类型,所以需要引入一些同步的机制来使其刷新,这点Google在设计Android时倒是参考了下Win32的消息处理机制。  1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理,其中还提供了一些重写方法比如postInvalidate(int left,int top,int right,int bottom) 来刷新一个矩形区域,以及延时执行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一个参数为毫秒  2. 当然推荐的方法是通过一个Handler来处理这些,可以在一个线程的run方法中调用handler对象的 postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些,如果你是Win32程序员可以很好理解这些消息处理,不过相对于Android来说没有提供 PreTranslateMessage这些干涉内部的方法。 3. Looper又是什么呢? ,其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,但是Looper和Handler没有什么关系,我们从开源的代码可以看到Android还提供了一个Thread继承类HanderThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制,Looper对象的执行需要初始化Looper.prepare方法就是昨天我们看到的问题,同时推出时还要释放资源,使用Looper.release方法。 4.Message 在Android是什么呢? 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXXX相关方法如下,同时还有postXXXX相关方法,这些和Win32中的道理基本一致,一个为发送后直接返回,一个为处理后才返回 . 5. java.util.concurrent对象分析,对于过去从事Java开发的程序员不会对Concurrent对象感到陌生吧,他是JDK 1.5以后新增的重要特性作为掌上设备,我们不提倡使用该类,考虑到Android为我们已经设计好的Task机制,这里不做过多的赘述,相关原因参考下面的介绍: 6. 在Android中还提供了一种有别于线程的处理方式,就是Task以及AsyncTask,从开源代码中可以看到是针对Concurrent的封装,开发人员可以方便的处理这些异步任务。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册