帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

这篇文章写于搜索n多版本依旧不能解决我的问题。很多vbs版本调用迅雷的写法为:

Set ThunderAgent = CreateObject(“ThunderAgent.Agent.1”) //找到那个Agent dll Call T
hunderAgent.AddTask(“http://www.hxit.net/files/bjhyn.mp3",“北京欢迎你.mp3”,"c:/a/”,
“”,“http://www.readlog.cn”,1,0,5) //创建下载任务 Call ThunderAgent.CommitTasks(1)
//提交任务请求 Call ThunderAgent.AddTask(“http://file.fzone.cn/upload2/hompyFile/200
7/28/921524670987.wma”,“放羊的星星.wma”,“c:/a/b/c/”,“”,“http://www.readlog.cn”,1,0,
5) Call ThunderAgent.CommitTasks(1) Set ThunderAgent =

这里介绍一下AddTask函数。这个函数第一个参数是要下载的url;第二个参数是要保存的文件名;第三个是保存路径;第四个是引用url;第五个是1,0,-1(
1为立即下载,0为手工下载,-1为默认,但是不管是哪个,你都要看到弹出的框框,然后手工点击一下。);第五个为是否只从原地址下载0为不是,1为是;第六个为下载
的线程个数。

这段代码保存为*.vbs就可以了。然后在迅雷里设置->高级->通过IE右键菜单“使用迅雷下载”的对勾去掉。如果使用5.9版本,你可以在监控那里把监控IE去掉
。这样写我测试过xunlei 5.9是没有任何问题。不过一旦运行这个,就会弹出一个对话框然后你必须点击确认后才可以下载。我的需求就在于把这次的确认去掉。找了
好久依旧没有解决问题。无奈之中碰到了运气。

1.首先下载一个5.1.4.174版本的迅雷。

2.从迅雷安装目录下搜索geturl.htm.如果找到你就知道咋做了。

3.写以下脚本*.vbs.这里使用的自己的url.

set ThunderApi = CreateObject(“Xunleibho.CatchRightClick.1”) DownloadInfo =
“#01#” + “http://blog.csdn.net/cctt_1” + “#02#” + “” + “#03#” +
“hello.mp3”+ “#*04#*thunder_backwnd#05#” retValue =
ThunderApi.sendUrl(DownloadInfo) set ThunderApi = Nothing

这里的第一个#*01#*后面跟的是要下载的url,#*02#*后面是引用的url,第三个是注释内容。第四个是后台下载(不用更改)。

4.启动迅雷,然后双击这个vbs文件即可。

不过以上方法有个缺陷,就是不能将文件下载到想保存的目录。只能保存到默认文件目录中。入想使用5.1.4.174版本希望保存到自己想要保存的目录的话。调用和第一
个脚本类似的方法。不过要稍微做些改动。脚本如下:

