给用户最大的便利

0000-00-00 00:00:00

中国的网民低端的占大多数,他们不懂英文,不知道I agree 是同意,也就当然不会装英文软件,他们对运行环境也没有概念,这也是为什么java软件在中国不流行的原因。现在我们用和java类似的flex来写一些客户端的程序,这样,如何让用户便利的安装就成了重要的问题。

    首先第一点,我们的安装程序必须打包运行环境,回想java,多少用户对.class或者.jar不知所措,或者懂一点电脑的,幸苦去下载java运行环境,却又不知道classpath是怎么回是,最终的结果就是用户气急败坏,大骂软件是垃圾。。

     然后就是安装运行环境时必须辅助用户点击 类似I agree 或者finish 之类的英文,就如同safe360帮助用户安装漏洞补丁一样,下面是最简单的实现代码:命令行传入安装air运行环境可执行程序的路径,然后运行这个程序,激活窗口,按3下tab,按一下回车,这里面所有的值参数等,都是通过spy++,侦测安装窗口实际鼠标键盘事件得到的, 也许有人看到会觉得有用,
 

#include "windows.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPTSTR    lpCmdLine,
               
int       nCmdShow)
{
    STARTUPINFO 
si;
    memset((
void *)&si,0,sizeof(STARTUPINFO));  
    si.cb = 
sizeof(STARTUPINFO); 
    PROCESS_INFORMATION pi;

    
if( !CreateProcess(lpCmdLine,    NULL, NULL, NULL, NULL,NULL,NULL, NULL,&si,&pi) )
    {
        
LONG LErr=GetLastError();//返回0.  
        
return LErr;
    }


    HWND hWnd=FindWindow(NULL,
"Adobe AIR Setup");
    
while(!hWnd)
    {
        hWnd=FindWindow(NULL,
"Adobe AIR Setup");
        Sleep(1000);
    }
    SendMessage(hWnd,WM_SETFOCUS,0,0); 
    SendMessage(hWnd,WM_ACTIVATE,1,0); 

    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

    SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001); 
    SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);

    
return 0;
}

    

回复(0)

给cookie设置 httponly

0000-00-00 00:00:00

设置cookie时 使用httponly 参数 ,可以防止恶意用户通过js,从document.cookie中窃取他人cookie

回复(0)

美女

2008-02-13 00:00:00

美女多半只能远观。

有得必有失,美女一般不聪明。

据称管智力的基因在x染色体上,男女x染色体个数比是1:2 ,娶了美女以后多半孩子不聪明。

邓肯和萧伯纳的故事怎么说来着的。

女星则是美女中的美女,也多半是愚蠢中的愚蠢,女星嫁入豪门,孩子不聪明,这是内因,再说母亲

是孩子的第一任老师,这第一任走不好,以后要纠正很难,内外结合,简直是毁人子孙。

可惜了,香港的金融家们,可惜了,香港的建筑师们 。

 

回复(0)

随便写点

0000-00-00 00:00:00

为什么写程序,首先它是一个创造的过程,创造本身就会给人带来无穷的乐趣,其次就是这个过程只有很小的外部依赖,你所需要的仅是一台电脑,然后想法就能直接变成实实在在的产物,能够变大小变颜色变粗细的东西就可以在屏幕上动来动去了,其实前面说的都是废话,最关键一点,这的东西还可以卖钱。

      既然写程序是一个创造的过程,那么里面最重要的部分就是创意和想法了,也就是设计和算法,这是我今天最想说的,比之于我们的想法,语言以及语言的细节真是非常次要的东西,c++之所以遭人病诟,还不是在于它那些并不重要的阴暗角落,即使是有十年经验的程序员,也未必将它模得很清楚,RTFM 为什么是F是fuck而不是fine ,大概就是这个原因吧。

      语言在发展,能用更高级语言的地方就应当用更高级的语言,比方说在能用python的地方,确偏用c,这一定是自找麻烦,既然能够用python,说明它不需要很高的效率,用c又有什么优势可以体现呢,并且随着分布式算法更广泛的应用,语言在执行速度方面的优势就越来越小了。下面我就打算把我们的ICE server 改造成用c++ 做底层,业务逻辑用脚本语言(也许会是javascript)来实现,做成类似web server 这样的模式。

      web application 里面出现大量的sql 说明他的设计是不好的。sql 是数据库对外的接口,并且它是可以将数据库整个暴露出来的接口,sql里包含数据库内部的描述,充斥大量sql的web application必然强烈依赖数据库的内部结构,这是其一,其次,充斥大量sql的web application 必然没有良好的抽象 ,毕竟数据的存取 只是某种层面要干的活,其三,web application不能滥用数据库 ,在我看来web application是application 而不是数据库的简单映射,他的功能应该更强大 ,而不应该是简单的数据展现和写入 。

