2009年8月16日星期日

cgi&c,jQuery&CMS与OO

CGI 通用网关接口

The Common Gateway Interface
http://hoohoo.ncsa.illinois.edu/cgi/
CGI Programming FAQ
http://www.htmlhelp.org/faq/cgifaq.html

文档,参照和参考

最简单的示例

#!/bin/sh
echo Content-type: text/plain
echo /bin/date

出自 - 学习CGI脚本
http://www.jdon.com/idea/cgi.htm
老文了,用实例介绍了cgi

cgi是一种标准协议,与可执行的文件是何种语言编写无关。
通过URI的调用,服务器建立cgi进程。
cgi程序的标准输出的内容被发回客户端浏览器,
输入通过表单的GET和POST是以环境变量和标准输入的方式,
比如"/cgi-bin/test.cgi?inputstr"。
被建立的cgi进程随后销毁
c语言的实验代码

#include
int main(int argc,char** argv,char** envp)
{
puts("content-type:text/html\r\n\r\n");
while (envp++,*envp!=NULL){
puts(*envp);
puts("
");
}
}

解析FROM提交的QUERY-STRING的c实现
参见 用c写CGI 程序
http://www.programfan.com/article/2858.html

QUERY-STRING的格式及代码 略
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
URL编码遵循下列规则:
每对name/value由&符分开.
每对来自表单的name/value由=符分开. 如果用户没有输入值给这个name,那么这个name还是出现,只是无值(象这样 "name=").
任何特殊的字符(就是那些不是简单的七位ASCII,如汉字) 将以百分符%用十六进制编码. 当然也包括象 =, &, 和 % 这些特殊的字符.
在输入区中的空格将以加号+显示.




用perl会比用c方便些,而php则更加专用了。
c/cpp库有 cgic Cgicc
封装了函数提供如表单检查或文件上传等功能
协议大体分别是BSD-Like和LGPL
能找到示例代码

使用FastCGI技术,可以建立长期的cgi进程。
http://www.fastcgi.com

#include

void main(void)
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("Hello world!
\r\n");
printf("Request number %d.", count++);
}
exit(0);
}


想简单实验cgi可以用
(Win32)EasyWebServer V1.9
(Linux)mini-httpd
Linux下注意权限和是否开启cgi功能

c语言下锁住文件用sys/file.h的flock()
例如编写计数器类似程序,会同时对同一个共享的文件读写的。

编写包含同时处理多用户的各自状态的程序,
通过session和cookie来实现
cookie的获取和设定功能,有cgi协议提供
session则对登录的用户分配ID,分别由服务器和浏览器的cookie匹配保存和传递状态。
如果用c编写,session需要自行实现。

CMS
内容管理系统 - Content Management System

比如 drupal,Joomla(个人乱猜前者侧重平台,后者是信息展示)
博客类wordpress也可以算,不过CMS管理个内容不限于博主及Post,且可结合更多样的形式。
对CMS我是刚去了解,之前仅有所耳闻。
我看了各自DEMO,感觉到的基础的组成有:前端后端(用于展示和管理),用户管理,模块管理(安装),文本(基本的)的发布及管理,站点栏目及页面的管理,展示的视图组件(首页的部件,也和使用theme相关),二次开发的API。

jQuery是用于客户端的JavaScript代码库,以实现
DOM操作 选择器及操作
AJAX 用于创建与服务器通信的交互式网页
动态效果
用户界面 jQuery UI
使用已有众多组件

见到有jQuery与drupal结合操作的教程。

如果想复杂,可以自己架一个eyeos试试?
一个基于php的WebOS,
提供GUI创建工具,和供服务端自行编写PHP使用的API。
感觉把一个Linux(界面很像)搬到了浏览器中。
记得它已经有好几年历史了,不过目前看来,过多把数据和处理逻辑全放在服务器,而客户端运行的部分不足,确实不方便。
其他WebOS也有形式如远程终端,FireFox的附加组件类似,FLASH类似先接受一个小心客户端再与服务端交互,AJAX与CGI的处理逻辑分别由和客户端服务端承担。

上面一段是借题想到,就写上去了。话说最近指南类文贴的较多,都仅泛泛说说,而求内容由不集中啊。呵呵。
我给本博想了一个主题,叫 IT技术(与 文艺)提升人的生产与生活。单篇贴仍保持之前“资源与引导”的思路来。恩,这里仅仅是这么想过而已。
有购域名和空间的打算,目前思路还不明了啊。

其实本来开本贴就只打算简单扯几句想法的,介绍部分一写就占内容了。
话说建立站点与信息发布,
较原始和简单的办法,就是手工编辑网页文件。
发布信息,只需要建立新网页或在网页中添加相应内容,修改也是同样的方式。
如果考虑主页的部分内容是可以自动生成的,也可编写简单的脚本来辅助。
评论部分用CGI的GuestBook即可。
单纯的信息发布,也可用已有的博客系统。但相比而言,一个博客系统会比前一种方式要庞大,且机制更为复杂。是否算违背“简单”的原则呢?
恩,这里会考虑分离和重用。就像DIV+CSS可以分离网页的内容和布局,运用博客系统则是分离了对内容的控制和对系统功能的控制。在对系统使用的功能中,使得用户能够更好的专注内容。同时也降低了技术上的要求。而同一份高质量的博客系统可以被不同的人使用,既节约了成本也保障了代码的质量。也有自定义主题和扩展模块的部件。

