CSK.Blog--个人原创Weblog

状态汇报

好就没有更新blog了。下面先说下最近在做的事情

2006.12.? - 2007.1.23 考试阶段,何时开始已经不知道了

最近的事情:Flash 网站,PrototypeA 计划

已经拖了很久了,让一切在这个寒假做个了结吧,下一篇文章发布之日,也就是flash site v2发布之时。

plez waiting...

==================

P.S. PrototypeA includes:

PAQ7,8 研究

PE shell研究

汇编优化研究

高等图形算法

音频合成器编写,打算仿造FL4的3x osc

应该能猜到这个plan的内容了,不说下去了

MMX指令优化的32bit AlphaBlend

前一段时间再进行一个目前保密的项目:Prototype A (哈哈,知道的人不要说阿)

其中需要较高的运行效率,所以就写了一个将32bit位图渲染到目标32bit位图的AlphaBlend。支持Alpha通道。

代码指令参照了http://dev.gameres.com/Program/Visual/2D/mmxaddalpha.htm提供的代码,在此表示感谢。由于第一次写汇编优化。所以不知道这样写是不是最高效的。

如果对位深没有要求,可以采用intel提供的16bit的alphablend,网上很多了,这个号称是目前最快的.

参数:

pDest:目标渲染buffer,32bit的,通道情况:ARGB

wlined:pDest的扫描线宽(即横向的像素个数,即实际宽度/4)

hlined:pDest的扫描线行数,可以理解成实际高度

startX:pDest的开始坐标X

startY:pDest的开始坐标Y,采用倒置坐标系

pSrc:要渲染得图片,通道情况:ARGB

wlines,hlines和前面类似

Alpha:对pSrc做得整体alphaBlend,0-255级

返回:

如果图片得到渲染,返回TRUE

用在Prototype A中效果还好,采用GDI渲染一个100*100的图片可以有1000fps*

代码:

BOOL AlphaBlt(BYTE *pDest,DWORD wlined,DWORD hlined,int startX,int startY,BYTE *pSrc,DWORD wlines,DWORD hlines,DWORD Alpha)
{
 int Xd,Yd,Xs=0,Ys=0;
 int loopH,loopW;
 if (startX>=(int)wlined) return FALSE;
 if (startY>=(int)hlined) return FALSE;
 
 if (startX + (int)wlines <=0) return FALSE;
 if (startY + (int)hlines <=0) return FALSE;
 
 Xd = startX;
 Yd = startY;
 loopW = (startX + wlines);
 loopH = (startY + hlines);
 if (loopH>hlined) loopH = hlined;
 if (loopW>wlined) loopW = wlined;
 if (startX<0)
 {
  Xd = 0;
  Xs = -startX;
 }
 if (startY<0)
 {
  Yd = 0;
  Ys = -startY; 
 }
 
 DWORD factorA = hlines-Ys+Yd-1;
 for (DWORD j= Yd ; j< loopH ; j++)
 {
  DWORD dwOffSrc,dwOffDest;
  dwOffSrc = (factorA-j)*wlines;
  
  dwOffDest = (hlined-j-1)*wlined;
  DWORD srcPosX = Xs;
  for (DWORD i = Xd ; i< loopW ; i++)
  {
  
   BYTE *BufSrc = pSrc + (dwOffSrc + srcPosX)*4;
   DWORD dwSrc =((DWORD)BufSrc[3] << 24) |((DWORD)BufSrc[2] << 16) | ((WORD)BufSrc[1] << 8) | (BufSrc[0]);
   DWORD *dwpDest = (DWORD *)pDest + dwOffDest + i;
    __asm{
     pxor mm2,mm2

     mov edx,dwpDest
     movd mm0,[edx]
     movd mm1,dwSrc
     punpcklbw mm0,mm2
     punpcklbw mm1,mm2

     movq mm3,mm1
     punpckhwd mm3,mm3
     punpckhdq mm3,mm3

     movd mm4,Alpha

     punpcklwd mm4,mm4

     punpckldq mm4,mm4

     pmullw mm3,mm4 //Alpha * SrcAlpha
     psrlw mm3,8

     movq mm4,mm0

     movq mm5,mm1

     psubusw mm4,mm1

     psubusw mm5,mm0

     pmullw mm4,mm3

     pmullw mm5,mm3

     psrlw mm4,8

     psrlw mm5,8

     paddusw mm0,mm5

     psubusw mm0,mm4

     packuswb mm0,mm0


     movd [edx],mm0 //保存结果

     emms

   }


   srcPosX++;
  }
 }
 return TRUE;
}

写了个Tiger语言的IDE

