刚申请了bae的邀请码,发现python应用的开发需要单独申请,又申请python的开发资格。现在bae支持pyhon,php,java。python和java正在公测。 现在bae还在免费^_^,python集成了django框架。就试了一下,和sae的差不多,算是轻车熟路。记得自己是09年开始接触的python,那时是通过gae才开始学习python。但那时只是单纯的想搭建一个论坛,在修改放在gae上的开源代码,哦那时候找了基本python的pdf书籍都是英文的。后来接触php,看到sae,用php开发了一个微博应用。当sae支持python,我就向大牛要了一个邀请码,体验了一把^_^。国内的云主机基本用了个遍,盛大的也使用过,好像就剩下阿里云了。 准备用bae开发一个百度应用,就用这15天。

Continue

方便自己手机记录,而且不需要导出到电脑保存,直接存到sae上了。主要记录自己的很多很突然的想法,用的sae的kvdb顺便参加了sae的活动,能拿1000个豆子。 文档的加密算法是自己写的,主要通过密码的长度和字符,密码又经过md5加密了。虽然没有达到自己预想的样子, 地址:http://0x55aatools.sinaapp.com/text/ 还是用的django和twitter bootstrap ,写小工具很快。 python sae的KVDB不支持pkrget 按key前缀查找,只好自己遍历了所有文档进行后台文档的管理,url就是进行了简单的md5加密,这个写的时候应该加大难度。

Continue

看了oschina上的两个代码,受益匪浅。其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束。这将阻塞正在调用的线程,直到调用join()方法的线程结束。(好难翻译,应该是这个意思) 哈哈,这个易懂。 join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法。

#-*- encoding: gb2312 -*-
import string, threading, time

def thread_main(a):
    global count, mutex
    # 获得线程名
    threadname = threading.currentThread().getName()

    for x in xrange(0, int(a)):
        # 取得锁
        mutex.acquire()
        count = count + 1
        # 释放锁
        mutex.release()
        print threadname, x, count
        time.sleep(1)

def main(num):
    global count, mutex
    threads = []

    count = 1
    # 创建一个锁
    mutex = threading.Lock()
    # 先创建线程对象
    for x in xrange(0, num):
        threads.append(threading.Thread(target=thread_main, args=(10,)))
    # 启动所有线程
    for t in threads:
        t.start()
    # 主线程中等待所有子线程退出
    for t in threads:
        t.join()  

if __name__ == '__main__':
    num = 4
    # 创建4个线程
    main(4)
###################################################################
#-*- encoding: gb2312 -*-
import threading
import time

class Test(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self._run_num = num

    def run(self):
        global count, mutex
        threadname = threading.currentThread().getName()

        for x in xrange(0, int(self._run_num)):
            mutex.acquire()
            count = count + 1
            mutex.release()
            print threadname, x, count
            time.sleep(1)

if __name__ == '__main__':
    global count, mutex
    threads = []
    num = 4
    count = 1
    # 创建锁
    mutex = threading.Lock()
    # 创建线程对象
    for x in xrange(0, num):
        threads.append(Test(10))
    # 启动线程
    for t in threads:
        t.start()
    # 等待子线程结束
    for t in threads:
        t.join()
在程序中,最后join()方法的调用就明白了,是主进程挨个调用子线程的join()方法。当四个线程都执行完毕后,主线程才会执行下面的代码,在这里也就是退出了。 相对应的在网上一起找到的另一个方法: 3.守护进程 setDaemon() 这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法啦

Continue

由于外网不能访问学校的外网,链接就没有修改。做一个小记录: 漏洞链接:http://jw.xxx.edu.cn/DownHandler.ashx?id=646&downloadurl=~/UploadFiles/DOC/20126/20126158745430.DOC 很明显是个任意文件下载漏洞,应该是我们学校学生写的代码。危害不用多说,Web.Config成功下载,数据库文件没有下载成功。 已经通知管理员,好久了也没给回复,也没有修复。 DownHandler.ashx文件代码:

string id = context.Request.QueryString["id"] as string;
string downloadurl = context.Request.QueryString["downloadurl"] as string;
if (String.IsNullOrEmpty(downloadurl) || !File.Exists(context.Server.MapPath(downloadurl)))
 {
context.Session["errorInfo"] = "要下载的文件不存在!";
 context.Response.Redirect("~/Error.aspx",true);
 return;
}
string clientname = Path.GetFileName(context.Server.MapPath(downloadurl));  //要下载的文件的文件名
context.Response.Clear();
context.Response.AddHeader("Content-Disposition", "attachment;FileName=" + clientname);
context.Response.ContentType = "application/octet-stream";
context.Response.TransmitFile(context.Server.MapPath(downloadurl));
context.Response.Flush();
context.Response.End();
直接判断文件是否存在,然后就下载了。

Continue

开始看了一大堆的base64的资料,准备用python写代码的时候发现,这么简单,根本不需要知道算法。。。。 用了python会不会越来越懒。T_T base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。 他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码; encodestring,decodestring一组,专门用来编码和解码字符串; b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。

>>> base64.urlsafe_b64encode('13\'')
'MTMn'
>>> base64.urlsafe_b64encode('13')
'MTM='
>>> base64.urlsafe_b64decode('MTMn')
"13'"

Continue

为博客添加了一个漂亮的模版^_^,也不管会不会被搜索引擎降级,这里觉得google做得比百度不止好一个档次。写博客只是为了记录自己学习历程、学习笔记,不管太多。 有点小难受,闹肚子。在qq空间发了状态:”青春就是做自己喜欢做的事,并且不会后悔~“老爸给我回复了,应该算鼓励吧。 今天星期二,没课了。开始写简历了,忐忑中~这应该也是个学习的过程。 这三个周安排的硬件实习,不知道为什么要这么长时间。

Continue

我是在Ubuntu 10.04.3 LTS下安装的,简单介绍一下。 nmap安装命令:apt-get install nmap Metasploit安装命令: wget http://downloads.metasploit.com/data/releases/metasploit-latest-linux-installer.run chmod +x metasploit-latest-linux-installer.run ./metasploit-latest-linux-installer.run 一路回车就ok了。

Continue

昨天在群里聊天的时候,有一段时间没看聊天记录,只看到他们在讨论不知道root密码,su命令不能用。我就说了句为什么要su。直接sudo不久行了么。然后发给我个命令"sudo chmod -R 777 /usr",说是执行这个命令了,sudo不能用了 ,我也没多想,直接敲上试了下。我查,果然不行了 ,然后就到网上查了一下原因以及解决方法。记录如下: 1 开机grub引导页面,按esc 或者是 shift(我在这里试了五六次,组后是不停狂按两个键,才进去的),grub启动页面时间很短,但是现在不能执行sudo命令,时间也不能修改,只有狂按了。这是为了进入recovery mode(修复模式)。 2 进入recovery mode(修复模式)之后,选择recovery mode(修复模式)并回车,下一个界面选择boot,下边有命令提示终端,我直接在里面输入命令,搞定~ 3执行的命令,这个可以多种途径。网上直接是执行: chown root:root /usr/bin/sudo chmod 4755 usr/bin/sudo 我的方法是直接 passwd root ,修改密码。保证下次不用这么麻烦了。然后reboot,重启之后在su,切换到root下执行的命令。 4 为 SUID 2 为 SGID 1 为 SBIT SUID 权限仅对二进位程序(binary program)有效; 运行者对於该程序需要具有 x 的可运行权限; 本权限仅在运行该程序的过程中有效 (run-time); 运行者将具有该程序拥有者 (owner) 的权限。

Continue

1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky 2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky (n 为数字,若 n 为 .,表示从当前行开始到最后一行) 3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ VIM中常用的替换模式总结。 1,简单替换表达式 替换命令可以在全文中用一个单词替换另一个单词: :%s/four/4/g “%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可 如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “\<” 来指定匹配单词开头: :%s/\” 来解决这个问题: :%s/\/4/g 如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你: :%s/\/4/gc 2,删除多余的空格 要删除这些每行后面多余的空格,可以执行如下命令: :%s/\s\+$// 命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是 “\s\+$”。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。 3,匹配重复性模式 星号项 “*” 规定在它前面的项可以重复任意次。因此: /a* 匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “\(“,后面加 “\)”。因此这个命令: /\(ab\)* 匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。 要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。 /ab\+ 匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。 要匹配一个可选项,用 “\=”。 例如: /folders\= 匹配 “folder” 和 “folders”。 4,指定重复次数 要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如: /ab\{3,5} 匹配 “abbb”,”abbbb” 以及 “abbbbb”。 当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如: 模式 匹配次数 \{,4} 0,1,2,3 或 4 \{3,} 3,4,5,等等 \{0,1} 0 或 1,同 \= \{0,} 0 或 更多,同 * \{1,} 1 或 更多,同 \+ \{3} 3 5,多选一匹配 在一个查找模式中,”或” 运算符是 “\|”。例如: /foo\|bar 这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面: /one\|two\|three 匹配 “one”,”two” 或 “three”。 如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间: /\(foo\|bar\)\+ 这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。 再举个例子: /end\(if\|while\|for\) 这个命令匹配 “endif”,”endwhile” 和 “endfor”。

Continue

解决问题的方法真的有好多种,有的可以用很少的代码实现,好佩服。 自己写的代码:

/*
ID:
LANG:C
TASK:friday
*/
#include
int main()
{
int i,j,n,a[7]={0},t;//t
FILE *fin=fopen("friday.in","r");
FILE *fout=fopen("friday.out","w");
fscanf(fin,"%d",&n);
for(i=0;i

看到蔡勒公式,感觉有意思 记录一下,说不定会用到
    蔡勒公式是一种计算任何一日属一星期中哪一日的算法,由蔡勒(Julius Christian Johannes Zeller)推算出。


公式都是基于公历的置闰规则来考虑。
公式中的符号含义如下:

    w:星期
    c:世纪(前两位数)
    y:年(后两位数)
    m:月(m 的取值范围为 3 至 14,即在蔡勒公式中,某年的 1、2月要看作上一年的 13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
    d:日
    [ ]:称作高斯符号,代表取整,即只要整数部份。
    mod:‎‎同余‎(这里代表括号里的答案除以 7 后的余数)(请注意前面是负数取模的情况,取模只可以是正数)

若要计算的日期是在1582年10月4日或之前,公式则为

(因罗马教皇修改历法,把1582年10月4日的下一天改为1582年10月15日) 

Continue