对于命令式语言,块结构是对GOTO的封装,而函数功能则提供了更高层次的封装。在C风格的API的设计中,可以划分出获取值,设置值,执行命令(初始化和释放是成对出现,有点特别)三类。而以对象形式封装的接口由包,属性,事件,方法组成。接口的信息可以通过文档或对象浏览器提供。GUI组件倾向于后者的形式封装,符合人的观点且可节约代码。(比如,不用调用一个长名称的函数,再加一个指向结构的指针为参数。也增强安全性。)
接口的形式仅是一个方面,这里更多是涉及设计方式的变化。从单一的变量,到包含不同数据的结构体,在演化为对象在包含数据的同时也可以能对自身处理的函数。这是在出于封装需求(安全,重用)的同时,也出于对模拟系统的开发与设计之中的探索(比如生命之类?)。参考Win32API在GUI部分的设计(我记不太清楚了,大体如此吧)是物件导向的思路加函数形式的接口。先填充包含属性和用于处理的消息的回调函数的结构体,由此从窗口类注册并创建窗口对象(也包含按钮文本框之类的,先是一个容器窗口了)。同时存在一个消息循环,就是一个while/loop循环了。接受到来自消息列队的消息并对消息代表的事件判断,就是switch或ifelseif(这两者有区别,因为前者可以优化为跳转表)的形式。事件比如按钮按下更,包括了两个基本的,是创建时和销毁时。如果不是通过资源文件里编写好的对话框样式,窗口就需要在创建是建立如按钮等控件,同时告诉子窗口发回不处理的消息(可能是)。对于窗口可以子类化(先自行处理消息在调用父类处理)和超类化(用来批量创建子类),实现方式体现在对消息的处理流程上。对比smalltalk和c++风格处理消息/方法的办法,前者是动态查找,后者是转化为函数并建立虚函数表处理子类的继承关系(可当接口用)。但至少不用自己进行消息判断的代码,在运用物件导向的同时,既节约了代码,也分离了实现消息处理的方法和设计中消息要处理的实际内容(即实际的处理逻辑)。
先承认一下,我一直认为物件导向给编码带来麻烦,同时又认同设计模式和重构中(才仅听说而已)分离出设计的步骤,且VB和GWBASIC都是方便的东西,所以想来上面一些内容。不过我目前看那些CMS都很痛苦的感觉,不过要用时又确实去会使用他们。

下面的话题是用代码创建一个虚拟的世界,其实就是游戏啦。通常的游戏脚本使用简单的GOTO语句就可以实现逻辑了。也或许有更快捷的方式。
参照是类RPG形式的冒险类游戏。
来伪代码:
while !quitgame
界面绘制()
处理按键()
触发及事件的游戏逻辑()
wend
func 子界面
或者有文本数据
或role npc1=new role("路人甲");sense1.add(npc1);
或...(?)
ok,不早了,先烂尾在这里吧。
4hours累计,闲话啊

======
找来RPGMARKER PC版的试玩,它把项目分为事件和数据(可单独划分出map)两类。其实它事件也是当作数据的,因为游戏本身的系统是固定的。后来的的版本由增加脚本模块,并预置了系统本身使用的脚本,按作用木桶分为:模块,游戏对象,精灵,窗口,场景,自定义插件,主程序。这些脚本可以看作是由原本固定的系统转化而成。在数据部分,系统是极有FF+DQ的风格。道具的效果或敌人的行为等设定并不直接提供脚本形式,而是选择预设的条件事件或加成效果等。事件编辑是条件加事件List(界面就是List加单独的属性框的设计)。RM的gba版和3d版也蛮有趣的样子啊。
看一些Galgame的引擎就是纯文本的脚本了,系统最基本的部分是提供了图像声音等一些功能调用。仅限定了游戏的形式,而对游戏的系统设计需自行完成(这样才被玩得有意思嘛)。不过这里通常就不用考虑OO了。状态以变量形式保存,用脚本展现游戏流程,再单独制作如存档等功能模块(包括场景)。
====
090819
关于WebApp的平台或框架,看了GAE和web.py的文档比较简明,虽然它们不是被通常使用。<-病句
AVG游戏的常见引擎有几个,这里略过。N,K,R.
有的CMS就可当框架用了,不过当然不是一回事情。
====
091029
只想着设计上的接口和抽象了,忘说cpp设计的一个初始目的是便于组织代码结构。<-当然前者仍是这贴里考虑的重点,貌似我当初是在这么写的。

没有评论: