五千年(敝帚自珍)

主题:【调查】大家都主要用什么写程序? -- 还是不懂

共:💬139 🌺25
全看树展主题 · 分页首页 上页
/ 10
下页 末页
家园 【原创】来骗精品:发掘 CURL――强大的命令行浏览器

CURL? 嗯,说来话长了~~~~

这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑

0)

下载 CURL

http://curl.haxx.se/

这里有CURL的源代码或者是可以运行在各平台上的编译好的二进制代码可供下载;

大家下下来、自己安装就是。

所谓安装,就是把ZIP文件展开到硬盘什么地方去,并把curl.exe的目录追加到路径中去那么简单;纯粹的绿色软件!

1)

开始学习:二话不说,先从这里开始吧!

curl http://www.yahoo.com

回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了~~~~~

这就是我们使用curl进行的最初的网页访问。

2)

嗯,要想把读过来页面存下来,是不是要这样呢?

curl http://www.yahoo.com > page.html

当然可以,但不用这么麻烦的!

用curl的内置option就好,存下http的结果,用这个option: -o

curl -o page.html http://www.yahoo.com

这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就OK咯

3)

什么什么?!访问不到?肯定是你的proxy没有设定了。

使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x

curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com

4)

访问有些网站的时候比较讨厌,他使用cookie来记录session信息。

像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....

我们来学习这个option: -D <-- 这个是把http的response里面的cookie信息存到一个特别的文件中去

curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了

5)

那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,

来判断你是不是不按规矩访问他们的网站滴。

这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b

curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com

这样,就告诉curl,这次访问使用刚才那次访问所保存下来的cookie信息。从而达到模拟网页连续访问的效果啦......

能实现这个,我们就可以几乎模拟所有的IE操作,去访问网页了!

6)

稍微等等~~~~~我好像忘记什么了~~~~~

对了!是浏览器信息~~~~

有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本~~~~

NND,哪里有时间为了它去找这些怪异的浏览器呢!?

好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A

curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的IE6.0,嘿嘿嘿,其实也许你用的是苹果电脑呢!

而 -A "Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台PC上跑着的Linux,用的是Netscape 4.73,呵呵呵

7)

另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不 是首页的地址,就可以断定那是个盗连了~~~~~

讨厌讨厌~~~我就是要盗连~~~~~!!

幸好curl给我们提供了设定referer的option: -e

curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com

这样,就可以骗对方的服务器,你是从mail.yahoo.com点击某个链接过来的了,呵呵呵

8)

写着写着发现漏掉什么重要的东西了!----- 利用curl 下载文件

刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。

比如, curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

这里教大家一个新的option: -O

大写的O,这么用: curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

这样,就可以按照服务器上的文件名,自动存在本地了!

总结一下:大写O的option不需要你告诉它存成什么文件名――它会使用网页原本的文件名加以保存的。而小写o的option则需要你明确告诉它怎么保存的。

再来一个更好用的。

如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?

不干!

在curl里面,这么写就可以了:

curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

呵呵呵,厉害吧?!~~~

9)

再来,我们继续讲解下载!

curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

这样产生的下载,就是

~zzh/001.JPG

~zzh/002.JPG

...

~zzh/201.JPG

~nick/001.JPG

~nick/002.JPG

...

~nick/201.JPG

够方便的了吧?哈哈哈

咦?高兴得太早了。

由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了~~~

没关系,我们还有更狠的!

curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

--这是.....自定义文件名的下载?

--对头,呵呵!

#1是变量,指的是{zzh,nick}这部分,第一次取值zzh,第二次取值nick

#2代表的变量,则是第二段可变部分---[001-201],取值从001逐一加到201

这样,自定义出来下载下来的文件名,就变成了这样:

原来: ~zzh/001.JPG ---> 下载后: 001-zzh.JPG

原来: ~nick/001.JPG ---> 下载后: 001-nick.JPG

这样一来,就不怕文件重名啦,呵呵

9)

继续讲下载

我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。

curl在这些方面也不输给谁,嘿嘿

比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传

curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

当然,你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~

分块下载,我们使用这个option就可以了: -r

举例说明

比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载(赵老师的电话朗诵 :D )

我们就可以用这样的命令:

curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

这样就可以分块下载啦。

不过你需要自己把这些破碎的文件合并起来

如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以

如果用的是Windows,用copy /b 来解决吧,呵呵

上面讲的都是http协议的下载,其实ftp也一样可以用。

用法嘛,

curl -u name:passwd ftp://ip:port/path/file

或者大家熟悉的

curl ftp://name:passwd@ip:port/path/file

10)

说完了下载,接下来自然该讲上传咯

上传的option是 -T

比如我们向ftp传一个文件: curl -T localfile -u name:passwd ftp://upload_site:port/path/

当然,向http服务器上传文件也可以

比如 curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi

注意,这时候,使用的协议是HTTP的PUT method

刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢!

GET和POST都不能忘哦。

http提交一个表单,比较常用的是POST模式和GET模式

GET模式什么option都不用,只需要把变量写在url里面就可以了

比如:

curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345

而POST模式的option则是 -d

比如,curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi

就相当于向这个站点发出一次登陆申请~~~~~

到底该用GET模式还是POST模式,要看对面服务器的程序设定。

一点需要注意的是,POST模式下的文件上的文件上传,比如

<form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">

<input type=file name=upload>

<input type=submit name=nick value="go">

</form>

这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:

curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法

比如 https的时候使用本地证书,就可以这样

curl -E localcert.pem https://remote_server

再比如,你还可以用curl通过dict协议去查字典~~~~~

curl dict://dict.org/d:computer

