编程相关的存档

电脑报2009电子文库

2010-08-05 10:07

无意中发现电脑报的合订本光盘中的电子版的内容以SQLite数据库储存。所以就打算提取出来,做个在线阅读网站程序。
经过一段时间的编码转换、文章内容解密以及程序编写等,终于完成了两个平台的阅读程序。分别为“PHP+sqlite”和“Google App Engine”,其中PHP的因为没有相应的网站空间而只在本地使用。GAE的已经上传并调试完成,网址为:http://pcbook2009.appspot.com/。因为图片总共有600多M,所以没有使用图片,只是文字版的。
不得不说一下是,在编码转换方面绕了不少弯路,使用过C#、和sqlitemanager,最后用php的PDO竟然可以很好的读取GB2312编码。还有就是文章内容的解密,开始以为是经过压缩的,试过几种的压缩工具,都没成功,后来认真查看了内容的字节码,竟然发现了规律,于是写了个小函数解密!成功解密!

欢迎阅读:http://pcbook2009.appspot.com/

推荐(0)
收藏

ASP验证码程序

2010-07-10 12:53

一个ASP验证码程序,感觉不错。

字符数据可以修改成自己的字符,不受字体影响,应该比较安全了吧!

<%

Option Explicit        ' 显示声明

Class Com_GifCode_Class

'''''''''''''''''''''''''''''''''''''''''''''

' Author: Layen support@ssaw.net 84815733(QQ)

' Thanks: Laomi, Laomiao, NetRube

'                                  2006-01-02

'''''''''''''''''''''''''''''''''''''''''''''

Public Noisy, Count, Width, Height, Angle, Offset, Border

Private Graph(), Margin(3)

Private Sub Class_Initialize()

Randomize

Noisy    = 16    ' 干扰点出现的概率

Count    = 4    ' 字符数量

Width    = 80    ' 图片宽度

Height    = 20    ' 图片高度

Angle    = 2    ' 角度随机变化量

Offset    = 20    ' 偏移随机变化量

Border = 1    ' 边框大小

End Sub

Public Function Create()

Const cCharSet = "123456789"

Dim i, x, y

Dim vValidCode : vValidCode = ""

Dim vIndex

ReDim Graph(Width-1, Height-1)

For i = 0 To Count - 1

vIndex = Int(Rnd * Len(cCharSet))

vValidCode = vValidCode + Mid(cCharSet, vIndex+1 , 1)

SetDraw vIndex, i

Next

Create = vValidCode

End Function

Sub SetDot(pX, pY)

If pX * (Width-pX-1) >= 0 And pY * (Height-pY-1) >= 0 Then

Graph(pX, pY) = 1

End If

End Sub

Public Sub SetDraw(pIndex, pNumber)

' 字符数据

Dim DotData(8)

DotData(0) = Array(30, 15, 50, 1, 50, 100)

DotData(1) = Array(1 ,34 ,30 ,1 ,71, 1, 100, 34, 1, 100, 93, 100, 100, 86)

DotData(2) = Array(1, 1, 100, 1, 42, 42, 100, 70, 50, 100, 1, 70)

DotData(3) = Array(100, 73, 6, 73, 75, 6, 75, 100)

DotData(4) = Array(100, 1, 1, 1, 1, 50, 50, 35, 100, 55, 100, 80, 50, 100, 1, 95)

DotData(5) = Array(100, 20, 70, 1, 20, 1, 1, 30, 1, 80, 30, 100, 70, 100, 100, 80, 100, 60, 70, 50, 30, 50, 1, 60)

DotData(6) = Array(6, 26, 6, 6, 100, 6, 53, 100)

DotData(7) = Array(100, 30, 100, 20, 70, 1, 30, 1, 1, 20, 1, 30, 100, 70, 100, 80, 70, 100, 30, 100, 1, 80, 1, 70, 100, 30)

DotData(8) = Array(1, 80, 30, 100, 80, 100, 100, 70, 100, 20, 70, 1, 30, 1, 1, 20, 1, 40, 30, 50, 70, 50, 100, 40)

Dim vExtent : vExtent = Width / Count

Margin(0) = Border + vExtent * (Rnd * Offset) / 100 + Margin(1)