回复(0)

重新开始写blog

2007-12-30 08:25:33

2007到末尾了,也许是今年没有做什么里程碑式事情,觉得时间过得很快,看cctv世界周刊回顾2007,忽然就有写blog的冲动。


今年我做了什么呢?首先写了一个.net思想的php框架  页面是由组件构成的,比如说list pager form element var .
list就是一段需要重复输出的东西,比如一个文章列表,pager就是分页的,element是嵌子页面用的 ,var就是输出一段html ,像下面 article.html 这样


<html>
<body>
<list name="article_list" count="10"></list>
<pager name="list_pager" target="List_article_list"></pager>
<form name="leave_comment"><input/></form>
<element src="xx.html"></element>
</body>
</html>


然后通过简单的编译,生成article.html.php文件,里面是这些组件所对应的类,自动生成以下代码:
<?php
class List_article_list extends List
{
    public $count = '10';
   function OutPut(){
    }
}
。。。其他的类省略。。。。。。。


 OutPut是控制这个组件的输出,里面填写自己的php代码:
function OutPut()
{
    Using('classes.article');
    $data = Article::GetByPage($this->start,$this->count);
    foreach($data as $d)
    {
        echo "<li>$d['title']  <a href='".$this->On('delete',$d['id'])."'>删除</a></li>";
    }  
}
在这个框架里,OutPut可以和cache 绑定,比如memcache,OutPut代码在缓存失效前 只执行一次。
注意上面的删除功能,点击删除 就能通过页面请求,执行当前这个类的  delete函数并传递参数 id:

<?php

class List_article_list extends List

{

    public $count = '10';

    function OutPut(){

        ..代码省略。。

    }

    function delete($id)

    {

        ..删除文章的代码。。

    }

}

 其他的组件都是类似的,form组件有个OnSubmit函数,用来填写表单提交以后的处理代码。
还有就是组件和组件之间可以相互传递数据,相互调用比如 pager就自动给他target所指定的组件设置start变量,组件都可以单独的在页面上输出,可以以ajax的形式填充在页面里。


其 实写这个框架的出发点,是对mvc view和controller的不满,v和c之间的主要接口是简单的变量(smarty,smarttemplate 作为view的框架),并且这个变量用起来还很复杂,先要assign变量给view,写view的时候说不定还忘记了变量的名字,再来回看,一个变量还 得写两遍(controller里面一个,view里面一个),真是让人受不了的耦合。mvc里面所有的动作都要以controller的形式出现:页面 请求,删除操作,表单提交,ajax请求等等,无数的controller,就像个垃圾堆。表单的显示和处理是耦合相当紧的东西,在mvc里面却要被分离 在不同的controller里,写代码时需要来回参照,痛苦无比。再有,页面的复用,比如莫个项目里有个留言框,需要在很多页面里用,那么mvc里就会 以view调用controller的形式出现(cakephp),这个用起来很不方便,至少我的感觉是这样,毕竟这种页面逻辑的分离与复用应该在做页面 的时候就定好(view),在我的项目组里,页面设计师用element 代替  <!-- virtual include -->,分离直接在页面时定好。
《《《未完 下次接着写