今天就先讲到这里吧,呵呵。疯狂的curl功能,需要你---一起来发掘。

元宝推荐:Highway,

本帖一共被 1 帖 引用 (帖内工具实现)
家园 大众化的C,C++,比较古怪的是X++
家园 您用过那个老古董啊,pioneer啊

那会儿是LabVIEW在Win95的第一版,现在的可比那时先进多了。

我是从97年开始用的

Major LabVIEW Introductions

May-04 LabVIEW 7.1

May-03 LabVIEW 7 Express

May-03 LabVIEW Real-Time, LabVIEW PDA, and LabVIEW FPGA

Jan-02 LabVIEW 6.1

Aug-00 LabVIEW 6i

Feb-99 LabVIEW 5.1 and LabVIEW for Linux

Mar-98 LabVIEW 5.0

May-97 LabVIEW 4.0

Oct-95 LabVIEW for Windows 95

Oct-94 LabVIEW for Power Macintosh

Apr-94 LabVIEW for Windows NT

Oct-93 LabVIEW 3.0 Multiplatform

Oct-92 LabVIEW for Sun

Sep-92 LabVIEW for Windows

Jan-90 LabVIEW 2.0

Oct-86 LabVIEW 1.0 for Macintosh

Apr-83 LabVIEW Development Begins

家园 哈哈,我喜欢,献花

好像又回到了当年写bat file的日子

家园 自动测试过程可分为Data的Aquire,Analyze和Present

LabVIEW强在Aquire,Matlab长于Analyze,而Present嘛,那些IT语言(VB / C++ / C# / Java)就用上了。

当然,从头到尾只用LabVIEW也可。

LabVIEW本身带了450多个分析函数,比起Matlab估计不如吧

scilab没用过

想看看LabVIEW咋样,看这里外链出处

家园 看来我是老古董了,

那时候学校有这个新鲜东西,一玩,真是佩服设计这东西的人,你说人家是怎么琢磨的,从来没想到能方便到这个地步。现在肯定好到不知道哪里去了。

离开EE以后,就再没机会玩儿这个了

家园 看了阿忙兄的回贴,才想起来LabVIEW的最大优点

简单

无需编程经验,上手快。

用过LabVIEW的人,极少数又回去用VB和C,因为都变懒了

家园 LabView is wonderful

The best for researchers in ME, EE and physics because it is so easy to control all kind of (all most all you can think of) interface/instruments. It is also wonderful for simulate instruments. It also very well written. Think about it, it can run on first GUI computer (by Apple, forgot the name), before windows 3.1!

家园 Flower! Why not 精?
家园 服兄是改变了题目的原意了

服兄使用的是Array作为参数,这已经改变题目的原意。而且这个做法,本身很不自然。

程序中大多数情况下,是需要直接将两个整数交换,而不是两个Integer Array的第一个元素。除非服兄一直将Integer作为Integer Array的第一个元素使用的,上述这个swap()函数实质上是毫无意义的。

比方说我有两个整型数a,b,要swap,这个要求不苛刻,比如说写个简单sort的程序就经常要用到,按服兄的做法就需要,先要create 2 个Integer Array,然后,把a,b分别放入这两个Integer Array中,call swap(),再从这2个Integer Array中取回结果到a,b。无论从程序可读性还是效率来说,都不如直接用下面的

int t=a; a=b; b=t;

简洁明了效率高,因此实际上服兄的这个变通做法在实际编程中是基本无应用价值的,因为不自然。

家园 骗术成功!
家园 偷偷说一下

俺就用这个,给人编过无数的灌票机呢,嘿嘿

家园 呜呜呜,老兄误会俺了

这个例子要说明的,当然不是swap函数能否实现这么简单。俺试图说明的是呢,Java里面也可以搞指针游戏的。原理就是利用Java的原子类型以外的Object,实际上也都是指针参照的原理。所以呢,只要绕过最外层的值参照,就可以恢复到C++时代的地址参照去咯。

数组就是这样的一个利用方法――数组里面存的,都是地址。所以在这个层面上交换,对外面就会有影响了;

其实,明白了这层道理,做出自定义的Class就可以在Java中同样轻易地实现地址参照或是多返回值函数的功能。比如下面这个程序,展示的就是任意类型的交换、同样利用的是地址参照的原理......

class type_a {
	Object type_a_value = null;
	public type_a(Object init) {
		this.set(init);
	}
	public void set(Object input) {
		this.type_a_value = input;
	}
	public Object get() {
		return this.type_a_value;
	}
	public String toString() {
		return this.type_a_value.toString();
	}
}
public class swap {
	public swap (type_a A, type_a B) {
		type_a C = new type_a(A.get());
		A.set(B.get());
		B.set(C.get());
	}
	static public void main(String[] argv) {
		type_a A1 = new type_a("String A");
		type_a A2 = new type_a("String B");
		System.out.println("A1="+A1);
		System.out.println("A2="+A2);
		swap SWAP = new swap(A1, A2);
		System.out.println("A1="+A1);
		System.out.println("A2="+A2);
	}
}	
家园 LISP / Scheme

所谓的函数式程序设计语言。要我详细的解释它为什么好还真的说不出来。当初老板逼我学的时候,他也说不出理由。不过我这个原来的pascal/c/c++死硬派,见了scheme的编程实例后,立刻折服了,现在是其忠实信徒了。(类似还有个例子是emacs,也是老板逼着学,我从死命抵抗转化到痴迷,真是有趣)。LISP/Scheme在美国的特定领域的学术界很流行的。

家园 Sorry for the later reply. Here you go, Java Generics Tutorial.

Generics Tutorial.

全看树展主题 · 分页首页 上页
/ 10
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河