Margin(1) = vExtent * (pNumber + 1) - Border - vExtent * (Rnd * Offset) / 100

Margin(2) = Border + Height * (Rnd * Offset) / 100

Margin(3) = Height - Border - Height * (Rnd * Offset) / 100

Dim vStartX, vEndX, vStartY, vEndY

Dim vWidth, vHeight, vDX, vDY, vDeltaT

Dim vAngle, vLength

vWidth = Int(Margin(1) - Margin(0))

vHeight = Int(Margin(3) - Margin(2))

' 起始坐标

vStartX = Int((DotData(pIndex)(0)-1) * vWidth / 100)

vStartY = Int((DotData(pIndex)(1)-1) * vHeight / 100)

Dim i, j

For i = 1 To UBound(DotData(pIndex), 1)/2

If DotData(pIndex)(2*i-2) <> 0 And DotData(pIndex)(2*i) <> 0 Then

' 终点坐标

vEndX = (DotData(pIndex)(2*i)-1) * vWidth / 100

vEndY = (DotData(pIndex)(2*i+1)-1) * vHeight / 100

' 横向差距

vDX = vEndX - vStartX

' 纵向差距

vDY = vEndY - vStartY

' 倾斜角度

If vDX = 0 Then

vAngle = Sgn(vDY) * 3.14/2

Else

vAngle = Atn(vDY / vDX)

End If

' 两坐标距离

If Sin(vAngle) = 0 Then

vLength = vDX

Else

vLength = vDY / Sin(vAngle)

End If

' 随机转动角度

vAngle = vAngle + (Rnd - 0.5) * 2 * Angle * 3.14 * 2 / 100

vDX = Int(Cos(vAngle) * vLength)

vDY = Int(Sin(vAngle) * vLength)

If Abs(vDX) > Abs(vDY) Then vDeltaT = Abs(vDX) Else vDeltaT = Abs(vDY)

For j = 1 To vDeltaT

SetDot Margin(0) + vStartX + j * vDX / vDeltaT, Margin(2) + vStartY + j * vDY / vDeltaT

Next

vStartX = vStartX + vDX

vStartY = vStartY + vDY

End If

Next

End Sub

Public Sub Output()

Response.Expires = -9999

Response.AddHeader "pragma", "no-cache"

Response.AddHeader "cache-ctrol", "no-cache"

Response.ContentType = "image/gif"

' 文件类型

Response.BinaryWrite ChrB(Asc("G")) & ChrB(Asc("I")) & ChrB(Asc("F"))

' 版本信息

Response.BinaryWrite ChrB(Asc("8")) & ChrB(Asc("9")) & ChrB(Asc("a"))

' 逻辑屏幕宽度

Response.BinaryWrite ChrB(Width Mod 256) & ChrB((Width \ 256) Mod 256)

' 逻辑屏幕高度

Response.BinaryWrite ChrB(Height Mod 256) & ChrB((Height \ 256) Mod 256)

Response.BinaryWrite ChrB(128) & ChrB(0) & ChrB(0)

' 全局颜色列表

Response.BinaryWrite ChrB(255) & ChrB(255) & ChrB(255)

Response.BinaryWrite ChrB(0) & ChrB(85) & ChrB(255)

' 图象标识符

Response.BinaryWrite ChrB(Asc(","))

Response.BinaryWrite ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0)

' 图象宽度

Response.BinaryWrite ChrB(Width Mod 256) & ChrB((Width \ 256) Mod 256)

' 图象高度

Response.BinaryWrite ChrB(Height Mod 256) & ChrB((Height \ 256) Mod 256)

Response.BinaryWrite ChrB(0) & ChrB(7) & ChrB(255)

Dim x, y, i : i = 0

For y = 0 To Height - 1

For x = 0 To Width - 1

If Rnd < Noisy / 100 Then

Response.BinaryWrite ChrB(1-Graph(x, y))

Else

If x * (x-Width) = 0 Or y * (y-Height) = 0 Then

Response.BinaryWrite ChrB(Graph(x, y))

Else

If Graph(x-1, y) = 1 Or Graph(x, y) Or Graph(x, y-1) = 1 Then

Response.BinaryWrite ChrB(1)

Else

Response.BinaryWrite ChrB(0)

