回复(0)
给用户最大的便利
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
回复(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 和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的基址。
BaseAddress = LoadLibrary("user32.dll"); //system32中的东西,路径可以省略
pFun = GetProcAddress(BaseAddress,"MessageBoxA");
pFun(null,"hi","hi",3);
回复(0)
回复(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岁),当选美国总统。成为美国历史上最伟大的总统之一。
生下来就一无所有的林肯,终其一生都在面对挫败。他曾经绝望至极,但从没有放弃人生这场跳高比赛.
黄色的树林里分出两条路
可惜我不能同时去涉足
我在那路口久久伫立
我向着一条路极目望去
直到它消失在丛林深处
但我却选择了另外一条路
它荒草萋萋,十分幽寂
显得更诱人,更美丽
虽然在这两条小路上
都很少留下旅人的足迹
虽然那天清晨落叶满地
两条路都未经脚步污染
呵,留下一条路等改日再见!
但我知道路径延绵无尽头
恐怕我难以再返回
也许多少年后在某个地方
我将轻声叹息将往事回顾
一片树林里分出两条路——
而我选择了人迹更少的一条
从此决定了我一生的道路
Leave a Reply