回复(0)

回答 初学dll的疑问

2006-07-30 08:34:43

初学dll的疑问

    由于工作原因,做的工作都是修改一些dll源代码,这个过程中有很多疑惑。具体如下:

    1.dll有存取数据的作用,但是它又是动态加载的,那么数据存在哪里呢?数据如何同步呢?
    2.好像有一些dll实时地监控某些变化,那么它最起码应该是一个线程吧,那到底是dll启动了一个线程,还是某个线程调用了dll,还是dll本身是一个线程?
    3.调用dll里定义的类和函数是如何进行的?
    看到了http://www.czvc.com/view.asp?id=304上隐隐约约有答案,但是没有完全读懂。

    dll 和exe本质上是一个东西,入口不一样,加载到内存中后都是一样的形式,可以称之为模块,都可以用GetModuleHandle得到模块基址。都可以用 GetProcAddress得到导出函数,因此,如同熟悉的exe一样,dll可以把数据放在数据段,被LoadLibrary加载到内存中后这些数据 就在自身模块的.data段里面,你可能还不明白,举一个例子来讲。
    当操作系统加载notepad.exe,操作系统会给他虚拟出一个4GB的线性地址空间,0x00000000-0xffffffff,前面,以及后面所 说的内存也就是这4GB的线性地址空间,具体这4GB怎么进行内存页面映射的我们不用管。不过这4GB也不是都可以用的,0x00000000- 0x7fffffff,这2GB才是notepad.exe的活动空间,后面的2GB是系统的内核模块部分,一些内核程序如ntoskrnl.exe, hal.dll,bootvid.dll,kdcom.dll,以及一系列的*.sys永久驻留在这里,他们为前面的2GB提供服务。操作系统加载 notepad.exe,一般会把它放在0x01000000,这就是模块notepad.exe的基址。
    加载以及初始化完毕后,主线程到notepad.exe的入口去执行,也就是平时写winmain的地方,编译器会把这个地方标记出来,加载到内存后这个 地址会被操作系统计算出来。执行了一坨代码后比如说notepad.exe想显示一个messagebox,那么他怎么办呢?
    显示messagebox的接口在c:\windows\system32\user32.dll 中,user32.dll导出函数MessageBoxA,供外部调用。要想调用他,先要加载user32.dll,但是怎么加载呢?要用 LoadLibrary这个函数,可是这个函数是那里来的呢?他是c:\windows\system32\kernel32.dll的导出函数,怎么加 载Kernel32.dll呢?显然不能用LoadLibrary,这是一个先有鸡还是先有蛋的问题。notepad.exe 会使用内核模块ntoskrnl.exe的导出函数LdrLoadDll,加载kernel32.dll,这样操作系统就会将kernel32.dll放 在0x00000000-0x7fffffff中某个恰当的位置,比如winxp sp2 为0x7c800000,不同的windwos版本会有所不同。这样kernel32.dll来到了内存,随之而来的有他的各种数据,函数,以及定位信 息。比如0x7c800000这里放的是kernel32.dll这个pe文件的文件头,这个头很重要,从他可以定位到kernel32.dll的导出 表,这个导出表记载了kernel32.dll所有导出函数(包括LoadLibraryA)的地址。导出函数是怎么来的呢?在VisualC++里面使 用__declspec(dllexport)关键字写在函数前,编译连接时,VisualC++就会把这个函数的偏移写在PE文件的导出表里,也就是这 里的kernel32.dll的导出表,加载的时候,操作系统根据偏移加基址,得到函数的绝对地址,重新填到内存中kernel32.dll模块的导入表 里。
    导入表的格式都是函数名=》地址的二元组,因此要找kernel32.dll中LoadLibraryA 的地址,就在kernel32.dll的导入表中搜索"LoadLibraryA"这个字符串,这样就将LoadLibraryA这个函数拿到了手,实际 上GetProcAddress就是这么做的。用同样的方法,就可以加载user32.dll,得到MessageBoxA的地址,不过这次就可以用 LoadLibraryA,和GetProcAddress这两个kernel32.dll的导出函数了,
    有了MessageBoxA的地址,push 4个参数,call 一下就可以啦,Vc++也就是