End If

End If

End If

If (y * Width + x + 1) Mod 126 = 0 Then

Response.BinaryWrite ChrB(128)

i = i + 1

End If

If (y * Width + x + i + 1) Mod 255 = 0 Then

If (Width*Height - y * Width - x - 1) > 255 Then

Response.BinaryWrite ChrB(255)

Else

Response.BinaryWrite ChrB(Width * Height Mod 255)

End If

End If

Next

Next

Response.BinaryWrite ChrB(128) & ChrB(0) & ChrB(129) & ChrB(0) & ChrB(59)

End Sub

End Class

%>

显示方法:

<%

Dim mCode

Set mCode = New Com_GifCode_Class

Session("GetCode") = mCode.Create()    ' 将验证码存到Session中

mCode.Output()    ' 输出数据

Set mCode = Nothing

%>

验证例子:

<%

If IsEmpty(Session("GetCode")) Or Session("GetCode") <> UCase(Request.Form("Form_Code")) Then

Response.Write "验证码输入错误"

Response.End

Else

Session("GetCode") = Empty    ' 清空Session

Response.Write "验证码输入正确"

Response.End

End If

%>

推荐(0)
收藏

玩了一下Google App Engine

2010-07-07 10:12

玩了一下Google App Engine,感觉不错!

Python编程感觉很好!

而且还绑定了域名:http://www.7home.net

等待灵感开发应用……

推荐(0)
收藏

[转]GIF图像格式详解

2010-07-06 8:46

