2007年6月23日星期六

浏览器兼容的Web矢量图形脚本库

tags: svg vml firefox ie opera js

abstract: 未来的Web体验将超越现在的xhtml,主流浏览器内置对矢量图形的渲染是重要标志之一。

对手1: Flash
浏览器插件普及率高,对流媒体支持好,但
swf二进制格式使得他与Web工作流的整合相对困难,应用逻辑的更改可能需要rebuild
swf内容生产者多是美工,他们创作动画习惯使用引导线、蒙版和滤镜等工具,而不是script
对手2: WPF
支持DirectX,对权限管理控制的好,但
浏览器插件不普及,内容生产工具昂贵

不久svg vml的方案很可能会向Ajax一样被人炒作,因为他们有一些相通之处:
1、浏览器无插件地支持
不同浏览器的Web矢量图形容器在抽象层高度一致,
在Ajax实现层中,IE有xmlhttp的ActivX控件,Firefox和Opera有XMLHttpRequest对象;
在Web矢量图的实现层中,IE支持VML标签,通过样式v\:* { behavior: url(#default#VML);
}渲染,而firefox和opera中有type='image/svg+xml'的object标签
2、不是新技术,但创造了新体验
Ajax是脚本代替浏览器地址栏去http get/post,无刷新和异步操作带来良好的体验。
Web矢量图是svg和vml两种古老的图形标记语言,相信交互可视化也可以带来良好的体验。
3、基础工作:脚本库的开发
Ajax的脚本库层出不穷,以prototype为代表,开发人员不必关心Ajax的实现,只需要在抽象层上使用他即可,降低生产成本
Web矢量图的脚本库也能找到,Igor
Krupitsky的工作似乎并没有得到足够的重视,下面是他发布的脚本库。(笔者测试,需要修改一些代码才能使用,而且需要手动调整才能支持opera)http://www.1delphistreet.com/vb/scripts/ShowCode.asp?txtCodeId=5607&lngWId=2
google code上有一些工作已经走得更远,如果你感兴趣可以去google一下svgvml3d

想象一下,在js中new Polyline是什么感觉?而且不需要Flash或Java Applet小程序?

2007年6月21日星期四

王子午说,密钥和私钥是两个概念

中午冲凉出来,遇到王子午,对门儿的"the will-be expert on infomation
security",我问他,密钥和私钥是什么关系,他说,是两个概念……

前几天,我信誓旦旦要把QQ协议搞清楚,因为工作中需要做这样一件事,从头说起:
设A,B为两个QQ用户,身份认证方式都是"需要验证"。
今A向B提出加好友请求,消息经服务器中转给B,B收到后回复给服务器一条消息(outpacket a8),服务器收到outpacket
a8后四件事:1、在A的好友列表中添加B,2、在B的好友列表中添加A,3、通知A说B已经同意你的请求并且加你为好友了,4、返回给B一条消息(inpacket
a8)说你同意A为你的好友的操作完成了。
利用ethereal+lumaqq debugger工具,可以成功解密inpacket
a8,正文内容和lumaqq接口定义一致,这里解密用到了B登录时服务器返回的Session
Key。但是无法用这个会话密钥解密outpacket a8,虽然这才是我想要的。捕获到的outpacket
a8是用另一种方式加密的,可能是密钥不同,也可能是算法不同。
一旦成功解密outpacket a8,就可以从接口直接完成"同意加好友并反过来加请求者为好友"的操作了。

密码学很有用,要求数学功底很深。王子午同学在数论方面很强,去了中科院安全所,令我十分钦佩。我不打算研究加密算法,但是基本的密码学常识还是应该具备的……

2007年6月20日星期三

显示一棵数组存储的二叉树

void show(){
int width=(size-1)*2;
int lbsize=lb(size);
int i=1;
for(int l=0;l<lbsize+1;l++){
int num=pb(l);
space(pb(lbsize-l)-1);
for(int k=0;k<num;k++){
cout<<a[i++];
space(pb(lbsize-l+1)-1);
}
cout<<endl;
}
}

创建main.cpp的宏

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module RecordingModule


Sub TemporaryMacro()
DTE.ItemOperations.AddNewItem("Visual C++\C++ 文件(.cpp)", "main.cpp")
DTE.ActiveDocument.Selection.Text = "#include <>"
DTE.ActiveDocument.Selection.CharLeft()
DTE.ActiveDocument.Selection.Text = "iostream"
DTE.ActiveDocument.Selection.EndOfLine()
DTE.ActiveDocument.Selection.NewLine()
DTE.ActiveDocument.Selection.Text = "using namespace std;"
DTE.ActiveDocument.Selection.NewLine(2)
DTE.ActiveDocument.Selection.Text = "void main(){}"
DTE.ActiveDocument.Selection.CharLeft()
DTE.ActiveDocument.Selection.NewLine(2)
DTE.ActiveDocument.Selection.LineUp()
DTE.ActiveDocument.Selection.Indent()
DTE.ActiveDocument.Selection.Text = "getchar();"
End Sub
End Module

2007年6月13日星期三

svn起步

参考http://www.phpchina.com/?1703/action_viewspace_itemid_2036.html
1、安装服务器端
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
URL http://subversion.tigris.org/files/documents/15/36797/svn-1.4.3-setup.exe
安装shell客户端
http://tortoisesvn.net/downloads
URL http://easynews.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.4.3.8645-win32-svn-1.4.3.msi
2、服务器
创建仓库
svnadmin create D:\repository\subversion\multiring
在D:\repository\subversion\multiring\conf
根配置svnserve.conf,取消注释
账户配置passwd,添加账户
开启服务
svnserve -d -r D:\repository\subversion

3、客户端
到原来的工程的文件夹,import
到工作同步路径,checkout
修改后,commite
别人动过,我准备继续工作,在工作同步路径下update

2007年6月10日星期日

[zz]关于打开水的数学模型

 
 

Sent to you by 王元涛 via Google Reader:

 
 

关于打开水的数学模型

via aleck胡乱写... by aleck on Jun 01, 2007

不要说我变态,我先承认并自罚三杯,然后大家心平气和的听我讲述这个"打开水的数学模型"。

背景:紫荆9#楼一共六层,居住者数学系、物理系及其杂交的数理基科班学生数百人,其中平方数层(1、4)的水房有洗衣机,素数层(2、3、5)的水房有纯净水,当然,我们注意到6不是平方数也不是素数,所以在水仙花数层(6)什么都没有。看来主办方也很了解大家的劣根性,在安排布置上都显示出独特用心。故事就从次开始。

模型构造:本宿舍一共有3个开水壶,打开水的时候通常到4层水房。
水房的开水机比较独特,有两个出水口记为O1、O2,出水口单位时间的流量为F1和F2。开水机计费是按照时间来计的,两个口的单位时间费用相同,都为C分钱/秒。由于是机械操作,开关开水机的时候会有一定时间的误差,在这段误差内流量慢慢减小为零。开关是红外遥感开关,因此一旦发出停水信号就会停止计费,此时水不会立即停止,而是会慢慢减少到零。多流出来的一部分两个口子分别为R1和R2。计费最小单位是分。
目前已知F1<F2,R1=R2,如何构造最优打水方案。

模型求解
首先,出水口O1被完全抛弃,原因是大家都不是傻子,在O1打满一壶要0.30元,而在O2只需要0.17元。
其次,出水口02的使用方法值得推敲。
平时使用,一次性加满一壶水需要在计费到0.17元的时候关开关,此时流出来的水会刚好打满一壶。一壶水的容量为L=0.17/M*F1+R1,其中M为某常量,量纲是[价格]/[时间]。我们发现,机器有自动保护功能,打开开关之后至少需要0.04/M的时间才能关闭。以此为基础假定每次花费x的钱可以达到最大效益,有如下约束:

min T
s.t T/x * R1 + T/M*F1 >= L
x >= 0.04

求解可知x=0.04时就是最优解。

模型检验
最优方案构造:每次打开开关,放到0.04元将要变成(又没变)0.05的一瞬间,将开关关闭,此时会有一部分多余的水流出来,等流完了再重新开始。实践发现这样的方法只需要0.12元即可几乎打满,比原来的0.17甚至0.30分别降低了约30%和60%,极大限度的产生了经济效益。

模型不足
没有考虑时间效益,按上面方法操作会导致大水时间大大延长,但对于大四百般无聊的生活来说,也不失为一种调节。
没有考虑楼长的脾气,这样玩弄开水机可能会让她老人家发疯掉。

结论
1、学数学还是有用的;
2、要用知识武装自己;
3、做人要厚道;

 
 

Things you can do from here: