[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;

}

[MenuetOS] HotCats 0.1 代码分析

用来在MEOS里抓取屏幕,不过这个版本并不完善。

在这个版本里,程序所用的方法是扫描屏幕上的点然后再写到缓存最后写到文件,这样就会导致速度很慢。

BMP格式文档可以去我的网络硬盘下载http://osdev.ys168.com

;=======================================

;    HotCats

;    Ver : 0.1

;    BLOG: http://hotheart.go.3322.org

;=======================================

bits 32

org    0x0

db 'MENUET01' ; 8 byte id

dd 0x01                        ; header version

dd START                        ; start of code

dd I_END                        ; size of image

dd 0x300000                    ; memory for app

dd 0xffff                        



阅读全文 »

[MenuetOS] HotRun 0.4 代码分析

; Made by HotHeart

http://www.xujiwei.com

[email protected]

; MENUET RUN 0.4

; 1) 缺省目录 /RD/1/

; 2) 可以更改程序目录,在SETUP里设置硬盘后可以运行

;    硬盘上的程序

; 3) 只能访问根目录

; 4) 自动根据屏幕大小调整窗口位置(限任务栏为文字模式)

use32

org    0x0

db 'MENUET01' ; 8 byte id

dd 0x01                    ; header version

dd START                   ; start of code

dd I_END                   



阅读全文 »

系统开发资源

中断大全

http://www.ctyme.com/intr/int.htm

操 作系统资源(英文)

http://www.nondot.org/sabre/os/articles

内核版之OS设 计

http://www.linuxforum.net/forum/printthread.php?Ca ... mp;main=334068&type=thread

Linux的一些Kernel资源

http://diy-os.gro.clinux.org/file.html

纯 C论坛文档资源中心

http://purec.binghua.com/Article/Index.asp

实模式进保护模式

在写自己的操作系统时,不能总在实模式下,进入保护模式才是"正道",不过怎么进入保护模式又是一个问题,我把

XuOS里进入保护模式的代码分析一下.

; 装入GDT

mov  eax,ds  ;设置GDT在物理内存中的正确位置

shl  eax,4

add  [gdt_addr+2],eax

cli  ; 关中断

lgdt [gdt_addr] ;载入GDT

; 下面打开A20地址线,这段代码可以在OSzone上找到相关解释.

call  Empty_8042

mov  al,0xd1

out  0x64,al

call  Empty_8042

mov  al,0xdf

out  0x60,al

call  Empty_8042

; 进入保护模式

mov  eax,cr0 ;置PE位

or   eax,1

mov  cr0,eax

jmp oscodesel:code_32  ; 跳到32位代码处执行

Empty_8042:

in   …

阅读全文 »

写你自己的操作系统

这是转载的,原文可以在http://www.xemean.net的文档中心里找到.

因为原文中的代码编译后运行有错误,这里我把改过后能正确运行的代码讲一下

org 0x07c00     ; 起始地址是0000:7c00

jmp begin_boot ; 跳过其它的数据,跳转到引导程序的开始处

OEM_ID                db "OSeg    "   ;软盘信息,具体请参考"FAT格式"

BytesPerSector        dw 0x0200

SectorsPerCluster     db 0x01

ReservedSectors       dw 0x0001

TotalFATs             db 0x02

MaxRootEntries        dw 0x00E0

TotalSectorsSmall     dw 0x0B40

MediaDescriptor       db 0xF0

SectorsPerFAT         dw 0x0009

SectorsPerTrack       dw 0x0012

NumHeads              dw 0x0002

HiddenSectors         dd 0x00000000…

阅读全文 »