编译大作业下周就要检查了,所以最近一直在完善它。不过我没时间去做真正的代码生成了,不过就目前做的东西总觉得太傻了些,所以今天集中精力写了下面这个东西:

功能和特点:
>源代码语法上色
>直接编译
>随意切换编译器
>产生图形化语法树(就是PrettyPrint)

IDE里面包括我写的tiger编译器,所以IDE可以直接运行,点击exec.bat即可
除了tiger编译器,我把IDE的所有原代码都放在一起了。 也可以把你写的编译器用于本IDE,而且不用修改任何代码也不用重新编译,只要把你编译
器的类路径放在本IDE目录下的配置文件里面,详见readme IDE会把Sytem.out.printf这类的输出,即stdout和stderr显示在ide环境里面,好比是cl
和vc ide关系

写的很匆忙,有bug多多包涵~

校内
ftp://Great_csk:public@public.sjtu.edu.cn/public-files/TigerBoxv1_csk.rar
校外:
http://www.csksoft.net/data/legacyftp/Products/APP/TigerBoxv1_csk.rar

Blog防止spam信息技巧

自从把我blog迁至专用服务器上,访问率不断提升,但同时增加的是烦人的垃圾广告,常称为spam信息。

就blog而言,这类信息主要通过2种途径传播

1.留言、评论信息

2.引用信息

其中,第一种是最直观的spam传播方式,也是比较常见的,至于第二种,利用文章的trackback来做spam,这不禁令我赞叹人类智慧的伟大!

和垃圾邮件一样,目前自然语言处理还没达到一定的高度,自然没有什么很有效的办法杜绝这类信息。不过作为一个站长,看着这些恶心的东西贴在自己网站上实在是受不了。

为此我最早采取的方式是关键字过滤,但防不胜防...最后发展出下面2招,供各位参考:

对付评论:

思想:由于一般spam是推销产品、网站为目的,其中自然少不了链接与网址,不过链接标签不是必要的,但网址(严格说是URL)一般是必须的。所以突破口就在其中。

方案:对于留言作关键字过滤,将"http://"作为关键词,如果发现有这个关键词,则禁止发送留言。这样基本上就不会有第一类spam干扰你了。

对付引用:

要知道,既然是trackback,那么url是必须的,而且自动会加上链接...这也是那些spamer的狡诈之处,上面的办法自然是无效了

不过也有解决之道(不讨论关闭trackback的方案):

1.只有本blog注册用户才能获取trackback地址

好处:可以比较有效杜绝此类spam,缺点:并不是人人都愿意为了做个处于良心(至少国人不大愿意作trackback的,可能我有些偏见)的trackback特地来你这注册

2.动态生成trackback地址

我之前在网上看过具体例子,大家可以找下,那人提供方法的。

实现起来比较复杂,为了做到每次产生的地址不同,要做很复杂的后台跟踪,而且网上有人实现的方案是一个trackback地址在24小时后自动失效...

这招绝对很有效,不过我实在没这个功夫..

3.作trackback地址变换

此话怎讲?下面我来分析下spam的特点:

不要以为那些发送spam的人有很好的耐心给你blog每篇文章手工去发那些trackpost。他们一般都使用外面流行的spam群发工具。

我没有具体研究过,如果要我编写,一般会遵循这个原则:

一般trackback地址的格式为http://xxxblog.xx.com/trackback.asp?id=xxx&....

是不是这样?在那个trackback.asp后面跟的querystring里面一般总会含有id这类的信息的,这是必须的,因为blog要知道是对哪篇文章作了trackback。

好,现在我们要做群发软件,所谓群发,就是一次性给一个blog发很多有效的spam,这自然不可能要发送者去提供每个页面的trackback地址了,往往软件会找出每篇trackback地址的规律:

太简单不过了,因为一般id就是一个数字,而且文章id都是连续的,那么直接循环发送就好了,比如:

for (int id=0;id<maxid;id++)

{

CString url;

url.Format("http://xxxblog.xx.com/trackback.asp?id=%d",id);

sendspam(url);

}

所以我们的突破口就是在把这个id值变成不能用上述代码枚举的形式

这里介绍我目前采用的办法:把每个数字用对应的罗马字表示:

1->I ,2 -> II , 6 -> VI 等

这样,诸如id=53的形式可以变换到:id=V,III

现在我们考虑上面算法,虽然要写一个枚举这样id的程序实在很容易,但spam群发器的作者不会就为了这个情况特地去写这个算法吧。

而且对自己来说实现起来也很容易。

还有可以把数字用大写中文表示,或者英文,哈哈,就看各位想象了!

这个办法虽然不能绝对防止spam发作,但要知道在这个浮躁的社会,那些spamer们自然不会有工夫去研究你的算法的...

分页:[«]1[»]

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)