@shellex说: RT : 广告之拉拉情缘,SISLEY为主
  • Pages

  • Topics

  • 随便看看

  • 路边社评论员

    • zhangshine:
      呵呵,99宿舍网,好搞 »
    • zhangshine:
      好囧o(╯□╰)o »
    • 御前:
      你大爺 老子可是半專業的!剛入了L號I4...挖哈哈哈3k3(血淚可惜原來的非凡沒帶來北京 要不可以... »
    • alswl:
      @shellex 哦,发现我随便点开2张喜欢的,都进了deviantwear囧~ »
    • alswl:
      @shellex 不错不错,我还专门跑去那个网站看了,貌似是卖T恤的?我个人最喜欢彩虹色的桌面 »
    • alswl:
      我是来看图的~ »
    • SunnyGao:
      从来木考虑过要备案囧...... »
    • wangxxx:
      在学雷锋日 前来留名 »
    • makestory:
      乐观预计2020年之前这款游戏可以正式上市。 »
    • xiao3:
      你的模板都太暗!暗色系~~ »
    • shellexy:
      贴上应付猫和苏的桌面点名http://img.ly/A3thttp://img.ly/A3V文字什么... »
    • shellexy:
      @shellex 我点击了【回复这个鸟人。】,结果发现是回复猫猫。为啥上次还是黑色字体的,这回又... »

Posts Tagged ‘programming’

用Python可视化Profile

得益与Graphviz以及Python强劲的自省能力——Abettor GG,这就是你当年乐道的‘反射’啦,Shellex搞了一个可以生成Call Graph的东东。
谢谢Python-cn的各位同学给偶这个小菜菜的帮助,顺便过了一遍《源码剖析》的第八章。

class call_tracker:
def __init__(self, cls, logfile=’track.log’):
self.stack = [('Push', 'start')]
self.call_map = {}

cls = cls if isinstance(cls, list) else [cls]

[...]

用Python绕过SB的99宿舍查四六级分数

想知道为什么CET查分总是失败么?
想知道30秒倒计时的作用吗?
想知道99宿舍(cet.99sushe.com)有多SB吗,请移步Cnbeta:
http://www.cnbeta.com/articles/77828.htm
http://www.cnbeta.com/articles/77823.htm
下面是使用简单的python查分的方法:

import urllib, urllib2
url=’http://cet.99sushe.com/cetscore_99sushe0902.html?t={四级或者六级}&id={你的准考证号}’
conn = urllib2.Request(url)
conn.add_header(‘Referer’,'http://cet.99sushe.com/’)
print urllib2.build_opener().open(conn).read()

上文中的{四级或者六级}换成4或者6。
你可以在你的python终端里直接输入上面的代码。可以看到出来了一串逗号分隔的字符,从左到右分别是 “听力,阅读,综合,写作,总分,学校,姓名”

初尝Linux栈溢出

利用栈缓冲区溢出的本质,就是利用程序的漏洞和缺陷,使用精心构造的输入去触发溢出,改变EIP寄存器的值,从而能够控制程序的流程。
但是EIP寄存器可不是像通用寄存器方便的,能说改就改,这可是整个程序流的根本所在。但是难改是难改,但是不代表没法改嘛。
程序在执行子过程时总是要根据过程地址通过跳转指令重新设置eip的值,原来的值则和别的状态一起暂时保存在栈中,这就给了Shellex可乘之机。
Shellex的平台:

$ uname -a
Linux shellex-laptop 2.6.27-7-generic #1 SMP Tue Nov 4 19:33:20 UTC 2008 i686 GNU/Linux

首先Shellex写了这么一个程序

#include “stdio.h”
#include “string.h”
int fun(char *str) {
char buffer[10];
strcpy(buffer,str);
printf(“%s”,buffer);
return 0;
}
int main(int argc,char *argv[]) {
int i=0;
char *str;
[...]

如何从NFA转换到DFA

在上一篇文章里面,Shellex阐述了将正则表达式转换成NFA的通用方法,算是对以前编译原理课程的回炉重炼了一遍。
下面Shellex将重炼进行下去。对于一个NFA,如何转换成DFA呢?
根据上回说的,一个 NFA 在读入符号串之后,并不确切地知道自动机的下一个状态是什么。但可以肯定的是,下一个状态一定处于某个状态集中。不妨该状态集记做  {q1,q2,…qk}  。
而一个等价的DFA 读入同样的符号串一定处于某个确定的状态上。
这样,都是读入同样的w,  DFA  到达某一个状态,而  NFA  到达某一个状态集。由  w  的任意性,可将  NFA  的所有的状态集和  DFA  的状态一一对应起来。这种对应的前提就是能识别同样的输入串。即  L(M1)=L(M2)  。
所以可以看出,我们要做的就是将 NFA 状态集归并为 DFA 中的状态。
为了归并的成功,Shellex先介绍三种基本操作:
ε-closure(s):从状态s出发,返回仅仅通过ε边可以到达的最大状态集合
ε-closure(T):从状态集合T中的每一个状态出发,返回仅仅通过ε边可以到达的最大状态集合
move(T, w):从状态集合T中的每一状态出发,返回w边指向的下一个状态的集合
接下来Shellex用一个NFA为例,分析整个过程:

可以看到,这是一个典型的NFA。状态1到状态2存在ε边,而状态3有两个b边,分别指向自己和状态4。
S1=ε-closure(1); //S1={1,2}
S1a = move(S1, ‘a’); //S1a = {3}
S1b = move(S1, ‘b’); //S1b = {}
S2 = ε-closure(S1a); //S2 = {3}
S2a = move(S2, ‘a’); //S2a={}
S2b = move(S2, ‘b’); //S2b={3, 4}
S3 = ε-closure(S2b); //S3={3, 4}
S3a = [...]

如何将正则表达式转换为NFA

最近得做一些跟自动机有关的东东,其中一部分可以简要地看作是由一套正则文法生成状态自动机的过程。
什么是正则表达式?
首先我们看看什么是正则表达式。这个东东呢,一般用于描述一个字符串的集合——直接说就是一个正则表达式可能可以匹配一大堆字符串,而这一大堆字符串可以形成一个集合,它们的共同特征就是可以被这个正则表达式匹配。就像去死去死团,但是不同的是去死去死团的团员的共同特征是不被任何异性所匹配——但是这没关系,我们不妨取去死去死团的补集就行了。
反正正则表达是很好啦,因为你只要用一点点在脏话里,就可以骂好多好多人,比如:
Mar(y|k|cus) is son of bitch.
真是非常de省力,唯一的缺点是可能对方不知道你在说什么。
好了,从上面我们可以看出正则表达式中的两个基本结构:

连结 (Concatenation),比如 bitch,由b, i, t, c, h连接而成
联合 (Union),比如 y|k|cus,可以认为是y或k或者cus

下面是第三个基本结构,被称为Kleene star (或者 Kleene 闭包)的。因为这个操作是Stephen Cole Kleene发明的。啊啊,其实正则表达式这个东西就是Kleene发明的。这个同学真是非常的牛B,因为他是更加牛B的 阿隆佐 – 丘奇 ( Alonzo Church )——历史上和阿兰 – 图灵 ( Alan Turing ) 并称的人物——的学生。有多牛B呢,这个Kleene还和他的老师,还有图灵,就递归论发表了论文,奠定了可计算理论的根基。啊哈哈哈,真是牛B啊。
嗯,所谓Kleene Star的例子就是这样的。

Kleene Star,比如a*,可以接受空串和若干个a连结组成的串

当然咯,还有一些别的操作,比如我们知道的+,?,集合[]等等,但是这些操作都可以通过上面三个基本操作的组合来完成。
比如+,a+可以认为是aa*
什么是NFA?
要说NFA嘛,我得先说说DFA。所谓DFA,就是Deterministic Finite state Automata的简称。是状态机的一种。通俗的说,就是一大堆状态的集合,里面有一个初始状态和若干终止状态,每个状态可以有若干个输出边前往别的状态。但是要求每个状态的同一种输出边至多只有一个,所以自动机被称为是”Deterministic”的。
比如下面这个例子:
表述的是一个电灯de开关,这个开关每按一下就从’开’状态转换到’关’状态,或者从’关’状态转换到’开’状态。而为了从环保角度出发,在’关’状态才被认为是终止态。

上面的自动机呢,就可以描述这个灯泡的行为模式,或者说可以描述电灯的状态转换过程。输出边就是’开’或者’关’的动作,或者说这个灯泡的开关,只接受这两种动作:“Trun On”,“Trun Off”。而”Trun On”动作只会导致灯的状态变成“On”,“Trun Off”动作只会导致灯的状态变成“Off”,这是确定的,你的外婆都可以预料到的。所以说DFA是确定有限状态自动机。
现在可以说NFA了。这个NFA嘛,全称是Non-deterministic Finite state Automata。也是状态自动机的一种。确切地说,刚才的DFA是NFA的一个子集。和DFA唯一的区别就是他是”Non-deterministic”的,哈,非确定的,每个状态的同一种输出边可以不止一个。
还是用刚才的例子。现在假设我们的电灯有一种新的状态咯~:坏掉了。灯丝被过大的电流烧断了,听上去遭透了,因为一”Trun On”就得准备换灯泡了:

但是我们没法确定的知道哪一次Trun On会导致灯泡坏掉,使得灯泡进入”Down”状态的那次“开”操作看上去跟你昨天开灯的那次操作一模一样(严格的说,每一次点亮灯泡都会导致灯丝的状态发生变化,但是在此简化了)
所以从状态”Off”出来的输出边中,”Trun On”有两条,这就导致没法根据当前状态和输出边确定下一状态,这就是为什么称为非确定性有限自动机的原因。
如何转换?
刚才Shellex说了,正则表达式有三种基本结构。如果能先将这三种基本结构转换成对应的NFA,然后在用这三种基本结构去拼装成完整的NFA是不是很省力呢?
下面就是三种基本正则表达式的NFA
ab:

a*:

a|b:

里面出现了一种叫“None”的边。这个不代表这个边是字面上的“None”,而是指这个边是个空边。也就是说任何“动作”都可以从这个边进入下一个状态。它的学名叫 epsilon 边,一般表示成’ε’,Shellex这里表示成“None”了。
下面我们来考虑正则表达式到NFA转换。给出一个正则串的输入,得到一个NFA的输出。被广泛采用的是Thompson Algorithm,也就是所谓的子集算法。该算法的发明人应该就是写ed编辑器的那个Thompson大牛。该算法的实现和算术表达式的求值非常的类似,需要一个符号栈存放操作符,一个自动机栈存放生成的自动机。算法结束后,可以从自动机栈中Pop一个最终的结果。
比如对于正则表达式(a|b)*cd,求值过程如下:
PUSH a To automaton stack
PUSH [...]

如何让试用版程序永不过期

[声明:本文仅供学术研究使用,涉及所有源码按照GPLv3发布,非法使用的后果由使用者自己承担,作者已经相关文章作者不负任何责任]
即使在Linux上,我们有的时候还是不得不使用一些商业收费软件。而这些软件很多只提供了有时间限制的试用版本,试用期过后还想使用的话,要么重新安装,要么去购买使用许可。
对于一个熟练的Cracker或者一个牛B的Hacker来说呢,以稍微破坏一下法律的权威的代价获得一个没有限制的版本并不算太困难。下面提供的两个方法可以在不逆向软件的前提下,在user level做到,适合我等对汇编不感冒的同学使用。
You Xu同学曾通过ptrace的方式拦截时间相关的系统调用,返回一个假的时间来使得这些试用版程序误以为自己还没有过期,从而可以达到这个永远使用该试用版本软件的目的。我先简述他的方法,然后再提供另一个方法。
现在不妨假设存在这么一个程序,以试用期的方式来限制使用。这个程序通过调用time和gettimeofday来获取时间并且加以比较:

#include
#include
#include

int main(){
time_t now;
time(&now);

struct timeval tv;
gettimeofday(&tv, NULL);

printf(“Now 1 : %s”, asctime(localtime(&now)));
printf(“Now 2 : %s”, asctime(localtime(&tv.tv_sec)));

// you can compare time here…
[...]

测试Wordpress对代码的擅作主张程度.

昨天花花问我为什么Wordpress老是擅自替换代码中的符号,我也不大清楚呢,只知道它有时会把我的”>”转义。(我用的是WP-Syntax插件)
现在我来试试,使用WP-Syntax风格的pre标签:
Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys

def print_a_string(rgb):
print “fuck shit come on baby”

if __name__ == “__main__”:
a = {‘fuck’: ["shit", "come on", "baby"]}
print_a_string()
C++
// Hey, I hate lover
#include
#include “Person.h”
using namespace std;

void fuck(Person &somebody) {
cout

HowTo:握着你的手本地化Sociable插件

写下这么温馨的一个标题是因为突然想起了03年某Hacker杂志上的一篇文章。当时老独说,多么温馨… 咳,真恶心
好了,Sociable是一个Wordpress插件。效果就是我的Blog每篇文章末尾的“ 喜欢这篇文章?点下面的按钮分享到:Google/豆瓣/鲜果/校内/饭否…”的图标条。方便我的读者们在看完我的文章后淫荡一笑,然后推荐到他们使用的社会化网络中去。
很好是不是?是啊,问题是Sociable一点都不了解我国的国情,所以我们常用的国内社会化网络服务站点都没有加入到Sociable里面去。很明显这是一个问题哈,因为我的读者大多数都是在中国的中国人种。
不过还好,Sociable提供了添加自定义站点的方法,下面我将以添加对豆瓣网的支持为例子,演示如何打造一个中国版的Sociable。
1. 提取豆瓣的推荐API
好了,现在我们打开这个页面。根据你的浏览器的类型,豆瓣会展示不同内容。它会提示你将一个按钮拖动到工具栏/收藏夹。这是豆瓣提供的“推荐到豆瓣”的方式,本质上就是为浏览器添加一个javascript伪协议书签。我的浏览器是Firefox,我得到的内容就像这样:
javascript:void(function(){var%20d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:”,r=’http://www.douban.com/recommend/?url=’+e(d.location.href)+’&title=’+e(d.title)+’&sel=’+e(s)+’&v=1′,x=function(){if(!window.open(r,’douban’,'toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330′))location.href=r+’&r=1′};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()
一团糟。不过还好,Shellex已经具备了阅读Javascript的基本能力,所以我翻译出了这段代码的内容就是把当前页面的URL和标题组合进豆瓣的推荐页面地址,然后打开这个地址:
http://www.douban.com/recommend/?url={你的文章地址}&title={标题}&sel={选择的文字,用作摘要}&v=1
好了,现在让我们先把这个地址记下来。
2. 编辑Sociable插件
现在的Wordpress版本已经支持直接编辑插件源文件。如果不支持也不要紧,我只需要你用任何一个文本编辑器打开sociable.php这个文件。搜索“$sociable_known_sites = Array(”,找到$sociable_known_sites这个数组。好了,这个数组就存放着所有支持的站点信息。
数组的每个元素由下面的域构成:
{站点名称} => Array(
‘favicon’ => ‘图标文件名’,
‘url’ => ‘推荐文章地址’,
),
(注意!上面的”>”代表的是”>”,因为Wordpress的白痴语法插件没能防止它被转义)
非常简单对不对?好了,现在我们把第一步中得到的豆瓣推荐地址放进去。比如我是这么添加的:
‘douban’ => Array(
‘favicon’ => ‘douban.png’,
[...]

牛B的正则表达式:整除性判定

如何判定一个数能否被3整除? 比如6。
如果你有Python,可以在交互式解释器里面输入:
import re
print re.match(“1((10*1)|(01*0))*10*$”, “110″)!=None
或者直接在你的浏览器地址栏或者Firebug终端输入:
javascript:document.write(/^1((10*1)|(01*0))*10*$/.test(“110″)); document.close();
其中那个”110″部分为任何正整数的二进制形式。
如果返回/打印出 True,则说明被测试数能被3整除;如果结果是False则是无法被3整除。
看上去很神奇,其实道理很简单。首先我们知道,对于任何一个二进制数总是可以表示为如下形式:
Ac
其中A表示前N个字符,c表示最后一个字符。比如对于12的二进制表示”1100″,A指代的是”110″,c指定”0″
我们知道,2进制中,末尾添0直观地表示原数的两倍,那么末尾添1就是原数的两倍再加一。
基于这个事实,要使得Ac被3整除即 Ac mod 3 == 0,则
存在这么一个函数
f(A, c) =
当c为0时:(A×2) mod 3 = ((A mod 3) × 2) mod 3
当c为1时:(A×2+1) mod 3 = ((A mod 3) × 2 + 1) mod 3
只需要函数f(A, c) == 0就可以了。但是这得求A mod 3,只需要向前递归,把A分解成A’和a’,然后求f(A’, a’)就可以了。现在我们把函数f作为状态转换函数,f的值作为状态,待判断二进制串作为接受串,当然了,终止态必须在0,就有如下自动机:

这样不难得出对应的,判定能否被3整除的正则表达式(^1((10*1)|(01*0))*10*$)
想了解更多正则表达式的在算术上的乐趣,不妨阅读Matrix67同学的文章:http://www.matrix67.com/blog/archives/475
以及http://blog.stevenlevithan.com/archives/algebra-with-regexes

上网久了脖子酸了用用这个软件就好!

Aw同学在校内上贴了一个图,据说是“上网久了脖子酸了看看这个图片就好”

这好了。但是每天都看一样的内容实在太单调了。万一哪位同学想看点别的什么猥琐文字怎么办呢? 所以我做了这么一个软件(Health Reader):

这样你可以随便看些什么猥琐文章都可以咯,不知不觉,潜移默化地,脖子得到了锻炼,就不容易得颈椎病鸟,很好不是么?:)
使用方法:
用python带参数运行。参数为你要阅读的文件,如:
python hreader.py test.txt
下载:
源码、示例文件:http://www.box.net/shared/ub1262tjbu

Page 1 of 41234