GIF是图像交换格式(Graphics Interchange Format)的简称,它是由美国CompuServe公司在1987年所提出的图像文件格式,它最初的目的是希望每个BBS的使用者能够通过GIF图像文件轻易存储并交换图像数据,这也就是它为什么被称为图像交换格式的原因了。
GIF文件格式采用了一种经过改进的LZW压缩算法,通常我们称之为GIF-LZW算法。这是一种无损的压缩算法,压缩效率也比较高,并且GIF支持在一幅GIF文件中存放多幅彩色图像,并且可以按照一定的顺序和时间间隔将多幅图像依次读出并显示在屏幕上,这样就可以形成一种简单的动画效果。尽管GIF最多只支持256色,但是由于它具有极佳的压缩效率并且可以做成动画而早已被广泛接纳采用。下面笔者详细介绍GIF文件的格式。
GIF图像文件是以块的形式来存储图像信息,其中的块又称为区域结构。按照其中块的特征又可以将所有的块分成三大类,分别是控制块(Control Block)、图像描述块(Graphic Rendering Block)和特殊用途块(Special Purpose Block)。控制块包含了控制数据流的处理以及硬件参数的设置,其成员主要包括文件头信息、逻辑屏幕描述块、图像控制扩充块和文件结尾块。图像描述块包含了在显示设备上描述图像所需的信息,其成员包括图像描述块、全局调色板、局部调色板、图像压缩数据和图像说明扩充块。特殊用途块包含了与图像数据处理无直接关系的信息,其成员包括图像注释扩充块和应用程序扩充块。下面详细介绍每一个块的详细结构。
1. 文件头信息
GIF的文件头只有六个字节,其结构定义如下:
typedef struct gifheader
{
BYTE bySignature[3];
BYTE byVersion[3];
} GIFHEADER;
其中,bySignature为GIF文件标示码,其固定值为“GIF”,使用者可以通过该域来判断一个图像文件是否是GIF图像格式的文件。byVersion表明GIF文件的版本信息。其取值固定为“87a”和“89a”。分别表示GIF文件的版本为GIF87a或GIF89a。这两个版本有一些不同,GIF87a公布的时间为1987年,该版本不支持动画和一些扩展属性。GIF89a是1989年确定的一个版本标准,只有89a版本才支持动画、注释扩展和文本扩展。
2. 逻辑屏幕描述块
逻辑屏幕(Logical Screen)是一个虚拟屏幕(Virtual Screen),它相当于画布,所有的操作都是在它的基础上进行的,同时它也决定了图像的长度和宽度。逻辑屏幕描述块共占有七个字节,其具体结构定义如下:
typedef struct gifscrdesc
{
WORD wWidth;
WORD wDepth;
struct globalflag
{
BYTE PalBits   : 3;
BYTE SortFlag : 1;
BYTE ColorRes : 3;
BYTE GlobalPal : 1;
} GlobalFlag;
BYTE byBackground;
BYTE byAspect;
} GIFSCRDESC;
其中,wWidth用来指定逻辑屏幕的宽度,wDepth用来指定逻辑屏幕的高度,glaobalflag为全域性数据,它的总长度为一个字节,其中前三位(第0位到第2位)指定全局调色板的位数,可以通过该值来计算全局调色板的大小。第3位表明全局调色板中的RGB颜色值是否按照使用率进行从高到底的次序排序的。第4到第6位指定图像的色彩分辨率。第7位指明GIF文件中是否具有全局调色板,其值取1表示有全局调色板,为0表示没有全局调色板。一个GIF文件可以有全局调色板也可以没有全局调色板,如果定义了全局调色板并且没有定义某一幅图像的局部调色板,则本幅图像采用全局调色板;如果某一幅图像定义的自己的局部调色板,则该幅图像使用自己的局部调色板。如果没有定义全局调色板,则GIF文件中的每一幅图像都必须定义自己的局部调色板。全局调色板必须紧跟在逻辑屏幕描述块的后面,其大小由GlobalFlag.PalBits决定,其最大长度为768(3*256)字节。全局调色板的数据是按照RGBRGB…..RGB的方式存储的。byBackground用来指定逻辑屏幕的背景颜色,也就相当于是画布的颜色。当图像长宽小于逻辑屏幕的大小时,未被图像覆盖部分的颜色值由该值对应的全局调色板中的索引颜色值确定。如果没有全局调色板,该值无效,默认背景颜色为黑色。byAspect用来指定逻辑屏幕的像素的长宽比例。
3. 图像描述块
一幅GIF图像文件中可以存储多幅图像,并且这些图像没有固定的存放次序。为了区分两幅图像,GIF采用了一个字节的识别码(Image Separator)来判断下面的数据是否是图像描述块。图像描述块以0x2C开始,定义紧接着它的图像的性质,包括图像相对于逻辑屏幕边界的偏移量、图像大小以及有无局部调色板和调色板的大小。图像描述块由10个字节组成:
typedef struct gifimage
{
WORD wLeft;
WORD wTop;
WORD wWidth;
WORD wDepth;
struct localflag
{
BYTE PalBits   : 3;
BYTE Reserved : 2;
BYTE SortFlag : 1;
BYTE Interlace : 1;
BYTE LocalPal : 1;
} LocalFlag;
} GIFIMAGE;
其中,wLeft用来指定图像相对逻辑屏幕左上角的X坐标,以象素为单位。wTop用来指定图像相对逻辑屏幕左上角的Y坐标。wWdith和wDepth分别用来指定图像的宽度和高度。LocalFlag用来指定区域性数据,也就是具体一幅图像的属性。LocalFlag的总长度为一个字节,其中的前三位用来指定局部调色板的位数,可以根据该值来计算局部调色板的大小。第4位到第5位为保留位,没有使用,其值固定为0。第6位指明局部调色板中的RGB颜色值是否经过排序,其值为1表示调色板中的RGB颜色值是按照其使用率从高到底的次序进行排序。第7位表示GIF图像是否以交错方式存储,其取值为1表示以交错的方式进行存储。当图像是按照交错方式存储时,其图像数据的处理可以分为4个阶段:第一阶段从第0行开始,每次间隔8行进行处理;第二阶段从第4行开始,每次间隔8行进行处理;第三阶段从第2行开始,每次间隔4行进行处理;第四阶段从第1行开始,每次间隔2行进行处理,这样当完成第一阶段时就可以看到图像的概貌,当处理完第二阶段时,图像会变得清晰一些;当处理完第三阶段时,图像处理完成一半,清晰效果也进一步增强,当完成第四阶段,图像处理完毕,显示出完整清晰的整幅图像。以交错方式存储是GIF文件格式的一个重要的特点,也是GIF文件格式的一个重要的优点。以交错方式存储的图像的好处就是无需将整个图像文件解压完成就可以看到图像的概貌,这样可以减少用户的等待时间。第8位指明GIF图像是否含有局部调色板,如果含有局部调色板,则局部调色板的内容应当紧跟在图像描述块的后面。
4. 图像压缩数据
图像压缩数据是按照GIF-LZW压缩编码后存储于图像压缩数据块中的。GIF-LZW编码是一种经过改良的LZW编码方式,它是一种无损压缩的编码方法。GIF-LZW编码方法是将原始数据中的重复字符串建立一个字符串表,然后用该重复字符串在字符串表中的索引来替代原始数据以达到压缩的目的。由于GIF-LZW压缩编码的需要,必须首先存储GIF-LZW的最小编码长度以供解码程序使用,然后再存储编码后的图像数据。编码后的图像数据是一个个数据子块的方式存储的,每个数据子块的最大长度为256字节。数据子块的第一个字节指定该数据子块的长度,接下来的数据为数据子块的内容。如果某个数据子块的第一个字节数值为0,即该数据子块中没有包含任何有用数据,则该子块称为块终结符,用来标识数据子块到此结束。
5. 图像控制扩充块
图像控制扩充块是可选的,只应用于89a版本,它描述了与图像控制相关的参数。一般情况下,图像控制扩充块位于一个图像块(包括图像标识符、局部颜色列表和图像数据)或文本扩展块的前面,用来控制跟在它后面的第一个图像(或文本)的渲染(Render)形式,组成结构如下:
typedef struct gifcontrol
{
BYTE byBlockSize;
struct flag
{
BYTE Transparency   : 1;
BYTE UserInput      : 1;
BYTE DisposalMethod : 3;
BYTE Reserved       : 3;
} Flag;
WORD wDelayTime;
BYTE byTransparencyIndex;
BYTE byTerminator;
} GIFCONTROL;
其中,byBlockSize用来指定该图像控制扩充块的长度,其取值固定为4。Flag用来描述图像控制相关数据,它的长度为1个字节。它的第0位用来指定图像中是否具有透明性的颜色,如果该位为1,这表明图像中某种颜色具有透明性,该颜色由参数byTransparencyIndex指定。第一位用来判断在显示一幅图像后,是否需要用户输入后再进行下一个动作。如果该位为1,则表示应用程序在进行下一个动作之前需要用户输入。第2-4位用来指定图像显示后的处理方式,当该值为0时,表示没有指定任何处理方式;当该值为1时,表明不进行任何处理动作;当该值为2时,表明图像显示后以背景色擦去;当该值为3时,表明图像显示后恢复原先的背景图像。第5-7位为保留位,没有任何含义,固定为0。wDelayTime用来指定应用程序进行下一步操作之前延迟的时间,单位为0.01秒。如果Flag.UserInput和wDelayTime都设定了,则以先发者为主,如果没有到指定的延迟时间即有用户输入,则应用程序直接进行下一步操作。如果到达延迟时间后还没有用户输入,应用程序也直接进入下一步操作。byTransparenceIndex用来指定图像中透明色的颜色索引,指定的透明色将不在显示设备上显示。byTerminator为块终结符,其值固定为0。
6. 图像说明扩充块
图像说明扩充块又可以称为图像文本扩展块,它用来绘制一个简单的文本图像,这一部分由用来绘制的纯文本数据(7位的 ASCII字符)和控制绘制的参数等组成。绘制文本借助于一个文本框(Text Grid)来定义边界,在文本框中划分多个单元格,每个字符占用一个单元,绘制时按从左到右、从上到下的顺序依次进行,直到最后一个字符或者占满整个文本框(之后的字符将被忽略,因此定义文本框的大小时应该注意到是否可以容纳整个文本),绘制文本的颜色使用全局颜色列表,没有则可以使用一个已经保存的前一个颜色列表。另外,图形文本扩展块也属于图形块(Graphic Rendering Block),可以在它前面定义图形控制扩展对它的表现形式进一步修改。图像说明扩充块的组成:
typedef struct gifplaintext
{
BYTE byBlockSize;
WORD wTextGridLeft;
WORD wTextGridTop;
WORD wTextGridWidth;
WORD wTextGridDepth;
BYTE byCharCellWidth;
BYTE byCharCellDepth;
BYTE byForeColorIndex;
BYTE byBackColorIndex;
} GIFPLAINTEXT;
其中,byBlockSize用来指定该图像扩充块的长度,其取值固定为13。wTextGridLeft用来指定文字显示方格相对于逻辑屏幕左上角的X坐标(以像素为单位)。wTextGridTop用来指定文字显示方格相对于逻辑屏幕左上角的Y坐标。wTextGridWidth用来指定文字显示方格的宽度。wTextGridDepth用来指定文字显示方格的高度。byCharCellWidth用来指定字符的宽度,byCharCellDepth用来指定字符的高度。byForeColorIndex用来指定字符的前景色,byBackColorIndex用来指定字符的背景色。
7. 图像注释扩充块
图像注释扩充块包含了图像的文字注释说明,可以用来记录图形、版权、描述等任何的非图形和控制的纯文本数据(7位的ASCII字符),注释扩展并不影响对图象数据流的处理,解码器完全可以忽略它。存放位置可以是数据流的任何地方,最好不要妨碍控制和数据块,推荐放在数据流的开始或结尾。在GIF中用识别码0xFF来判断一个扩充块是否为图像注释扩充块。图像注释扩充块中的数据子块个数不限,必须通过块终结符来判断该扩充块是否结束。
8. 应用程序扩充块
应用程序扩充块包含了制作该GIF图像文件的应用程序的信息,GIF中用识别码0xFF来判断一个扩充块是否为应用程序扩充块。它的结构定义如下:
typedef struct gifapplication
{
BYTE byBlockSize;
BYTE byIdentifier[8];
BYTE byAuthentication[3];
} GIFAPPLICATION;
其中,byBlockSize用来指定该应用程序扩充块的长度,其取值固定为12。byIdentifier用来指定应用程序名称。byAuthentication用来指定应用程序的识别码。
9. 文件结尾块
文件结尾块为GIF图像文件的最后一个字节,其取值固定为0x3B。