set ThunderAgent = CreateObject(“ThunderAgent.Agent.1”) Call ThunderAgent.AddT
ask(“http://blog.csdn.net/cctt_1",“俺的url”,“c:/a/”,“”,"”,1,0,5) Call
ThunderAgent.Committasks() Call ThunderAgent.AddTask(“http://blog.csdn.net/cct
t_1/archive/2009/05/06/4153465.aspx”,“还是俺的blog”,“c:/a/b/c/”,“”,“”,1,0,5) Call
ThunderAgent.CommitTasks() Set ThunderAgent = Nothing

这里可以看到为CommitTasks,而非CommitTasks2()

看到这篇的各位,有没有提供更好的方法调用迅雷?既可以不弹出那个框框,又可以保存到相应地址的?先行谢过。

1.首先下载一个xampplite,这个是 sourceforge.net
上的开源项目。主要是为了集成apache,mysql,php方便用的.解压到某个盘符的根目录下。点击xampp-
control.exe然后再弹出的小窗口中选择Setup.然后一直回车即可。然后选中apache,mysql前面的复选框。然后start
apache和mysql.之后在IE上输入127.0.0.1。如果看到XAMPP的网页。就代表安装成功。

2.如果你是xp的系统,那么在C:/WINDOWS/system32/drivers/etc下有个hosts文件。里面有一行为 127.0.0.1
localhost,然后你可以再添加两行 127.0.0.1                ns.net,和127.0.0.1
admin.ns.net。那么下次你使用ns.net也就是127.0.0.1,使用admin.ns.net也一样。

3.去你刚才安装apache的目录下找到 apache/conf/extra这个文件夹中的httpd-vhosts.conf,在其中添加几行。

<Directory “D:/eclipse/workspace/ns_admin”> AllowOverride FileInfo Order
allow,deny Allow from all <VirtualHost *:80> ServerAdmin
[email protected] DocumentRoot “D:/eclipse/workspace/ns_admin” ServerName
admin.ns.net ServerAlias static.admin.ns.net CustomLog “logs/admin.ns.net-
access.log” common ErrorLog “logs/admin.ns.net-error.log”

Directory和你的DocumentRoot需要对应。必须为你的发布目录(含有index.html),servername就是刚才hosts文件中的某一
个。其他的照葫芦画瓢即可。

如果你想使用多虚拟主机,并且使用同一个IP。

那么就应该在hosts文件中再添上一句。127.0.0.1 www.xxx.com  static.xxx.com xxx.com

在apache目录的apache/conf/extra中的httpd-vhosts.conf,添加如同上面一样的一段,如下面的样子:

1
2
3
4
5
6
7
8
9
10
11
12
<Directory "D:/eclipse/workspace/ns_shop"> AllowOverride FileInfo Order
allow,deny Allow from all </Directory> <VirtualHost *:80> ServerAdmin
[email protected] ##这里是你的一个虚拟主机的主页所在 DocumentRoot
"D:/eclipse/workspace/ns_shop" ## serverName一般没有www,不过你真要想写也可以 ServerName
xxx.com ServerAlias www.xxx.com static.xxx.com
##以下这两句其实是在apache的log目录中多增加两个log文件。 CustomLog "logs/www.xxx.com-access.log"
common ErrorLog "logs/www.xxx.com-error.log" </VirtualHost> <Directory
"D:/eclipse/workspace/ns_admin"> AllowOverride FileInfo Order allow,deny Allow
from all </Directory> <VirtualHost *:80> ServerAdmin [email protected]
##这里是你的另一个虚拟主机的主页所在 DocumentRoot "D:/eclipse/workspace/ns_admin" ServerName
admin.ns.net ServerAlias static.admin.ns.net CustomLog "logs/admin.ns.net-
access.log" common ErrorLog "logs/admin.ns.net-error.log" </VirtualHost>

但是你可能会遇到输入www.xxx.com可以出来ns_shop目录中的内容。但是输入admin.ns.net却依旧是ns_shop中的内容。只是咋回事呢?
原因有两个。一个是apache会自动的将找不到的域名按照第一个域名匹配。如果是这个错误,你可以调整下上面配置的两块内容的位置,让ns_shop在下,ns_a
dmin在上。这里一定要重启apache,如果找到了admin.ns.net,这就说明你的admin.ns.net没有配错。l另外也可以看看你的apach
log.如果有log生成,那可能是第二个原因:

Use name-based virtual hosting.

##NameVirtualHost *:80   把这里去掉##。因为使用的name-based,所以不能再有此注释。

1.下载到了网页内容, 发现了linux下同名文件夹可以覆盖同名文件的问题 。

2.解析了网页,可以得到网页的各种信息。但是有些网页的编码虽然是写utf-8但是终究不是。很是懊恼

3.因为海底电缆断了。下载还是个问题。 中文的解析还没有开始。

4.增加downlist 和 imagelist方便图片和包的下载。

5.增加cvsOsvnlist方便代码的下载

6.准备和cvs,svn整合。下载代码资源。

7.迅雷下载时会被网站封锁,没有办法万般无奈下,只好使用的自己的下载函数。

8.准备做多线程下载

9.希望将config map文件格式化为XML。

--------------

1.迅雷还是不能下载,即使是单线程。有的包下到一半就再也不动了。

2.现在将3M一下的使用自己的程序下载,3M以上的包移出,等待日后下载。

对于python的字符串来说。如果是a = ‘abc’,这就是代表是一个正常的字符串类型为str。如果是a= b’abc’这就代表着一个bytes
object。对于bytes object
来说,可以使用decode而非encode;对于正常字符串而言可以使用encode,但是却不能使用decode.如果想将bytes
object直接转换为字符串型,可以使用str()或者repr()。但是这里对于已经进行编码的字符串而言,这样做没有任何好处。

今天碰到一个一个问题,使用python取得网页内容的时候:

request = urllib.request.urlopen(‘http://www.csdn.net’) content =
request.read()

这里content就是一个bytes object.如果使用正则式title[/d/D]*?title就会失效,抛出exception,说不能将findal
l(),finditer()等函数用在bytes object上。所以要进行decode()

代码如下:

import urllib.request import re request =
urllib.request.urlopen(‘http://www.csdn.net’) content = request.read() reg =
re.compile(‘title[/d/D]*?title’) print(reg.findall(content.decode(‘utf-8’)))

如果想搜索中文,正则式中也可以放入中文。

还有一点不好的地方,就在于这个decode()中到底放入什么编解码方式。这取决于那个网页的信息了。一般都会给出。csdn.net给出的就是charset=u
tf-8.也可以使用下面的代码得到编解码方式:

request = urllib.request.urlopen(‘http://www.csdn.net’) information =
request.info() print(information)

可惜的一点是,这里的information是字符串型。传说它是 http.client.HTTPMessage的实例并且 继承 了email. message.Message。根据文档说是用information.get_charset()就能得到编码是啥类型。可惜我没有试出来,返回值为None.使 用csdn的例子可以得到info的信息为:

Server: nginx/0.6.36
Date: Sun, 16 Aug 2009 15:51:04 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Vary: Accept-Encoding
Cache-Control: max-age=604800
Content-Length: 109205
Content-Location: http://www.csdn.net/index.htm
Last-Modified: Sat, 15 Aug 2009 11:11:04 GMT
Accept-Ranges: bytes
ETag: “f4756814991dca1:aa9”
X-Powered-By: ASP.NET
X-UA-Compatible: IE=EmulateIE7
Age: 19
X-Cache: HIT from FECACHE
X-Cache-Lookup: HIT from FECACHE:80
Via: 1.0 cachedev.CSDN.NET (WebCache)

** 惟此文章莫评论 **

上:晚风清徐

下:晨露微漾

上:斜倚阑珊赏明月,心微醉,不觉晓

下:正立江湖尝百味,身疲惫,不服老

上:爱晚红枫随风凋

下:天涯海角共誓存

上:春草知晖,夏荷凝露,秋菊披霜,冬梅听雪

下:东篱采菊,西湖赏月,南国摘红,北冥戏鱼

上:风摘枯叶点地声

下:水起涟漪复归镜

上:天之繁星,望而莫及;夜之灯火,寂已失温

下:地之蝼蚁,触却难解;云之雾滴,伤而未泣

青山醉卧小池边,生宣倦懒木几案

蜂鸟歇鸣归屋檐,伊人抱枕还未眠

你我本不一,缘何念为一,心生魔障起,不可泄天机

自观烟雨楼,冥想雷无休,幻化飞舞蝶,静心几菲求

转自 http://baike.baidu.com/view/604021.html

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-
image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不
同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值.
也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4
为基础设计的。那么他们都是什么意思呢?
这里简单说一下:

  1. MD4
    MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest
    的缩写。它适用在32位字长的处理器上用高速软件实现–它是基于 32 位操作数的位操作来实现的。
  2. MD5
    MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4
    相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
  3. SHA1 及其他
    SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-
    force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
    那么这些Hash算法到底有什么用呢?
    Hash算法在信息安全方面的应用主要体现在以下的3个方面:
  4. 文件校验
    我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏

    MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5
    checksum的命令。
  5. 数字签名
    Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash
    值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
  6. 鉴权协议
    如下的鉴权协议又被称作"挑战–认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
    hash函数在程序设计中的实现
    // 说明:Hash函数(即散列函数)在程序设计中的应用目标 ------ 把一个对象通过某种转换机制对应到一个
    // size_t类型(即unsigned long)的整型值。
    // 而应用Hash函数的领域主要是 hash表(应用非常广)、密码等领域。
    // 实现说明:
    // (1)、这里使用了函数对象以及泛型技术,使得对所有类型的对象(关键字)都适用。
    // (2)、常用类型有对应的偏特化,比如string、char*、各种整形等。
    // (3)、版本可扩展,如果你对某种类型有特殊的需要,可以在后面实现专门化。
    // (4)、以下实现一般放在头文件中,任何包含它的都可使用hash函数对象。
    //------------------------------------实现--------------------------------------

#include
using std::string;
inline size_t hash_str( const char* s )
{
unsigned long res = 0;
for ( ; s; ++s )
res = 5 * res + s;
return size_t(res);
}
template
struct hash
{
size_t operator () ( const Key& k ) const;
};
// 一般的对象,比如:vector< queue >的对象,需要强制转化
template < class Key >
size_t hash::operator () ( const Key& k ) const
{
size_t res = 0;
size_t len = sizeof( Key );
const char
p = reinterpret_cast<const char
>( &k );
while ( len-- )
{
res = (res<<1)^p++;
}
return res;
}
// 偏特化
template<>
size_t hash< string >::operator () ( const string& str ) const
{
return hash_str( str.c_str() );
}
typedef char
PChar;
template<>
size_t hash::operator () ( const PChar& s ) const
{
return hash_str(s);
}
typedef const char* PCChar;
template<>
size_t hash::operator () ( const PCChar& s ) const
{
return hash_str(s);
}
template<> size_t hash::operator () ( const char& x ) const { return x;
}
template<> size_t hash::operator () ( const unsigned char& x )
const { return x; }
template<> size_t hash::operator () ( const signed char& x )
const { return x; }
template<> size_t hash::operator () ( const short& x ) const { return
x; }
template<> size_t hash::operator () ( const unsigned short& x
) const { return x; }
template<> size_t hash::operator () ( const int& x ) const { return x; }
template<> size_t hash::operator () ( const unsigned int& x )
const { return x; }
template<> size_t hash::operator () ( const long& x ) const { return x;
}
template<> size_t hash::operator () ( const unsigned long& x )
const { return x; }
// 使用说明:
//
// (1)、使用时首先由于是泛型,所以要加上关键字类型。
//
// (2)、其次要有一个函数对象,可以临时、局部、全局的,只要在作用域就可以。
//
// (3)、应用函数对象作用于对应类型的对象。
//----------------------- hash函数使用举例 -------------------------
#include
#include
#include
using namespace std;
int main()
{
vector vstr(2);
vstr[0] = “sjw”;
vstr[1] = “suninf”;
hash strhash; // 局部函数对象
cout << " Hash value: " << strhash( vstr[0] ) << endl;
cout << " Hash value: " << strhash( vstr[1] ) << endl;
cout << " Hash value: " << hash< vector >() ( vstr ) << endl;
cout << " Hash value: " << hash() ( 100 ) << endl; // hash() 临时函数对象
return 0;
}

转至 http://blog.csdn.net/treeroot/

HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你
觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

以上只是表面的不同,它们的实现也有很大的不同。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
int h = x.hashCode();

h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。

自己一直没有正儿八经的学过正则式,虽知道原理,却一直没有咋用过。近来项目要用。所以只好现学。

首先用python写,建立一个文件。把乱七八糟的字符串往里丢呀。做了一个小实验,感觉与犹未尽。于是随便开了一个网页,找到源码。指定一行,然后写pattern
.

我写的pattern比较简单。因为本来就简单。

比如你想匹配这样一段:

                      <div class="pd-dload">

<a href="/projects/inkscape/files/inkscape/Inkscape-0.47pre0-1.win32.exe/download" mce_href="projects/inkscape/files/inkscape/Inkscape-0.47pre0-1.win32.exe/download" class="button button-dload dload { url: 'http://downloads.sourceforge.net/sourceforge/inkscape/Inkscape-0.47pre0-1.win32.exe' }"  title="Inkscape-0.47pre0-1.win32.exe: 0.47pre0 released on Jul 02 2009"><span><b>Download Now!</b> Inkscape-0.47pre0-1.win32... (36.4 MiB)</span></a><small>OR</small><a href="/projects/inkscape/files/" mce_href="projects/inkscape/files/" class="button button-more"><span>View all files</span></a>
</div>

如果< div class = “pd-dload”

就出现过一次那就很简单。(多次的我还没有遇到,所以没有解决)pattern的最后结尾为

。那么应该是’< div class = “pd-
dload” >XOXOXOXOXOX
'的形式,其中的那段怎么写呢?/w是匹配所有的字符[a-zA-Z0-9_],那么先用这个< div
class = “pd-dload” >[/w]?
,这里?在python代表最小匹配,例如siisis这样一个串,
如果写<[/w]>为其pattern,其中的>就无法匹配,但是你写<[/w]?>就可将匹配成功。

代码这样写:

import re f = open(‘C://Python31//regular//a.txt’) content = f.read()
print(content) reg = re.compile(“<div class=/“pd-dload/”>[/w]*?”)
print(reg.findall(content))

结果是啥都没有[],现在将[/w]?去掉,变为< div class = “pd-dload” >,是不是可以匹配一部分?哈哈~那就是
说后面的那个写的有问题。仔细看看你的那些字符,其中有可能有各种各样的字符例如/n、空格、:、“、’、.等。其中/s可以匹配很多诸如空格回车之类的符号,然后你
再手工添加其他的符号.添加完毕后,pattern就为:<div class=/“pd-
dload/”>[/s/w|.:=?<>//"////-{}/'()!]
?,记住这里////其实就是对/进行匹配。将reg =
re.compile(“”)中的做替换试试。发现还是[].

现在怎么办呢?方法很简单,一步一步的尝试。首先我匹配到:

<div

 class

="pd-dload"

>  
         <a

pattern为<div class=/“pd-
dload/”>[/s/w|.:=?<>//"////-{}/'()!]?<a,然后出来结果了.继续向前找直到 pipmak-0.2.7-windows
.zip,这里会出现问题。我很奇怪的一点是/w可以匹配数字,为什么这里匹配不出来呢?最后想到了匹配这样串的简单方法[/d/D]
?,这样就包括了所有的情况.
/d是所有的数字,/d是所有的非数字。合起来就是全部的字符。最后的pattern为: <div class=/“pd-
dload/”>[/d/D]*?

我想应该有更加简单的pattern才对.

如果想知道到某一个匹配的串的中的内容,可以这样写:例如

http://www.alliance3p.com

我希望能够找到 http://www.alliance3p.com,那应该怎么匹配呢?

f = open(‘XXX.txt’) content = f.read() m = re.search(‘<p class=/“pd-
www/”>[/D/d]?<a[/D/d]?>([^"]+)’,content,re.IGNORECASE) print(m.group(1))
f.close()

不过使用re.search就只能找到一行匹配的代码。对于要找到多行匹配的代码,可以使用findall(),然后再自己写代码掐头去尾好了。或者将找到的串在使用
re.search进行匹配。

今天看了《宗教的荒谬》,里面有一句话说的很好:“信仰,是一种不加思考的美德。”怎么看这句话都不像是赞美。至于信不信宗教,信不信科学,这完全是自己的事情。别人
干涉不了,只有自己改变。至于有信仰而不敢有半点怀疑的人,的确应该值得思考一下。肯定是因为相信才能给自己带来好处。说人本来就是自私的这句话不知道对不对。但是为
了想进入天堂而做善事,其本质还是为了自己。

如果上帝是存在的话,真的想问问上帝。他创造了这么多东西。要不是他的世界中真实存在,那他一定就是一个伟大的发明家。另外他创造这么多东西干啥呢?是不是和我编数据
结构是一个想法呢?有点亵渎神灵了。

有很多人不信神灵,但是却不敢公然骂神灵。即使在我们这个无神论的国家中,他们也不敢。因为我从来没有听过旁人骂过神灵,只是不信而已。心理学说这是因为信得到的好处
多,骂神冒的风险大的缘故。

在当代科学中,如果你听见有人不停的在你耳边私语,那你真的应该去非正常人类研究中心呆一段时间了。虽然治愈的几率几乎是0.但是信神者总是说有神灵在自己耳边对自己
说着什么。这是正常现象还是不正常现象?是真正的神经有问题,还是因为相信而变得大脑真正听见了?

你有信仰吗?你相信神灵吗?

如果我们不去思考,我们还能存活多久?

电影里面有一句话诠释人生的目的:成长和死亡。

因为公司绑定IP,自己的windows MAC竟然和CentOS的不一致,所以要改动CentOS中的MAC

1./etc/init.d/network stop

2.如果你的网卡是eth0,那么打开文件/etc/sysconfig/network-scripts/ifcfg-eth0

如果那个文件中有MACADDR=XX:XX:XX:XX:XX:XX那么就更改为你需要的
MACADDR=OO:OO:OO:OO:OO:OO,如果没有那么就在最后添加一行MACADDR=OO:OO:OO:OO:OO:OO

3./etc/init.d/network start

4.ping 一下新浪域名…

RedHat更改MAC的方式和CentOS一致

如果是windows,那么就在找到本地连接->属性->配置->高级->本地管理的地址

选中值,然后填入你希望的那个MAC地址即可。然后重启网络配置

0%