BaseAddress = LoadLibrary("user32.dll");  //system32中的东西,路径可以省略
pFun = GetProcAddress(BaseAddress,"MessageBoxA");
pFun(null,"hi","hi",3);
    线程和dll没有任何直接关系,dll是pe文件,到内存里就是模块,这个进程的主线程执行到哪个模块里就在那个模块里,是读头和内容的关系。当然,你也 可以在dll里面开启一个新的线程,他们的活动空间都是0x00000000-0x7fffffff,还有,一个线程对映一个数据块,比如 notepad.exe的主线程数据块在0x7fdf0000,里面有线程堆栈的指针,异常seh指针,等等总之通过这个数据块,可以访问到线程的一些信 息,不过这通常都不用考虑。

回复(0)

假如你必须得向我开枪

2006-07-10 00:00:00

丹真旺青,西藏,1989

“大兵
假如你必须得向我开枪
请把枪口对准我的头部吧
千万不要朝我的胸口瞄准
因为我的心里还有另外一个人”

回复(0)

不同的时候,不同的感受

2006-06-04 00:00:00

一位美国人的简历
  
  1809.2.12,生日
    
  1818年(9岁),母亲去世。
    
  1831年(22岁),经商失败。
    
  1832年(23岁),竞选州议员落选。
    
  同年 (23岁),工作丢了。
    
  想就读法学院,但未获入学资格。
    
  1833年(24岁),向朋友借钱经商。
    
  同年年底(24岁),再次破产。接下来,他花了16年时间才把债还清。
    
  1834年(25岁),再次竞选州议员,这次赢了。
    
  1835年(26岁),订婚后即将结婚时,未婚妻死了。
    
  1836年(27岁),精神完全崩溃,卧病在床六个月。
    
  1838年(29岁),争取成为州议员的发言人——没有成功。
  
  1840年(31岁),争取成为选举人——落选了。
    
  1843年(34岁),参加国会大选——又落选了。
    
  1846年(37岁),再次参加国会大选——这回当选了。前往华盛顿特区,表现可圈可点。
    
  1848年(39岁),寻求国会议员连任,失败。
    
  1849年(40岁),想在自己州内担任土地局长的工作,遭到拒绝。
    
  1854年(45岁),竞选美国参议员,落选。
    
  1856年(47岁),在共和党内争取副总统的提名——得票不足100张。
    
  1860年(51岁),当选美国总统。成为美国历史上最伟大的总统之一。
    
  生下来就一无所有的林肯,终其一生都在面对挫败。他曾经绝望至极,但从没有放弃人生这场跳高比赛. 
 
            不过话说回来,林肯很有可能就只是一个农民,甚至黑奴。然而就像蝴蝶效应里讲的那样,可能一点小小的改变,一个小小的犹豫,一个想法,一个决定或着一个行 动,一个人的一生就发生了翻天复地的变化。我明显的感受到了冥冥中这蝴蝶的翅膀,为什么会这样?每当遇见倒霉事,是怪自己太衰,或着上天不公平,还是,每 一件事的背后都有巧妙的安排,上帝真的非常幽默,爱因斯坦说过“上帝不掷骰子”,上帝肯定有一个精妙的随机发生器,只是我们不能理解其中的奥秘。
 
 
罗伯特弗罗斯特
 

 

黄色的树林里分出两条路
可惜我不能同时去涉足
我在那路口久久伫立
我向着一条路极目望去
直到它消失在丛林深处

 

但我却选择了另外一条路
它荒草萋萋,十分幽寂
显得更诱人,更美丽
虽然在这两条小路上
都很少留下旅人的足迹

 

虽然那天清晨落叶满地
两条路都未经脚步污染
呵,留下一条路等改日再见!
但我知道路径延绵无尽头
恐怕我难以再返回

 

也许多少年后在某个地方
我将轻声叹息将往事回顾
一片树林里分出两条路——
而我选择了人迹更少的一条
从此决定了我一生的道路

回复(0)

代码大全 一段话

2006-05-30 08:32:50

健康的生态环境中,海鸥吃新鲜的鲑鱼,鲑鱼吃新鲜的青鱼,青鱼吃新鲜的水蝽。这是一条健康的食物链。 如果环境被污染了,水蝽在污染的水域游泳,那么海鸥,食物链的最后一环吃下的不仅仅是是不健康的鲑鱼体内的垃圾,还有青鱼,水蝽体内的污染物。软件开发中,架构师吃掉需求,设计师吃掉架构,程序员,软件食物链的最后一环,消化掉设计。如果一开始就被污染了,我们就不要指望程序员快乐了。整个软件都会具有放射性,周身都是缺陷,绝对导致程序员脾气暴躁、营养失调。在我们规模不大的团队里,一个人身兼数职,伤害更大。所以,项目一开始就决定了它能否成功。

回复(0)

不再作3721傀儡机

2006-04-04 08:31:48

众所周知,3721是一个流氓软件,windows的底层技术被公开的太多,导致很多流氓公司比如3721,通过霸占用户的电脑,强行让用户使 用他们的服务。每每在浏览器地址栏里打错东西,就会被3721导航到什么yahoocn的搜索,yahoocn的搜索流量就是靠这个来的。
      今天实在郁闷决定彻底清除3721。于是进入命令行安全模式,这个模式中除了windows核心以及rpcss dmserver eventlog plugplay 等数个通过svchost加载的服务以外,没有其他进程,没有explorer,也没有网络连接,比较干净,到注册表中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除键:CnsMin
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\
删除:!CNS 这里是internet选项中的高级页
再到
HKEY_LOCAL_MACHINE\SOFTWARE\3721\ 以及 HKEY_CURRENT_USER\Software\3721\
删除:3721
然后又去
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\
找找,
差不多了就查找注册表,cnsmin,这是3721的名字,提示没有。
好,接着就去删除3721的文件
我是xp 那就是C:\windows\downlo~1这个文件夹,dir一下,好多dll啊,全部删除,再dir
发现 cnshook.dll cnsmin.dll 又回来了,那就是说有守护进程,3721居然防止用户在安全模式里卸他的软件!不知道守护进程在什么地方,先结束所有服务再说,强行关闭所有 svchost,由于关了rpcss服务,提示要关机,执行shutdown /a 暂停他,再去删除cnshook.dll cnsmin.dll,再dir,又回来的!郁闷,windows进程里就只剩下用户权限,登陆,进程管理,内存管理这些核心了,再去注册表里搜 cnshook cnsmin,结果什么都没有!很郁闷,决定先正常启动看看。
     进入windows打开进程列表,一个rundll32赫然在眼前,用ollydbg attach,果然里面加载了模块cnsmin.dll 这是3721删不掉的核心,他试图去下载新的3721以恢复刚才被删除的文件。要卸除3721就一定要把这两个文件删掉,于是找了一个xp下的纯dos http://down.gz235.com/soft/dos.rar  安装后重启就有进入dos的选项,还支持ntfs的filesystem :)进入c:\windows\downlo~1杀之,dir终于没有了。重启到xp,启动提示找不到模块cnsmin.dll可见已经成功删除,再一次 到注册表查找cnsmin.dll ,出来一大砣,其中就有在clsid中用rundll32.exe 加载cnsmin.dll,这就是开机时的核心启动。启动后侵入windows内核,hook 有关Reg的API,hook文件删除API,这已经是rootkit!为了防止用户删除他们的软件,3721居然卑劣和可耻到这种地步,blog一下。

回复(0)