magiclinux2.0-1双硬盘安装问题
可以将引导程序安装到MBR或boot分区,如果安装到boot分区,需要特别的设置。
但是magiclinux的文档上的方法好像只适合但硬盘的安装。
双硬盘使用grub for dos
该例子是linux安装在第二块硬盘的第4个分区,第一个为主分区
title MagicLinux
root (hd1,6)
kernel (hd1,6)/boot/vmlinuz-2.6.15.3 ro root=/dev/hdb7 vga=791 splash=silent
initrd (hd1,6)/boot/initrd-2.6.15.3.img
注意grub的硬盘和分区序号从0开始,而linux是从1开始。linux主分区从1开始,逻辑分区从5开始,而grub
主分区从0开始,逻辑分区从4开始;因为每块硬盘最多有4个主分区;
2008年9月10日星期三
2008年9月5日星期五
[ZT ] 为http server加入CGI--网页外观的应用程序
为http server加入CGI--网页外观的应用程序
http://www.cppblog.com/kevinlynx/archive/2008/08/06/58089.html?opt=admin
Implement CGI in your httpd
author : Kevin Lynx
Purpose
为我们的http server加入CGI的功能,并不是要让其成为真正响应CGI query功能的web server。正如klhttpd的开发初衷一样,
更多的时候我们需要的是一个嵌入式(embeded)的web server。
而加入CGI功能(也许它算不上真正的CGI),则是为了让我们与client拥有更多的交互能力。我们也许需要为我们的应用程序
加入一个具有网页外观的界面,也许这才是我的目的。
Brief
CGI,common gateway interface,在我看来它就是一个公共约定。客户端浏览器提交表单(form)操作结果给服务器,服务器
解析这些操作,完成这些操作,然后创建返回信息(例如一个静态网页),返回给浏览器。
因为浏览器遵循了CGI发送请求的标准,那么我们所要做的就是解析收到的请求,处理我们自己的逻辑,返回信息给客户端即可。
Detail...
如果你要获取CGI的更多信息,你可以在网上查阅相关信息。如果你要获取web server对CGI标准的处理方式,我无法提供给你
这些信息。不过我愿意提供我的臆测:
处理CGI请求通常都是由脚本去完成(当然也可以用任何可执行程序完成)。就我所获取的资料来看,只要一门语言具备基本的
输入输出功能,它就可以被用作CGI脚本。浏览器以key-value的形式提交query string,一个典型的以GET方式提交query string的
URL类似于:http://host/cgi-bin/some-script.cgi?name=kevin+lynx&age=22。不必拘泥于我上句话中出现的一些让你产生问号的
名词。我可以告诉你,这里举出的URL(也许更准确的说法是URI)中问号后面的字符串即为一个query string。
我希望你看过我的上一篇草文<实现自己的http server>,你应该知道一个典型的GET请求时怎样的格式,应该知道什么是initial
line,应该知道HTTP请求有很多method,例如GET、POST、HEAD等。
一个CGI请求通常使用GET或POST作为其request method。对于一个GET类型的CGI请求,一个典型的request类似于:
GET /cgi-bin/some-script.cgi?name=kevin+lynx&age=22 HTTP/1.1
other headers...
...
我上面举例的那个URL则可能出现在你的浏览器的地址栏中,它对我们不重要。
而对于POST类型的CGI请求呢?query string只是被放到了optional body里,如:
POST /cgi-bin/some-script.cgi HTTP/1.1
other heads...
...
name=kevin+lynx&age=22
不管我说到什么,我希望你不要陷入概念的泥潭,我希望你能明确我在brief里提到的what can we do and how to do。
How about the web browser ?
我总是想引领你走在实践的路上(on the practice way)。作为一个程序员,你有理由自负,但是你没任何理由小觑任何一个
编程问题。打开你的编译器,现在就敲下main。
so,我们需要知道如何利用我们的浏览器,让我们更为顺手地实践我们的想法。
你也许会写:<html><head><title>HTML test</title></head><body>it's a html</body></html>这样的HTML标记语言。但是
这没有利用上CGI。check out the url in the reference section and learn how to write FORMs.
这个时候你应该明白:
<html>
<head>
<title>CGI test</title>
</head>
<body>
<FORM ACTION="./cgi-bin/test.cgi">
<INPUT TYPE="text" NAME="name" SIZE=20 VALUE="Your name">
</FORM>
</body>
</html>
加入<FORM>来添加表单,加入<INPUT TYPE="text"加一个edit box控件。那么当你在里面输入名字按下回车键时,浏览器将整理
出一个CGI query string发给服务器。
我希望你能在浏览器里看到以问号打头的key-value形式的字符串。
So here we go...
在你自己已有的http server的代码基础上,让浏览器来请求一个包含FORM的网页,例如以上我举例的html。当浏览器将请求发
给服务器的时候,看看服务器这边收到的request。即使你猜到了什么,我也建议你看看,这样你将看到一个真正的CGI query是怎么
样的。
so you know,CGI请求本质上也就是一连串的key-value字符串。真正的http server会将这些字符串传给CGI脚本。脚本只需要
输出处理结果信息到标准输出,服务器就会收集这些输出然后发给客户端。
你也许在揣摩,我们的httpd如何地exec一个外部程序或脚本,如何等待脚本执行完(需不需要异步?),然后如何收集标准输
出上的信息,然后是否需要同步地将这些信息送往客户端。
这很没必要。如果我们的http server真的只是被embeded到其他程序的。我们只需要将query的逻辑处理交给上层模块即可。
What's the next..
现在你知道什么是CGI query string,你也许稍微思考下就知道接下来你该如何去做(if you smart enough)。记住我们的目标,
只是解析CGI query string,然后处理相关逻辑,返回处理结果信息给客户端。
所以接下来,呃,接下来,everything is up to you:分析那些恼人的字符串,将其从&的间隔中整理出来,得到一个key-value
的表,将这个表给你的上层模块,上层模块根据query scritp决定执行什么逻辑,根据这个表获取需要的参数,处理,将结果格式
化为HTML之类的东西,then response。
就这么简单。
Example...
同样,我提供了源码,从而证明我不是纸上谈兵夸夸其谈。我希望我公开源码的习惯能受到你的赞同。
下载带CGI的http server.
Reference:
http://hoohoo.ncsa.uiuc.edu/cgi/ (获取服务器需要做的)
http://www.ietf.org/rfc/rfc3875 (rfc cgi)
http://www.cmis.brighton.ac.uk/~mas/mas/courses/html/html2.html (学会写带FORM的HTML)
http://www.cppblog.com/kevinlynx/archive/2008/08/06/58089.html?opt=admin
Implement CGI in your httpd
author : Kevin Lynx
Purpose
为我们的http server加入CGI的功能,并不是要让其成为真正响应CGI query功能的web server。正如klhttpd的开发初衷一样,
更多的时候我们需要的是一个嵌入式(embeded)的web server。
而加入CGI功能(也许它算不上真正的CGI),则是为了让我们与client拥有更多的交互能力。我们也许需要为我们的应用程序
加入一个具有网页外观的界面,也许这才是我的目的。
Brief
CGI,common gateway interface,在我看来它就是一个公共约定。客户端浏览器提交表单(form)操作结果给服务器,服务器
解析这些操作,完成这些操作,然后创建返回信息(例如一个静态网页),返回给浏览器。
因为浏览器遵循了CGI发送请求的标准,那么我们所要做的就是解析收到的请求,处理我们自己的逻辑,返回信息给客户端即可。
Detail...
如果你要获取CGI的更多信息,你可以在网上查阅相关信息。如果你要获取web server对CGI标准的处理方式,我无法提供给你
这些信息。不过我愿意提供我的臆测:
处理CGI请求通常都是由脚本去完成(当然也可以用任何可执行程序完成)。就我所获取的资料来看,只要一门语言具备基本的
输入输出功能,它就可以被用作CGI脚本。浏览器以key-value的形式提交query string,一个典型的以GET方式提交query string的
URL类似于:http://host/cgi-bin/some-script.cgi?name=kevin+lynx&age=22。不必拘泥于我上句话中出现的一些让你产生问号的
名词。我可以告诉你,这里举出的URL(也许更准确的说法是URI)中问号后面的字符串即为一个query string。
我希望你看过我的上一篇草文<实现自己的http server>,你应该知道一个典型的GET请求时怎样的格式,应该知道什么是initial
line,应该知道HTTP请求有很多method,例如GET、POST、HEAD等。
一个CGI请求通常使用GET或POST作为其request method。对于一个GET类型的CGI请求,一个典型的request类似于:
GET /cgi-bin/some-script.cgi?name=kevin+lynx&age=22 HTTP/1.1
other headers...
...
我上面举例的那个URL则可能出现在你的浏览器的地址栏中,它对我们不重要。
而对于POST类型的CGI请求呢?query string只是被放到了optional body里,如:
POST /cgi-bin/some-script.cgi HTTP/1.1
other heads...
...
name=kevin+lynx&age=22
不管我说到什么,我希望你不要陷入概念的泥潭,我希望你能明确我在brief里提到的what can we do and how to do。
How about the web browser ?
我总是想引领你走在实践的路上(on the practice way)。作为一个程序员,你有理由自负,但是你没任何理由小觑任何一个
编程问题。打开你的编译器,现在就敲下main。
so,我们需要知道如何利用我们的浏览器,让我们更为顺手地实践我们的想法。
你也许会写:<html><head><title>HTML test</title></head><body>it's a html</body></html>这样的HTML标记语言。但是
这没有利用上CGI。check out the url in the reference section and learn how to write FORMs.
这个时候你应该明白:
<html>
<head>
<title>CGI test</title>
</head>
<body>
<FORM ACTION="./cgi-bin/test.cgi">
<INPUT TYPE="text" NAME="name" SIZE=20 VALUE="Your name">
</FORM>
</body>
</html>
加入<FORM>来添加表单,加入<INPUT TYPE="text"加一个edit box控件。那么当你在里面输入名字按下回车键时,浏览器将整理
出一个CGI query string发给服务器。
我希望你能在浏览器里看到以问号打头的key-value形式的字符串。
So here we go...
在你自己已有的http server的代码基础上,让浏览器来请求一个包含FORM的网页,例如以上我举例的html。当浏览器将请求发
给服务器的时候,看看服务器这边收到的request。即使你猜到了什么,我也建议你看看,这样你将看到一个真正的CGI query是怎么
样的。
so you know,CGI请求本质上也就是一连串的key-value字符串。真正的http server会将这些字符串传给CGI脚本。脚本只需要
输出处理结果信息到标准输出,服务器就会收集这些输出然后发给客户端。
你也许在揣摩,我们的httpd如何地exec一个外部程序或脚本,如何等待脚本执行完(需不需要异步?),然后如何收集标准输
出上的信息,然后是否需要同步地将这些信息送往客户端。
这很没必要。如果我们的http server真的只是被embeded到其他程序的。我们只需要将query的逻辑处理交给上层模块即可。
What's the next..
现在你知道什么是CGI query string,你也许稍微思考下就知道接下来你该如何去做(if you smart enough)。记住我们的目标,
只是解析CGI query string,然后处理相关逻辑,返回处理结果信息给客户端。
所以接下来,呃,接下来,everything is up to you:分析那些恼人的字符串,将其从&的间隔中整理出来,得到一个key-value
的表,将这个表给你的上层模块,上层模块根据query scritp决定执行什么逻辑,根据这个表获取需要的参数,处理,将结果格式
化为HTML之类的东西,then response。
就这么简单。
Example...
同样,我提供了源码,从而证明我不是纸上谈兵夸夸其谈。我希望我公开源码的习惯能受到你的赞同。
下载带CGI的http server.
Reference:
http://hoohoo.ncsa.uiuc.edu/cgi/ (获取服务器需要做的)
http://www.ietf.org/rfc/rfc3875 (rfc cgi)
http://www.cmis.brighton.ac.uk/~mas/mas/courses/html/html2.html (学会写带FORM的HTML)
zt gtalk机器人实验成功
gtalk机器人实验成功
老早以前就想做一个跟"饭否"一样可以接受IM消息的机器人了。几个月前研究过这个,但没有深入。多亏前两天英明的决定学习python。才促使这个很长时间以来的愿望成真。
记录一下实现的详细过程。其实也很简单,因为gtalk使用的是xmpp这个开源协议,刚好python又有支持这个协议的模块。所以一切都顺理成章了。
1. 安装python的运行环境。下载地址:http://www.python.org/download/
2. 安装xmpppy模块。下载地址:http://xmpppy.sourceforge.net/
3. 安装pydns模块。下载地址:http://pydns.sourceforge.net/
4. 创建程序。新建一个gtalk.py的文件,源码如下:
--------------------------------------------------------------
#encoding=utf-8
import xmpp
def process_msg(conn, msg):
text = msg.getBody()
user = msg.getFrom()
conn.send(xmpp.Message(user, text))
def StepOn(conn):
try:
conn.Process(1)
except KeyboardInterrupt: return 0
return 1
def GoOn(conn):
while StepOn(conn): pass
conn = xmpp.Client('gmail.com')
conn.connect(server=('talk.google.com',5223))
conn.RegisterHandler('message', process_msg)
conn.auth('account', 'password', 'botty')
conn.sendInitPresence()
conn.send(xmpp.Message("youfriends@gmail.com" ,"wa hahaha, this is a robot"))
GoOn(conn)
---------------------------------------------------------------
使用指南:
把代码中的account改为你的gtalk登录账号(不需要@后的部分),password改为你的登录密码。youfriends@gmail.com设为你另一个gtalk账号。然后运行此文件。
提示:
在你设置的另一个账号中应该能收到"wa hahaha, this is a robot"的消息。给account的账号发送一个消息,你会收到自已发送的内容。如果把process_msg函数稍做修改,就可以实现与"饭否"一样的便捷发布功能了。
老早以前就想做一个跟"饭否"一样可以接受IM消息的机器人了。几个月前研究过这个,但没有深入。多亏前两天英明的决定学习python。才促使这个很长时间以来的愿望成真。
记录一下实现的详细过程。其实也很简单,因为gtalk使用的是xmpp这个开源协议,刚好python又有支持这个协议的模块。所以一切都顺理成章了。
1. 安装python的运行环境。下载地址:http://www.python.org/download/
2. 安装xmpppy模块。下载地址:http://xmpppy.sourceforge.net/
3. 安装pydns模块。下载地址:http://pydns.sourceforge.net/
4. 创建程序。新建一个gtalk.py的文件,源码如下:
--------------------------------------------------------------
#encoding=utf-8
import xmpp
def process_msg(conn, msg):
text = msg.getBody()
user = msg.getFrom()
conn.send(xmpp.Message(user, text))
def StepOn(conn):
try:
conn.Process(1)
except KeyboardInterrupt: return 0
return 1
def GoOn(conn):
while StepOn(conn): pass
conn = xmpp.Client('gmail.com')
conn.connect(server=('talk.google.com',5223))
conn.RegisterHandler('message', process_msg)
conn.auth('account', 'password', 'botty')
conn.sendInitPresence()
conn.send(xmpp.Message("youfriends@gmail.com" ,"wa hahaha, this is a robot"))
GoOn(conn)
---------------------------------------------------------------
使用指南:
把代码中的account改为你的gtalk登录账号(不需要@后的部分),password改为你的登录密码。youfriends@gmail.com设为你另一个gtalk账号。然后运行此文件。
提示:
在你设置的另一个账号中应该能收到"wa hahaha, this is a robot"的消息。给account的账号发送一个消息,你会收到自已发送的内容。如果把process_msg函数稍做修改,就可以实现与"饭否"一样的便捷发布功能了。
gtalk 远程控制
如果能把gtalk移植到嵌入式系统中,就能够利用它进行远程控制了,
最好是移植到功耗比较小的芯片中去,例如MSP430,但可能程序数据空间会不够,那就使用带
外部总线扩展的STM32 + lwip + xmpp.
还没有找到嵌入式移植的xmpp,都是依托与操作系统的。
最好是移植到功耗比较小的芯片中去,例如MSP430,但可能程序数据空间会不够,那就使用带
外部总线扩展的STM32 + lwip + xmpp.
还没有找到嵌入式移植的xmpp,都是依托与操作系统的。
订阅:
博文 (Atom)