AJAX初体验之上手篇

AJAX是这两年蛮热的东西,我也凑凑热闹,前些天去找了些教程学学,下面就按整个处理过程把自己学的东西写写,不过,因为是初学,所以有错误就请见谅啦,也欢迎指正,vipxjw#163.com。

PS.写完了之后看了下,结果再次验证自己写教程真是乱得可以,东说一块西说一块,条理不太清楚的说:)。

1.创建 XMLHttpRequest 对象

现在的浏览器有很多种,创建 XMLHttpRequest 的方法也不相同,所以为了兼容各种浏览器,在创建 XMLHttpRequest 时也应该考虑到各种浏览器的情况。目前主流的浏览器在Windows下有IE、Firefox及Opera,所以我们写的代码要尽量兼容这几个浏览器。在参考了一些资料后,我用下面的方法来创建 XMLHttpRequest 对象:

// 先定义一个变量,并赋初值为 false,方便后面判断对象是否创建成功
var xmlObj = false;
// 使用 try 来捕获创建失败,再换个方法来创建
try {
// 在 Mozilla 中使用这种方式来创建 XMLHttpRequest 对象
xmlObj=new XMLHttpRequest;
}
catch(e) {
try {
// 如果不成功,那么尝试在较新 IE 里的方式
xmlObj=new ActiveXObject("MSXML2.XMLHTTP");
}
catch(e2) {
try {
//


阅读全文 »

[VB] 短信统计

无聊时做的一个东东,用来统计短信发送的情况,每个号码发了几条,占的百分比,还有图示。数据文件用从移动网站得到的短信详单,从第一条复制到最后一条保 存成文本文件就可以了~~再想想,似乎真的很无聊的一东西……

下载:SMSStat

[VB] Win+R

以前做的一个小软件,用来管理注册表里AppPath里的项,可以从运行对话框里快速启动程序。我一般是取程序名的两个字母,基本上都是左手边的,比如 Foxmail就用fx,FlashGet用fg,Visual C++用vc,这样就可以只用左手来启动程序了。我是感觉是方便点,具体用不用和怎么用 看个人高兴了。说明文件是照着EMU8086的说明文件用英文写的,纯粹为了好玩,英语没学好,有语法错误是难免的,所以不看也罢^_^。PS.早上起来 发现又下雨了。

下载:WinR

update @ 2009.06.18 把 COMCTL32.ocx 一起放进压缩包,避免有些机器上会出现找不到 COMCTL32.ocx 的错 误。

[VB] 一个操作多线程的类

根据点睛工作室的多线程类改写的,不过没有经过严格测试,好像工作不是很稳定,如果使用不当会出错的说。

Option Explicit

Private Type SECURITY_ATTRIBUTES

nLength As Long

lpSecurityDescriptor As Long

bInheritHandle As Long

End Type

Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long

Private Declare Function


阅读全文 »

[C] 贪心算法

去图书馆借了本算法与数据结构,第一节里有个贪心算法,回寝室便试了下,不想碰到了一些问题。

例1.1 快速送达疫苗

已 知有邻近的五个村子发生了疫情,见图1-1。我们要用汽车快速地将疫苗送达到5个村子,目标是寻找一条耗时最少的路线。

画图不方便就不放 了:)代码里s数组存放的就是各个村子之间的距离。

我用C写的代码如下:

#include <stdio.h>

int s[5][5]={

{0,1,2,7,5},

{1,0,4,4,3},

{2,4,0,1,2},

{7,4,1,0,3},

{5,3,2,3,0},

};

int visited[5]={0};

int mindis(int start)

{

int i;

int d=10;

int n;

for(i=0;i<5;i++)

{

if(visited[i]==0&&s[start][i]<d)

{

d=s[start][i];

n=i;

}

}

visited[n]=1;

return n;

}

void greedy(int start)

{

int cost;

int i;



阅读全文 »

[JavaScript] 静态的动态续篇之来点XML

在搞定了基本的伪动态之后,我马上把它应用到了网站,但随后就发现了一个问题:我如何来管理新闻列表呢?要是让我在每次要加新闻时去修改源文件然后再上传我可是千万个不愿,不仅麻烦而且容易出错,懒人怎么能可以这么做。动动脑子,于是想到了用XML,这个早已存在,但近些年才流行起来的技术。

在HTML里,可以使用数据岛来使用XML数据,一个使用方法就是在HTML里加入一句:

<xml id="data">

<!-- 在此为XML数据 -->

</xml>

这样,就可以在HTML里使用XML提供的数据。不过,这样还是显得麻烦了,还是要上传整个文件,那么用方便点的吧~~

<xml id="data" src="data.xml"/>

这样处理之后,我就可以只用修改一个XML文件然后上传到服务器了。

接下来,就是搞定在客户端对XML数据的处理了~~

首先,我得设计一个新闻的数据结构。这个简单,毕竟在列表时只需要用到新闻的标题和时间,但为了链接,需要加上一个ID,结果如下:

<newslist>

<news>

<id>1</id>

<title>第一个新闻</title>

<date>2005-11-16</date>

</news>

</newslist>

数据结构搞定了,继续!

在客户端对数据处理当然首选JavaScript了,再么这篇文章讲的也是用JavaScript来实现伪动态。

在JS里,对数据岛的访问可以使用记录集:

var rs=data.recordset;

这个记录集的使用方法和ASP中类似,这下方便我了:),可以很方便地实现新闻的列表及链接了~在显示新闻,还需要显示的是上一条新闻的标题及下一条新闻的标题,而且显示新闻列表时,就不需要显示上一条及下一条新闻了。于是我放了两个层分别用来显示新闻和上一条及下一条新闻的信息,并在需要的时候设置是否显示。其中newsmain用来显示新闻或者新闻列表,newspage用来显示上一条及下一条新闻的信息。接着把对应ID的新闻存为网页文件,在显示时使用iframe嵌入。

先写个函数来从网址中获取新闻ID,这个在前一篇文章已经讲过,拿来用~~

function getid() {

var str,len,pos,id,fn;     // 定义一些变量

str=top.window.location.href;    //获取当然文件地址

len=str.length;     // 得到地址长度

pos=str.indexOf("?id=",0);   // 得到"?id="的起始地址

// 判断是否存在"?id="

if(pos>0) {

id=str.substring(pos+4,len);   // …

阅读全文 »

[JavaScript] 静态的动态

这段时间因为要做个网站,而空间又不支持ASP,所以又拿起JavaScript教程看了下,看能不能在静态的空间里实现动态,当然,这个动态不是真正意义上的了,可以说只是一个“伪动态”了:)

最基本的动态页面的功能,莫过于news.asp?id=1这样的形式了,于是我就拿这个目标开工,弄了一会还真有些成效~基本构思是:从浏览器的地址栏获取当前文件的地址,然后从其中提取id,最后用内嵌框架来显示相关内容。以下是基本的代码

<script>
var str,len,pos,id,fn;     // 定义一些变量
str=top.window.location.href;    //获取当然文件地址
len=str.length;     // 得到地址长度
pos=str.indexOf("?id=",0);   // 得到"?id="的起始地址
if(pos>0)   // 判断是否存在"?id="
{
id=str.substring(pos+4,len);   // 获取ID
fn="<iframe src='news/" + id + ".htm'></iframe>"  // 在内嵌框架里显示相关内容
document.write(fn);   // 输出
} else {
document.writeln("错误的参数!");  // 不存在ID
}
</script>

这样,就可以把新闻做成页面放在news目录,然后在外部调用news.htm?id=1就可以来查看相关的新闻了~~

当然这里的代码并不成熟,比如没有判断ID是否为数字等,这等以后去慢慢完善了:)

用汇编实现符串操作函数

不管是在系统开发还是在平时的编程当中,字符串操作都是很重要的一部分。在C中,已经有库提供了strcpy、strcmp、strcat等函数, 而在开发用汇编开发自己的系统时,并没有现在的库可用,这就要求我们自己来实现字符串操作了。以下如果没有特别说明,字符串均以0为结束标志。

strcpy 字 符串复制

在字符串复制当中,为了简便,可以像在C中一样,不考虑边界问题,把这个问题交调用者,不过这样就有可能产生缓冲区溢出 了:)字符串复制还是比较容易实现的,只要在复制每一个字节之前判断是不是0,如果是就结束,不是则继续复制下一个字节。我给出一个简单的例子,当然,你 可以把它优化以产生更好的性能。

strcpy:

; in  si 源字符串起始地址

;     di 目标地 址

; out 无

push si

push di  ; 保护寄存器

next:

lodsb    ; 载 入一个字节

or al,al  ; 是0吗?

je end  ; 是则结束

stosb   ; 不 是则放入目标中

jmp next ; 继续下一个字节

end:

mov [di],byte …

阅读全文 »

BMP 文件格式学习

由于改进IMAGELIS的需要,我对BMP文件的格式进行了一些研究,写在这里做为学习笔记,也给需要的朋友做为参考。如果没有特别说明,我所用的位图文件都是由WinowXP自带的画图产生。

BMP文件格式在网上已经很多教程之类的,不过我这里讲的是一些它们没提到的。

1.数据区起始位置

我在网上找到许多有关BMP文件格式的说明都说数据区起始位置在相对文件开头51个字节处,但我却发现数据区起始在相关文件开头55个字节处,不知是网上的错了还是我错了,不过我这样用了好像也没出错,有空再研究研究。

2.像素保存顺序

位图保存时扫描顺序是从下至上,从左至右,即在位图数据区,位图第一行保存在位图数据区的最后,而位图最后一行保存在位图数据区的开始,例有一个4x4的位图,那么它有4行,4列,像素保存在数据区的顺序是这样的:

line3 pixel 0 1 2 3

line2 pixel 0 1 2 3

line1 pixel 0 1 2 3

line0 pixel 0 1 2 3

因此,如果我们要自己产生一个位图文件,那么保存时就应该从最后一行,第一个像素开始保存,保存好一行后就往上一行直到第一行保存完毕,当然,我们必须在位图数据之前加上位图文件头,文件头的格式可以在网上找资料。

3.行字节对齐

可能是为了数据区的读取更快速,BMP格式规定一行的字节数必须是4的倍数,如果不足,就用0补足。例如有一幅5x5的24位色位图,那么本来每一行的字节数是24/8*5=15个字节,但15不是4的倍数,还需要1个字节来补足,于是在数据区这一行的数据就是:

pixel 0 1 2 3 4 0x00

同理如果宽度是7那么就需要补3个字节等等。如果是12x12单色位图,那么一行有12/2=6个字节,就需要在每一行的数据的最后补2个字节。

这个补0的问题很多朋友在处理位图的时候没有注意,以致于程序在处理诸如32x32之类的位图时能很好的运行,而处理如31x32这样的就不行了。

4.颜色数少于256时的数据位

在颜色数少于256时一个字节里就可能保存1个或者更多个像素,这时就要注意像素在字节里的保存顺序了。像素在字节内保存的顺序原则是前面的像素在高位,后面的像素在低位。例:

在16色位图里,每一个像素需要4个bit来保存,因此1个字节里就保存了两个像素,假如有一个2x1的16色位图,第一个像素是黑色,数据是0x0,第二个像素白色,数据是0xF,那么根据上面的原则,这两个像素在字节里是这样保存的:

pixel 0      1

bits  0000 …

阅读全文 »

[C] 冒泡排序

冒泡排序法:)记得在一本三级A类教程上看过怎么优化的,现在又给忘了,只写了这么个东东。

#include <stdio.h>

#define N 100

int main(int argc, char *argv[])

{

int a[N];

int i,j,temp;

for(i=0;i<N;i++) a[i]=rand();

printf("start: %d\n",st=(unsigned)time(NULL));

for(i=0;i<N;i++)

{

for(j=i;j<N-1;j++)

{

if(a[j]>a[j+1])

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

for(i=0;i<N;i++) printf("%d ",a[i]);

printf("\n");

return 0;

}