可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

Python-Challenge-1

发表 2008-04-23 | 分类 编程相关 | 评论数:
| 字数: 2.4k | 阅读 ≈ 2 分钟

第一关:
其实第一次来这里时俺还不理解这个过关游戏,其实就是根据这一关网页上的一些提示来寻找下一关的URL;其中网页的标题往往是一些暗示。
由图可知:

#!/usr/bin/env python

print 2**38

计算出结果”274877906944“,然后修改URL为http://www.pythonchallenge.com/pc/def/274877906944.html,这就是第二关的地址,我们继续。

第二关:
本来我想得是写程序对字母分别按照ascii值加2然后转换回字母,来查看网页上的那堆”乱码“,以下是比较”难看“的程序:

#!/usr/bin/env python

str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

str1 = ""
for ch in str:
        if (ord(ch) >= ord('a')) and (ord(ch) < = ord('z')):
                str1+=chr((ord(ch)+2-ord('a'))%26+ord('a'))
        else:
                str1+=ch
print str1

看到翻译出来的话后俺才知道有个东西叫做maketrans,再看看使用maketrans写的代码吧:

#!/usr/bin/env python

import string

str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

print string.translate(str,string.maketrans('abcdefghijklmnopqrstuvwxyz','cdefghijklmnopqrstuvwxyzab'))

现在根据提示在URL中进行这个转换,map.html改为orc.html就好了。

第三关:
根据上面的提示,在网页的源代码中找到一堆字符,源代码中有提示”find rare characters in the mess below“,开始写程序提取出这堆字符中的字母:

#!/usr/bin/env python

import re
import string

def find_char():
        list = []
        f = file('mess.txt')
        p = re.compile('[a-z]')
        for l in f.readlines():
                char = p.findall(l)
                if char != []: list.extend(char)
        print ''.join(list)
        f.close()
find_char()

这里使用了正则表达式来判断字母,那一堆的字符我保存在了mess.txt文件中。运行程序后得到”equality”,把orc.html改为equality.html,得到下一关地址。

第四关:
上面有提示”One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.“,虽然人家在上面对单词”EXACTLY“加粗了,我还是开始没注意到含义是”只有“三个大写字母,写正则表达式时匹配到了一堆东西,后来才想起是”有且只有“三个大写字母,看代码:

#!/usr/bin/env python

import re
import string

def find_foo():
        list = []
        f = file('mess1.txt')
        p = re.compile('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]')
        for l in f.readlines():
                char = p.findall(l)
                if char != []: list.extend(char)
        print ''.join(list)
        f.close()
find_foo()

运行后会得到linkedlist,得到下一关的地址:-)

Comments

luguo: DP加油~~继续~!

Amankwah: 呵呵,加油!

Meara: Well written article.

一篇文章引发的思考

发表 2008-04-23 | 分类 编程相关 | 评论数:
| 字数: 1k | 阅读 ≈ 1 分钟

先贴一段代码:

#!/usr/bin/env python

import sys
import random

m = [[0 for x in range(128)] for y in range(128)]

for i in range(1000):
        m[random.randint(0,127)][random.randint(0,127)] = 1

f = file('foo.pbm','w')
sys.stdout = f

print "P1\n128 128"
for i in range(128):
        for j in range(128):
                print m[i][j],
        print
f.close()

再扯一扯题外话,这里,有一个问题,”掷 30 次硬币,至少出现一次“连续 7 次正面”的概率有多少?”,本来以为挺简单的,不过似乎又不是那么简单,谁来算一算告诉俺怎么算。

上面的文章中有C写的一段代码,生成一个pbm的图像,挺有意思的,俺就顺手写了一个Python版的,调用了文件操作就不用手动重定向了。

上面的Python代码中用到了一句生成”二维数组“,这里用这个词有点不太准备,因为Python里面是没有数组的,只有list。

map1 = [[0 for x in range(128)] for y in range(128)]
看起来是一种比较简单的实现一个”二维数组“的方法,不过还有更简单的:

map2 = [[0]128]128
map1 == map2的结果是True,不过第二种定义方式存在问题,请看这里。

还有一种定义方式:
map3 = map(lambda : [0] * 128, range(128))
这里lambda中 ”
“其实只是一个普通的变量,接下来就好理解了,这种方式也比较可靠。

Comments

luguo: 怎么感觉最后那种方式走了Perl路线?? ;-)

luguo: 还有,map是Python的内置函数啊!你怎么用它来命名list呢?

cocobear: Perl的路线? 我觉得很pythonic的。

Amankwah: 现在专攻Python?

cocobear: Python是个好东东。

cocobear: 那个map变量已经改了:-)

wget中文乱码

发表 2008-04-19 | 分类 编程相关 | 评论数:
| 字数: 5.8k | 阅读 ≈ 5 分钟

昨天打算用wget把kerneltravel上的深入分析Linux内核源码全部下载到本机,没想到使用wget下载到本地时文件名全部是乱码:

[cocobear@cocobear ~]$ wget -r -p -k -np http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html
--19:52:02--  http://www.kerneltravel.net/kernel-book/%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81.html
           => `www.kerneltravel.net/kernel-book/深�%85��%88%86�%9E%90Linux�%86%85核��%90��%81.html'
正在解析主机 www.kerneltravel.net... 202.75.211.215
Connecting to www.kerneltravel.net|202.75.211.215|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:133,528 (130K) [text/html]

100%[====================================>] 133,528       60.71K/s             

19:52:05 (60.57 KB/s) - `www.kerneltravel.net/kernel-book/深�%85��%88%86�%9E%90Linux�%86%85核��%90��%81.html' saved [133528/133528]

google了半天也没有找到解决方案,似乎也有不少人碰到这个问题。仔细想了想应该是wget在处理url时的问题,于是下载了最新的wget源代码开始找问题。

基本看完了main.c这个文件,后来在url.c这个文件里找到了wget如何处理保存的文件名,url_file_name()这个函数。

url_file_name()在根据url的形式判断该保存为什么样的文件名,并进行了多方面的考虑,最终该函数调用了append_uri_pathel(),该函数会判断url中的特殊字符,例如空格等,如果遇到这些字符wget把它进行转义,而问题就出在这里,append_uri_pathel()函数是通过FILE_CHAR_TEST (*p, mask)这一句来判断该字符是否为特殊字符,而同时它会认为中文也是特殊字符,然后按照转换空格之类的方式对中文进行转义,这样就会造成中文乱码的情况,知道了问题所在我在append_uri_pathel()函数对特殊字符的判断中排除了中文字符。

接下来重新编译wget,再试一次:

[cocobear@cocobear src]$ ./wget -r -p -k -np http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html
--2008-04-19 20:16:34--  http://www.kerneltravel.net/kernel-book/%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81.html
Resolving www.kerneltravel.net... 202.75.211.215
Connecting to www.kerneltravel.net|202.75.211.215|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133528 (130K) [text/html]
Saving to: `www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html'

74% [===========================>           ] 98,832      79.7K/s      

可以看到wget可以正确的把中文的网页保存下来了:-)

我的locale是utf-8,如果使用gbk的话wget上面的网页会得到404错误,因为gbk环境下wget发出来GET请求是按照gbk编码的方式进行转义,而服务器对接收到的GET请求中的URL是按照UTF-8的方式进行“解码”,因此会得到404的错误。(早上测试的时候还是这样的,但下这会写这篇文章的时候gbk环境下使用wget也正常了,郁闷)

以下是我修改后的url.c与原文的diff:
[cocobear@cocobear ~]$ diff -u wget-1.11.1/src/url.c Codes/wget-1.11.1/src/url.c
— wget-1.11.1/src/url.c 2008-04-19 11:42:24.000000000 +0800
+++ Codes/wget-1.11.1/src/url.c 2008-04-19 11:56:49.000000000 +0800
@@ -1332,11 +1332,10 @@
/ Walk the PATHEL string and check how many characters we’ll need
to quote.
/
quoted = 0;

-  for (p = b; p < e; p++) {
-    if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff)) {
+  for (p = b; p < e; p++)
+    if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff))
                   ++quoted;
-              }
-  }
+  
   /* Calculate the length of the output string.  e-b is the input
      string length.  Each quoted char introduces two additional
      characters in the string, hence 2*quoted.  */

以上仅仅是我自己对wget的一些分析、看法,如有错误请路过的指正一下。

BTW:
(1):http://www.sfr-fresh.com这个网站不错,有不少源代码在上面可以在线看。
(2):深入分析Linux内核源码这本书打包下载(html格式):http://cocobear.github.io/download/Understand_Linux_kernel.tar.bz2

Update1(08.4.20):
这个问题是wget对国际化的字符支持不好,目前google summer code已经有人在这方面进行改进,期待。我的解决方案只是临时的,只能针对utf-8环境。

Comments

sept: 你好,我也遇到同样的问题,在百度google也没找到方法。看到你有解决方法很兴奋,无奈水平有限,没看出来该修改url.c的哪里?能否在详细说一下,或者能否把改完的发给我,谢谢

luguo: 晕,我今天搜索时也正好搜到那个网站上面的代码~~真巧啊!!

kongove: 能不能用个脚本把文件URL的后边截取下来,用wget的-O 选项支持输出文件名?

kongove: Thanks for your share of ulk.

cocobear: 单个文件下载你可以使用脚本截取,如果递归下载你都没办法知道可能下载的文件。

cocobear: to:leon 原理上还是一样的,不过windows使用的是gb2312编码,针对编码处理的地方应该不太一样。 如果要完全解决这个问题,还得wget官方做不少东西毕竟国际化的支持是件不小的工作。

leon: cocobear:您好。看到您解决了这个问题,简直是五体投地。我现在不是使用linux,只能够使用wget的windows版或者cygwin版,请问应该怎么解决问题?请高手出手相救。谢谢。

leon: cocobear: 感谢您的回答。请问应该如何修改代码才能够正确获得中文文件名?如果需要,我可以把windows下的代码发给您。谢谢

Simxinzi: Win下该如何修改url.c这个文件呢,不知道需要修改哪里才能解决UTf-8编码的文件下载的问题,望不吝赐教,感激不尽。QQ:9961459

cocobear: WIN下的实现和linux下不一样,而且win使用的是gb2312具体修改我不太清楚。 不知道你是使用的是wget的win版一还是cywin中的wget?

Simxinzi: 谢谢斑竹的回复,我使用的是wget的win版 访问中文URL时因为编码问题,出现403错误 Wget编码默认为非utf-8 而服务器Apache编码为UTF-8 比如说下载这样一个文件 此中文路径可直接访问并可下载: http://www.****.com/QQ幻想/music/M001.ogg Wget却访问成: http://www.****.com/QQ%BB%C3%CF%EB/music/M002.ogg 以下路径也可以下载: http://www.****.com/QQ%e5%b9%bb%e6%83%b3/music/M002.ogg 应该是一个编码的问题:Win下的源码下载地址: http://www.christopherlewis.com/WGet/wget-1.11.4s.zip

Simxinzi: 你的思路应该能解决问题,即不转换中文路径,仅转换空格等其他字符,但就是不知道该修改哪里

cocobear: 同样的位置,你试着改了,编译一下.我没有环境编译.

j: - for (p = b; p < e; p++) { - if (FILE_CHAR_TEST (p, mask) && !((p | 0×0fffffff) == 0xffffffff)) { + for (p = b; p < e; p++) + if (FILE_CHAR_TEST (p, mask) && !((p | 0×0fffffff) == 0xffffffff)) ++quoted; - } - } + 这两段代码功能完全一样呀,只是少了{{}}

leon: 我成功了,呵呵

leon: 昨天加你的QQ你没有通过。不然可以把文件发给你了。

leon: 不好意思,刚才没有看清楚。你的问题跟我的不一样。我的是下载UTF8编码文件乱码。现在解决了。你这个就不知道了,呵呵

leon: 你要找到URL请求的代码,在wget发送请求前做一下转换就好了。

Simxinzi: leon 麻烦再加一下,谢谢了,我也是和你一样的问题,下载UTF-8编码文件乱码,下载UTF-8路径找不到文件或乱码

Simxinzi: leon 麻烦再加一下,谢谢了,我也是和你一样的问题,下载UTF-8编码文件乱码,下载UTF-8路径找不到文件或乱码 QQ:9961459

可可熊: url.c修改1332行附近。

wmk: wget -r -np -nH –cut-dirs=3 http://www.kerneltravel.net/kernel-book/%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81.html --cut-dirs=3 可以解决问题。

cocobear: To: wmk 不行的,不知道你试了没。 [root@ibmfedora8 ~]# wget –version GNU Wget 1.10.2 (Red Hat modified)

arthur1989: 求一份修改后的wget..谢谢

angoo-mart: 我也遇到这样的问题,请问一下,windows下的wget要怎么改?我参考的代码是wget-1.12的,我很想把这个问题解决掉,请各位牛人指点指点。我的QQ是43904930. 如果谁有已经修改好的,windows下可以运行的wget.exe就更好,麻烦提供一下。谢谢各位,谢谢cocobear

cocobear: windows下应该是在cygwin里用wget的吗?修改的方法也应该是一样的。 在url.c里面,我上面已经写出来了。

cocobear: To:arthur1989 上面有需要修改的地方,完整的修改过的包我现在没有了。

demonoid: !((*p | 0×0fffffff) == 0xffffffff)) 这句“0×0fffffff”里 应为“x”,你错写成乘号了。

fedora: 不过改代码的想法非常好

fedora: --restrict-file-names=nocontrol 加上这个参数就行了

jinfeng: 我需要一份wget文件,是解决Ascii乱码的,谢谢

jinfeng: 我的QQ号是515331954

jinfeng: 有没有人在啊?

Star Brilliant: wget 有一个参数 –restrict-file-names=nocontrol 能解决这个问题。

换了个域名cocobear.github.io

发表 2008-04-17 | 分类 Life | 评论数:
| 字数: 589 | 阅读 ≈ 1 分钟

在godaddy申请的域名,不到两美元,info域名刚好做活动,一直用着cn域名,总感觉不放心,这下好了DH的空间,godaddy的域名。

因为考虑到以前搜索引擎对cn那个域名已经有了不少的收录,使用了301永久重定向,这样可以保证避免更换域名带来的大量404错误,直接在以前网站的根目录下的.htaccess文件中添加以下内容:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://cocobear.github.io/$1 [R=301,L]

blog出了点问题,应该里面有网站域名的设置,手动通过wp-admin登录后台更改域名。

麻烦有给我做友情链接的改一下:-)

Comments

Amankwah: 好! 不过: 这样可以保证更换域名带来的大量404错误 上面这句话快修改过来吧~

crazyfranc: 我说怎么等待了那么长时间.

kongove: 已经更新你的链接~~ 我的域名 2008-5-18 14:59:00 到期~。~

luguo: 我就是从.cn过来的,这blog自动就转到了.info上,没啥问题呀~!

草儿: 没想到你还真换了,好的很~

草儿: 突然发现在IE6里点击右边那个最近评论,直接侧栏跑下边了……

ybyygu: 兄弟真牛, 提前这么久就预见了现在. 佩服佩服~

TinyP2P

发表 2008-04-13 | 分类 编程相关 | 评论数:
| 字数: 8.9k | 阅读 ≈ 8 分钟

TinyP2P使用15行Python代码实现了一个P2P的工具,下面是经过别人注释的代码:

# tinyp2p.py 1.0 (documentation at http://freedom-to-tinker.com/tinyp2p.html)
# (C) 2004, E.W. Felten
# license: http://creativecommons.org/licenses/by-nc-sa/2.0

# Annotated by Kochin Chang, Jan. 2005

# Usage:
#   Server - python tinyp2p.py password server hostname  portnum [otherurl]
#   Client - python tinyp2p.py password client serverurl pattern
#                   ar[0]      ar[1]    ar[2]  ar[3]     ar[4]   ar[5]

import sys, os, SimpleXMLRPCServer, xmlrpclib, re, hmac 
# Import libraries used in the program.
# sys : system variables and functions.
# os : portable OS dependent functionalities.
# SimpleXMLRPCServer : basic XML-RPC server framework.
# xmlrpclib : XML-RPC client support.
# re : regular expression support.
# hmac : RFC 2104 Keyed-Hashing Message Authentication.

ar,pw,res = (sys.argv,lambda u:hmac.new(sys.argv[1],u).hexdigest(),re.search)
# A multiple assignment.
# ar < - sys.argv : the argument list.
# pw <- lambda u:hmac.new(sys.argv[1],u).hexdigest() :
#   a function makes an HMAC digest from a URL.
#   INPUT: a string, u, which is a URL here.
#   OUTPUT: a hexdecimal HMAC digest.
#   DESCRIPTION:
#     1\. Creates a HMAC object from the URL using network's password,
#        sys.argv[1], as the key.
#     2\. Returns a hexdecimal digest of the HMAC object.
# res <- re.search : alias for the regular expression search function.

pxy,xs = (xmlrpclib.ServerProxy,SimpleXMLRPCServer.SimpleXMLRPCServer)
# A multiple assignment.
# pxy <- xmlrpclib.ServerProxy : alias for the ServerProxy class.
# xs <- SimpleXMLRPCServer.SimpleXMLRPCServer : alias for the SimpleXMLRPCServer class.

def ls(p=""):return filter(lambda n:(p=="")or res(p,n),os.listdir(os.getcwd()))
# a function lists directory entries.
# INPUT: a string, p, which is a regular expression pattern.
# OUTPUT: a list of directory entries matched the pattern.
# DESCRIPTION:
#   1\. Creates a function using lambda expression that takes a pathname as its
#      parameter. The function returns true if the pattern is empty or the
#      pathname matches the pattern.
#   2\. Finds out what is the current working directory.
#   3\. Retrieves a list of directory entries of current working directory.
#   4\. Filters the list using the lambda function defined.

if ar[2]!="client":
# Running in server mode...

  myU,prs,srv = ("http://"+ar[3]+":"+ar[4], ar[5:],lambda x:x.serve_forever())
  # A multiple assignment.
  # myU <- "http://"+ar[3]+":"+ar[4] : server's own URL.
  # prs <- ar[5:] : URL's of other servers in the network.
  # srv <- lambda x:x.serve_forever() :
  #   a function to start a SimpleXMLRPCServer.
  #   INPUT: a SimpleXMLRPCServer object, x.
  #   OUTPUT: (none)
  #   DESCRIPTION:
  #     Calls the server's serve_forever() method to start handling request.

  def pr(x=[]): return ([(y in prs) or prs.append(y) for y in x] or 1) and prs
  # a function returns the server list.
  # INPUT: a list, x, of servers' URLs to be added to the server list.
  # OUTPUT: the updated server list.
  # DESCRIPTION:
  #   1\. For each URL in x, checks whether it's already in the server list.
  #      If it's not in the list, appends in onto the list.
  #   2\. Returns the updated server list.

  def c(n): return ((lambda f: (f.read(), f.close()))(file(n)))[0]
  # a function returns content of the specified file.
  # INPUT: a string, n, which is a filename.
  # OUTPUT: the content of the file in a string.
  # DESCRIPTION:
  #   1\. Creates a function using lambda expression that takes a file object, f,
  #      as its parameter. The function reads the content of the file, then
  #      closes it. The results of the read and close are put into a tuple, and
  #      the tuple is returned.
  #   2\. Creates a file object with the filename. Passes it to the lambda
  #      function.
  #   3\. Retrieves and returns the first item returned from the lambda function.

  f=lambda p,n,a:(p==pw(myU))and(((n==0)and pr(a))or((n==1)and [ls(a)])or c(a))
  #   a request handling function, depending on the mode, returns server list,
  #   directory entries, or content of a file.
  #   INPUT: a string, p, which is a hexdecimal HMAC digest.
  #          a mode number, n.
  #          if n is 0, a is a list of servers to be added to server list.
  #          if n is 1, a is a pattern string.
  #          if n is anything else, a is a filename.
  #   OUTPUT: if n is 0, returns the server list.
  #           if n is 1, returns directory entries match the pattern.
  #           if n is anything else, returns content of the file.
  #   DESCRIPTION:
  #     1\. Verifies the password by comparing the HMAC digest received and the
  #        one created itself. Continues only when they match.
  #     2\. If n is 0, calls pr() to add list, a, and returns the result.
  #        If n is 1, calls ls() to list entries match pattern a, and returns
  #        the result enclosed in a list.
  #        If n is any other value, retreives and return content of the file
  #        with filename specified in a.

  def aug(u): return ((u==myU) and pr()) or pr(pxy(u).f(pw(u),0,pr([myU])))
  # a function augments the network.
  # INPUT: a string, u, which is a URL.
  # OUTPUT: a list of URL's of servers in the network.
  # DESCRIPTION:
  #   1\. If the URL, u, equals to my own URL, just returns the server list.
  #   2\. Otherwise, creates a ServerProxy object for server u. Then calls its
  #      request handling function f with a HMAC digest, mode 0, and server
  #      list with myself added.
  #   3\. Calls pr() with the result returned from server u to add them to my
  #      own list.
  #   4\. Returns the new list.

  pr() and [aug(s) for s in aug(pr()[0])]
  # 1\. Checks the server list is not empty.
  # 2\. Takes the first server on the list. Asks that server to augment its
  #    server list with my URL.
  # 3\. For each server on the returned list, asks it to add this server to its
  #    list.

  (lambda sv:sv.register_function(f,"f") or srv(sv))(xs((ar[3],int(ar[4]))))
  # Starts request processing.
  # 1\. Defines a function with lambda expression that takes a SimpleXMLRPCServer
  #    object, registers request handling function, f, and starts the server.
  # 2\. Creates a SimpleXMLRPCServer object using hostname (ar[3]) and portnum
  #    (ar[4]). Then feeds the object to the lambda function.

# Running in client mode...
for url in pxy(ar[3]).f(pw(ar[3]),0,[]):
# 1\. Create a ServerProxy object using the serverurl (ar[3]).
# 2\. Calls the remote server and retrieves a server list.
# 3\. For each URL on the list, do the following:

  for fn in filter(lambda n:not n in ls(), (pxy(url).f(pw(url),1,ar[4]))[0]):
  # 1\. Create a ServerProxy object using the URL.
  # 2\. Calls the remote server to return a list of filenames matching the
  #    pattern (ar[4]).
  # 3\. For each filename doesn't exist locally, do the following:

    (lambda fi:fi.write(pxy(url).f(pw(url),2,fn)) or fi.close())(file(fn,"wc"))
    # 1\. Define a lambda function that takes a file object, calls remote server
    #    for the file content, then closes the file.
    # 2\. Create a file object in write and binary mode with the filename. (I
    #    think the mode "wc" should be "wb".)
    # 3\. Passes the file object to the lambda function.

如果直接运行上面的代码会有问题(不知道作者那里为什么会正常运行),会有类似这样的错误提示:

Traceback (most recent call last):
File "tinyp2p.py", line 14, in ?
for url in pxy(ar[3]).f(pw(ar[3]),0,[]):
File "/usr/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.4/xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "/usr/lib/python2.4/xmlrpclib.py", line 1147, in request
return self._parse_response(h.getfile(), sock)
File "/usr/lib/python2.4/xmlrpclib.py", line 1286, in _parse_response
return u.close()
File "/usr/lib/python2.4/xmlrpclib.py", line 744, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: 'exceptions.TypeError:coercing to Unicode:
need string or buffer, list found'>

经google的帮助在这里找到的解决方案:

pr() and [aug(s) for s in aug(pr()[0])]
to
pr() and [aug(s) for s in aug(pr()[0])] or pr([myU])

代码中大量应用了lambda,还有and,or,虽然这种代码风格不值得我们学习,我们可以写出更清昕的代码,但作者是为了证明P2P应用程序是如何容易实现,作者更希望可以把代码写的更简洁,可以用在他的签名里。

还有perl写的6行代码,我看了一下grep,cat这些都出来了,是shell版吧。

Comments

luguo: 那6行Perl在哪里?? Perl自己有内置的grep,也很nb。虽然没cat,但可以定义个子函数叫cat。

luguo: 还有,你最后那段Python不对啊!人家是说把上面那行换成下面那行,那个“to”明显不是Python源代码啊!

cocobear: http://ansuz.sooke.bc.ca/software/molester/molester-min 这里有一个,貌似我上次看到的不是这个。 最后那一段只是个说明,并不是python源代码。

luguo: lambda,map,reduce啊,都是很nb的! 弱弱地问一下:p2p和xmlrpc有啥关系??

cocobear: XMLRPC可以实现分布式处理,这样P2P可以使用多个Server,俺这样觉得 。

1…293031…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages