Archive for the 程序开发 Category

Erlang中为什么变量不能变

Posted on 星期天, 三月 23rd, 2014 at 22:38

今天开始进行erlang的学习,第一关遇到的是,erlang的变量是不可变的,记录一下我的理解
1、变量其实不是变量,只是一个值的标示而已。所以,他不能变,或者说一旦赋值(绑定)即不能变化
2、此变量不变的特性,决定了erlang在并发的时候可以不用考虑锁,抢占资源的问题。

支持长文章翻译的Google翻译PHP类

Posted on 星期二, 六月 1st, 2010 at 00:30

最近准备批量翻译大批文章,发现Google提供的API有长度限制,很是不爽,而Google自己的translate.google.com确没有这个限制,
于是就决定自己做一个东西,直接调用translate.google.com翻译。

$this->snoopy->referer=”http://translate.google.com/“;
$submit_url = “http://translate.google.com/“;
$submit_vars["eotf"] = “1″;
$submit_vars["file"] = “”;
$submit_vars["hl"] = “zh_CN”; 
$submit_vars["ie"] = “UTF-8″;
$submit_vars["js"] = “y”;
$submit_vars["layout"] = “1″;
$submit_vars["prev"] = “_t”;
$submit_vars["sl"] = $sourcell;
$submit_vars["text"] = self::singleline($fromtxt);
$submit_vars["tl"] = $tol;
$this->snoopy->submit($submit_url,$submit_vars);
$content=($this->snoopy->results);
$content=self::findResult($content);
$content=strip_tags($content,”");

我采用了Snoopy作为访问类。这也是我第一次用Snoopy,这个类非常好用,值得推荐。
以下是部分代码:

下载GoogleTranslation(rar)

Akismet是个好插件

Posted on 星期二, 三月 16th, 2010 at 20:20

就算是我这个小网站,每天也会遭受垃圾留言的困扰,去年12月份开始我开始试用这个叫做Akismet的插件,使用几个月来发现效果非常之好。
这个是他的拦击成果:
可以看到Ham detected就是判断错误的只有2个,误判率还是非常低的。
Akismet_pic1
下面是具体的拦截结果:
Akismet_pic2
这个插件本来是个标准的Wordpress插件,但是Akismet是个开放API 的平台,通过API可以开发出各个平台版本的拦截工具。现在问世的好像就有z-Blog,discuz……常见web平台。非常值得一用。

使用Gzip压缩ASP.Net的ViewState节省服务器带宽

Posted on 星期六, 一月 23rd, 2010 at 21:47

ASP.NET中ViewSate是个非常重要的东西,但是有时候页面有大量数据或对象放在ViewSate的时候,会使得页面的输出非常庞大。可能页面本身没有显示多少内容,但是真个源代码却非常臃肿,导致下载速度非常慢,如果是按流量计费的网络,这就非常不可取了,这个时候如果可以压缩一下就改好了。.NET提供了一个非常好用的压缩组件-GZip
先介绍两个方法:
LoadPageStateFromPersistenceMedium()
SavePageStateToPersistenceMedium(object viewState)
这是System.Web.UI.Page的两个virtual方法,LoadPageStateFromPersistenceMedium()是调用客户端提交过来的ViewState的方法,SavePageStateToPersistenceMedium(object viewState)是想客户端送出ViewState的方法,通过重写这两个方法即可实现对ViewState的操作了。

建立一个PageEx类继承自System.Web.UI.Page就可以重写这两个方法了。

接下来就是Gzip的压缩和解压方法实现了。现在.NET Framework已经自带了一个Gzip 类:System.IO.Compression.GZipStream

具体用法也很简单:
以下是压缩方法:
public byte[] CompressData(byte[] data)
        {
            MemoryStream output = new MemoryStream();
            GZipStream gzip = new GZipStream(output,
                              CompressionMode.Compress, true);
            gzip.Write(data, 0, data.Length);
            gzip.Close();
            return output.ToArray();
        }

 以下是解压方法:
        public byte[] DecompressData(byte[] data)
        {
            MemoryStream input = new MemoryStream();
            input.Write(data, 0, data.Length);
            input.Position = 0;
            GZipStream gzip = new GZipStream(input,
                              CompressionMode.Decompress, true);
            MemoryStream output = new MemoryStream();
            byte[] buff = new byte[64];
            int read = -1;
            read = gzip.Read(buff, 0, buff.Length);
            while (read > 0)
            {
                output.Write(buff, 0, read);
                read = gzip.Read(buff, 0, buff.Length);
            }
            gzip.Close();
            return output.ToArray();
        }
 
完整PageEx类如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO.Compression;
using System.IO;
 
namespace Test
{
    public class PageEx:System.Web.UI.Page
    { 
//压缩方法       
public byte[] CompressData(byte[] data)
        {
            MemoryStream output = new MemoryStream();
            GZipStream gzip = new GZipStream(output,
                              CompressionMode.Compress, true);
            gzip.Write(data, 0, data.Length);
            gzip.Close();
            return output.ToArray();
        }
//解压方法 
        public byte[] DecompressData(byte[] data)
        {
            MemoryStream input = new MemoryStream();
            input.Write(data, 0, data.Length);
            input.Position = 0;
            GZipStream gzip = new GZipStream(input,
                              CompressionMode.Decompress, true);
            MemoryStream output = new MemoryStream();
            byte[] buff = new byte[64];
            int read = -1;
            read = gzip.Read(buff, 0, buff.Length);
            while (read > 0)
            {
                output.Write(buff, 0, read);
                read = gzip.Read(buff, 0, buff.Length);
            }
            gzip.Close();
            return output.ToArray();
        }
 
   //重写调用ViewSate的方法    
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string viewState = Request.Form["__VSTATE_EXT"];
            byte[] bytes = Convert.FromBase64String(viewState);
            bytes = DecompressData(bytes);
            LosFormatter formatter = new LosFormatter();
            return formatter.Deserialize(Convert.ToBase64String(bytes));  //将解码后的ViewSate返回
        }
 //重写写入ViewSate的方法
        protected override void SavePageStateToPersistenceMedium(object viewState)
        {
            LosFormatter formatter = new LosFormatter();
            StringWriter writer = new StringWriter();
            formatter.Serialize(writer, viewState);
            string viewStateString = writer.ToString();
            byte[] bytes = Convert.FromBase64String(viewStateString);
            bytes = CompressData(bytes);
            ClientScript.RegisterHiddenField(”__VSTATE_EXT”, Convert.ToBase64String(bytes));//将解码后的ViewSate送入客户端
        }
 
    }
}
 