推荐(0)
收藏

Django日期格式化字符参考

2010-07-02 1:25

Format character Description Example output
a 'a.m.' or 'p.m.' (Note that this is slightly different than PHP's output, because this includes periods to match Associated Press style.) 'a.m.'
A 'AM' or 'PM'. 'AM'
b Month, textual, 3 letters, lowercase. 'jan'
B Not implemented.  
d Day of the month, 2 digits with leading zeros. '01' to '31'
D Day of the week, textual, 3 letters. 'Fri'
f Time, in 12-hour hours and minutes, with minutes left off if they're zero. Proprietary extension. '1', '1:30'
F Month, textual, long. 'January'
g Hour, 12-hour format without leading zeros. '1' to '12'
G Hour, 24-hour format without leading zeros. '0' to '23'
h Hour, 12-hour format. '01' to '12'
H Hour, 24-hour format. '00' to '23'
i Minutes. '00' to '59'
I Not implemented.  
j Day of the month without leading zeros. '1' to '31'
l Day of the week, textual, long. 'Friday'
L Boolean for whether it's a leap year. True or False
m Month, 2 digits with leading zeros. '01' to '12'
M Month, textual, 3 letters. 'Jan'
n Month without leading zeros. '1' to '12'
N Month abbreviation in Associated Press style. Proprietary extension. 'Jan.', 'Feb.', 'March', 'May'
O Difference to Greenwich time in hours. '+0200'
P Time, in 12-hour hours, minutes and 'a.m.'/'p.m.', with minutes left off if they're zero and the special-case strings 'midnight' and 'noon' if appropriate. Proprietary extension. '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
r RFC 2822 formatted date. 'Thu, 21 Dec 2000 16:01:07 +0200'
s Seconds, 2 digits with leading zeros. '00' to '59'
S English ordinal suffix for day of the month, 2 characters. 'st', 'nd', 'rd' or 'th'
t Number of days in the given month. 28 to 31
T Time zone of this machine. 'EST', 'MDT'
U Not implemented.  
w Day of the week, digits without leading zeros. '0' (Sunday) to '6' (Saturday)
W ISO-8601 week number of year, with weeks starting on Monday. 1, 53
y Year, 2 digits. '99'
Y Year, 4 digits. '1999'
z Day of the year. 0 to 365
Z Time zone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. -43200 to 43200
推荐(0)
收藏