最后就是最重要的一步,就是要把新建的页面的默认的继承对象System.Web.UI.Page,改成PageEx。
如:
public partial class index: PageEx
{
……
}

SQL Server2005的limit来了

Posted on 星期六, 七月 11th, 2009 at 22:15

用SQL Server2000的时候一直郁闷,SQL Server怎么就没有个和MySQL的一样的limit语句呢,这个给我们实现分页带来了极大的麻烦,当时为了实现分页,用上了TOP,Order BY等等翻转了好多次。

SQL Server 2005早就发布,今天再次想到这个问题,去网上寻找,有变化,SQL Sever2005 多了个row_number()函数,顾名思义就是行号,这个有点和Oracle中的rownum非常的像,不过SQL Server2005必须制定排序方式,
有了这个函数,分页就简单多了。

具体用法如下:

SELECT row_number() OVER(ORDER BY addtime), * FROM myTable

分页:
SELECT * FROM (SELECT row_number() OVER(ORDER BY addtime) AS rownum, * FROM myTable) AS a WHERE a.rownum BETWEEN 20 AND 25

Delphi+Flash制作桌面宠物

Posted on 星期三, 六月 20th, 2007 at 17:14

Delphi+Flash制作桌面宠物

大家都玩过QQ宠物吧。可爱的小企鹅在桌面上栩栩如生。我们应该怎么去实现这种效果呢?
不难发现。QQ宠物的所有动作都是由Flash制作而成的。
利用Flash制作动画,简单,灵活。
用Delphi播放flash不难。用FlashPlayer的ActiveX就可以了。
这个只要装了flash播放器的都会有。
当我们把flash播放起来后发现。问题来了。flash的背景很难去掉。这可离我们的目标很远。

1.首先想到的Delphi自带的TransparentColor+TransparentColorValue属性。
测试后发现无效,无论怎么去设置颜色。窗口是被雕去了,但是flash的背景却纹丝不动。
该方法失败。

2.再又想到了一个歪招。用TWebbrowser+Html+flash实现。
在网页中我们可以很简单的使用wmode=transparent实现flash透明。
先制作一个网页。用CSS设置好边框,去掉滚动条。插入flash,加上wmode=transparent。
flash在网页中已经显示透明,保存为flash.htm
然后再TWebbrowser.Navigate(""flash.htm"");
启动程序。达到效果!
这个方法有些缺点。最大的问题是。整个flash全部跑到网页里去了。
程序控制起来,获取状态都是大问题。
放弃改做法。

3.最后一招也是最有效的一招,采用了Player Activex的一个重要方法:PaintTo该方法的作用是将
Player中的当前画面Paint到一个Canvas上。

  拖一个TShockwaveFlash到Form上名为SWFSource
  设置SWFSource.BGColor:=’B4945F’;
  并且和Form的背景颜色相同。
  设置TransparentColor+TransparentColorValue

  定义变量:Buffer:TBitmap;
  初始化Buffer
  Buffer               :=   TBitmap.Create;
  Buffer.Width         :=   SWFSource.Width;
  Buffer.Height        :=   SWFSource.Height;
  Buffer.PixelFormat   :=   pf24bit;         //非常重要。这也是设置buffer的目的

  在窗体上放置一个Timmer,在OnTimmer事件中
  Canvas.Draw(0,0,Buffer);                  //将Buffer画到Form的Canvas上
  SWFSource.PaintTo(Buffer.Canvas,0,0);     //将Player中的当前画面Paint到一个Buffer.Canvas上

  设置TShockwaveFlash播放动画。
 

这种方式显示的效果非常好。不过有时会有明显的锯齿。有个勉强的解决方法就是设置flash的背景为中性色。
比如银灰色。这样会不太明显。
 

js文件的编码问题

Posted on 星期二, 六月 19th, 2007 at 21:15

js文件的编码问题

宿主页面采用的utf-8编码,引用了一个里面含中文的js文件后乱码。折腾好几编码换来换取也没成功。

在网路上寻得良方如下:

<script src="/XX.js" type="text/javascript" charset="GB2312"></script>

这样设置后一切正常。

实现图片,文本下载的方法。

Posted on 星期五, 九月 8th, 2006 at 16:37

以往我们实现文件下载的方法都是直接链接到文件,可是有些时候不成功,这就是当浏览器遇到认识的文件的时候会把他自动打开。
这个时候除了用右键另存为方法外其实还有一个方法可以实现弹出对话框下载,
以下为ASP代码:
filepath为文件路径
<%
filepath="test.pdf"
if Instr(filepath,"/")>0 then
filename=right(filepath,InstrRev(filepath,"/"))
else
filename=filepath
end if
Response.ContentType="xxx"
Response.AddHeader "content-disposition", "attachment;filename="&filename
Server.Transfer(filepath)
%>
原理是这样的:
Response.ContentType为指定输出到浏览器端的文件类型,如果我们指定了一个不存在的类型,浏览器就会不认识了,这样下载对话框就自动出来了

Access中Top语句失效问题的解决方法。

Posted on 星期四, 六月 8th, 2006 at 15:58

再使用Access的时候,经常会遇到Top语句在使用Order by  的时候失效的问题。
比如如下表结构
Message(ID 文本 主键,Title 文本,Content 备注,Addtime 时间日期)
这个时候如果
Select top 1 Title from Message order by Addtime desc 就不一定完全奏效了,当Addtime 中有重复值的时候,他就会有几个出来几个。

翻遍 了整个Google终于找到了问题的关键:
JET SQL不是 T-SQL语句。
jet sql 会返回重复值,也就是说,一个表中如果 ORDER BY 的字段都是 0 ,一共有100条记录,即使你用SELECT TOP 1 来返回记录,也同样返回100条记录,因为 JET DB 无从在这100条记录里面判断先后次序,只能返回100条。要解决此问题可以在后面加入一个主键字段

解决方法:
Select top 1 Title from Message order by Addtime desc ,ID desc

如何正确使用class和id,有意思的文章(转载)

Posted on 星期五, 五月 26th, 2006 at 09:35

最近研究Web标准,对于何时实用class何时实用id老拿不准,

今天看到两个有意思的比喻,很精妙,也许可以使你会心一笑。
===============第一条=============================
简单的比喻
一个学校(好比一个页面)
高二三班(好比一个 block 区块,碰巧也有个类 class=""s23"")
学生 POPO(好比一个对象,id=""POPO"")
白衬衫(好比一个类, class=""whiteshirt"")
那么学校里穿白衬衫的学生可以有很多(好比页面上可以有很多相同的 class)
你(好比 Javascript 的一个 function() 函数)
到学校来找 POPO(脚本来找对象了)
如果你跟老师说找一个穿白衬衫的,老师会给你一堆穿白衬衫的学生
所以你必须告诉老师,要找一个叫 POPO 的学生
明白了么

引自http://live.foosun.net/archives/2006/97.html

==================第二条===========================

ID需要具有唯一性,并且尽量在外围使用。而CLASS具有可重复性,并且尽量在结构内部使用。这样做的好处是有利于网站代码的后期维护与修改,这样的做法就会让所有的CLASS都成为ID的子级或是孙级。你可以有两个儿子但你能有两个爸爸吗?

http://iceshow.blog.sohu.com/2909097.html