函数说明:
kthread_create:创建线程。
struct task_struct *kthread_create(int (*threadfn)(void *data),void *data,const char *namefmt, ...);
线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。
kthread_run :创建并启动线程的函数:
struct task_struct *kthread_run(int (*threadfn)(void *data),void *data,const char *namefmt, ...);
kthread_stop:通过发送信号给线程,使之退出。
int kthread_stop(struct task_struct *thread);
线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。 但如果线程函数正在处理一个非常重要的任务,它不会被中断的。当然如果线程函数永远不返回并且不检查信号,它将永远都不会停止。 #include <linux/kthread.h> #include <linux/module.h> #ifndef SLEEP_MILLI_SEC #define SLEEP_MILLI_SEC(nMilliSec)/ do { / long timeout = (nMilliSec) * HZ / 1000; / while(timeout > 0) / { / timeout = schedule_timeout(timeout); / } / }while(0); #endif static struct task_struct * MyThread = NULL; static int MyPrintk(void *data) { char *mydata = kmalloc(strlen(data)+1,GFP_KERNEL); memset(mydata,'/0',strlen(data)+1); strncpy(mydata,data,strlen(data)); while(!
QDockWidget类详解 【详细描述】 QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。
QDockWidget类提供了dock widget的概念,dock widget也就是我们熟悉的工具面板或者是工具窗口。Dock window是放置在
QMindow窗口周围的dock widget区域中的。
如下图所示:
Dock windows可以在几个区域中移动,或者是悬浮。该类提供的API允许程序员限制dock widgets的移动,悬浮和关闭,以及它
可以被放置的区域。
【外观】 一个QDockWidget包含一个小的工具栏和内容区域。小的工具栏用于显示窗口标题,一个浮动按钮和一个关闭按钮。取决于QDockWidget的状态,浮动按钮和关闭按钮可能或者禁止或者完全不显示。
工具栏和按钮的显示取决于你所使用的样式。
QDockWidget可以作为它子窗口部件的封装,通过setWidget()设置子窗口部件。自定义的尺寸提示,最小和最大化尺寸已经尺寸策略都必须由子窗口部件来实现。QDockWidget会遵守它们,调整它自己的限制包括框架和工具栏。我们不应该为QDockWidget设置尺寸限制,因为它们根据QDockWidget是否锁住而改变,一个锁住的QDockWidget窗口部件不包括框架和小的工具栏。
【类详解】 1、QDockWidget对象包含一些特性,例如:移动、悬浮、关闭等等,这些都是枚举类型:
2、QDockWidget可以放置的位置,也是枚举类型:
3、成员函数:void QDockWidget::setTitleBarWidget(QWidget * widget)
设置任意的widget作为dock widget的工具栏。如果widget设置为0,那么之前在dock widget上设置的任意自定义工具栏都会被清除,但是不是删除,并且会使用默认的工具栏。
如果我们为工具栏设置了widget,那么当它悬浮的时候,QDockWidget不会使用本地窗口装饰它。
下面是对实现自定义的工具栏的一些建议:
*那些不是明确由工具栏处理的鼠标事件应该通过调用QMouseEvent::ignore()函数忽略掉。这些事件就会传递给QDockWidget,由
QDockWidget按照常规的方式处理。拖动鼠标的时候就移动,双击的时候就锁住/解锁等等。
*当为QDockWidget设置了DockWidgetVerticalTitleBar时,那么工具栏窗口部件就会相应的放置在新的位置上。在resizeEvent()中
,工具栏必须检查放置的方向:
QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget());
if (dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar) {
// I need to be vertical
} else {
// I need to be horizontal
}
*工具栏widget必须包含有合法的QWidget::sizeHint()和QWidget::minimumSizeHint()。这些方法必须考虑工具栏放置的方向。
*从一个锁定的widget中移除工具栏是不可能的。然而,我们可以通过将默认构造的QWidget作为工具栏widget来达到这种效果。
4、成员函数:void QDockWidget::setWidget(QWidget * widget)
当widget添加的时候,如果dock widget是可见的,那么你就需要显示的调用show()函数。
在调用这个函数之前,你必须先添加widget的布局,否则,添加的widget就是不可见的。
【示例1】 {效果} {实现} 【示例2】 {效果} {实现} 这里的dockwidget较之前的要丰富得多,是因为自定义了类ColorSwatch,该类继承自QDockWidget:
linux--watch命令使用 1.watch命令简介 www.2cto.com watch [options] command The watch program executes a given command at regular inter-vals; the default is every two seconds. The command is passed to the shell (so be sure to quote or escape any special characters), and the results are displayed in a full-screen mode, so you can observe the output conveniently and see what has changed. For example, 每隔一段时间重复运行一个命令,默认间隔时间是2秒。要运行的命令直接传给shell(注意引用和转义特殊字符)。结果会展示为全屏模式,这样你可以很方便的观察改变。例如: watch -n 60 date executes the date command once a minute, sort of a poor man’s clock.
iwconfig用来操作VAP接口
radio层不支持iwconfig命令
命令帮助 ~ # iwconfig --help
Usage: iwconfig [interface]
interface essid {NNN|any|on|off}
interface mode {managed|ad-hoc|master|...}
interface freq N.NNN[k|M|G]
interface channel N
interface bit {N[k|M|G]|auto|fixed}
interface rate {N[k|M|G]|auto|fixed}
interface enc {NNNN-NNNN|off}
interface key {NNNN-NNNN|off}
interface power {period N|timeout N|saving N|off}
interface nickname NNN
interface nwid {NN|on|off}
interface ap {N|off|auto}
interface txpower {NmW|NdBm|off|auto}
interface sens N
interface retry {limit N|lifetime N}
interface rts {N|auto|fixed|off}
interface frag {N|auto|fixed|off}
interface modulation {11g|11a|CCK|OFDMg|...}
usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒); 头文件: unistd.h 语法: void usleep(int micro_seconds); 返回值: 无 内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。 注意: 这个函数不能工作在windows 操作系统中。用在Linux的测试环境下面。 参见:usleep() 与sleep()类似,用于延迟挂起进程。进程被挂起放到reday queue。 是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。且此函数已被废除,可使用nanosleep。如果延迟时间为几十毫秒(1ms = 1000us),或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间 该usleep()功能将导致调用线程暂停执行直到数微秒的实时参数指定了useconds或信号传递到调用线程,其作用是调用一个信号的捕获功能或终止进程。暂停的时间可能比所要求的系统的其他活动的调度要长。 该useconds参数必须小于1000000。如果useconds值是0,则调用没有影响。 如果一个sigalrm信号生成调用进程的执行过程中,如果usleep() sigalrm信号被忽略或无法交货,这是未指定是否usleep()返回时的sigalrm预定的信号。如果信号是被封锁,也未指定是否后尚未usleep()返回或是丢弃。 如果一个sigalrm信号生成调用进程执行usleep()期间,除了由于对alarm()事先打电话,如果sigalrm信号不被忽略或无法交货,它是不确定的,是否有其他信号比造成任何影响usleep()返回。 如果信号捕捉功能的中断usleep()检查或变化的时间sigalrm将产生,与sigalrm信号相关的动作,或是否sigalrm信号被阻止从交货,结果是不确定的。 如果信号捕捉功能的中断usleep()和电话siglongjmp()或longjmp()恢复环境保存到usleep()呼叫之前,行动与sigalrm信号和时间,sigalrm信号将产生未指定。它还未指定是否sigalrm信号被阻断,除非进程的信号屏蔽恢复作为环境的一部分。 实现可能限制定时器值的粒度。对于每个时间间隔定时器,如果请求的定时器值需要比实现支持细粒度的,实际的定时器的值将舍入为下一个支持的价值。 usleep()和任何以下之间的相互作用是不确定的:
XP系统更改方法: 【桌面】→ 【单击右键】→ 【属性】→ 【外观】→ 【高级】→ 项目选择【窗口】→ 【颜色1(L)】→ 【选择(其它)】将色调改为:85;饱和度:123;亮度:205→添加到自定义颜色→在自定义颜色选定→确定 这样所有的文档都不再是『刺眼的白底黑字』,而是非常『柔和的豆沙绿』色,这个色调是『眼科专家配置』的,长时间使用会很有效的『缓解眼睛疲劳』『保护眼睛』
【金庸原版】 直到午牌时分,井底三人才先后醒转。第一个醒的是王语嫣,她功力本浅,内力虽然全失,但原来并没多少,受损也就无几。她醒转后自然立时便想到段誉,其时虽是光天白日,深井之中仍是目不见物,她伸手一摸,碰到了段誉,叫道:“段郎,段郎,你……你……你怎么了?”不听得段誉的应声,只道他已被鸠摩智扼死,不禁抚“尸”痛哭,将他紧紧抱在胸前,哭道:“段郎,段郎,你对我这么情深意重,我却没有一天好言语、好颜色对你,我只盼日后丝萝得托乔木,好好的补报于你,哪知道……哪知道……我俩竟恁地命苦,今日你命丧恶僧之手……” 【古龙版】 王语嫣娇呼道:“段誉,段誉,你……你醒醒。” 她身旁一个声音冷冷道:“他不会醒来。” 这语声迟缓、冷漠,生涩,语调平板得没有一丝情感,像是坟墓里的死尸吐出的话语。 王语嫣却仿佛没有听见,嘶声道:“段誉,段誉,你快醒来……” 那语声冷冷道:“他已死了,你不知道么?” 王语嫣挺起胸膛,大声道:“哼,你怎知他死了?” 她虽然竭力摆出勇敢的样子,她的声音却微微颤抖,掩不住心里的害怕。 那语声狂笑道:“他是某家亲手杀死的,我怎不知?” 王语嫣突然放声痛哭起来,嘶声道:“你撒谎……,恶魔,你撒谎……” 黑暗肮脏的枯井底,一个绝美的女人,抱着一具尸体放声痛哭,构成了一幅惊心动魄、充满着血腥的诱惑的美丽画面! 【黄易版】 王语嫣只道段誉死了,抱着他的尸体,哀哀哭泣。 段誉的身体突然动了动,眼珠也转了转,出声笑道:“你哭什么?” 王语嫣又惊又喜,问他怎么会醒来。 原来段誉并没有被鸠摩智杀死,而是急中生智,屏住了呼吸,瞒过了鸠摩智,又点了他的穴道。 这清丽的美女听到这里,一双美目中泛起凄迷之色,香唇轻吐道:“幸好段郎你如此机智,方能制住了这恶僧,也使语嫣免于这恶僧的欺辱,人家真是对你感激不尽!” 段誉笑道:“你心中感激,该如何报答我呢?” 王语嫣如小绵羊般温顺地垂下了头,在段誉温柔的爱抚下,这端庄的美女青涩的情欲烈焰被他燃起,两人皆尝到了抵死缠绵的无穷快感。 【琼瑶版】 “语嫣!”鸠摩智炯炯的注视着她,含泪喊:“你难道看不出来吗?他,他已经死了!” 语嫣听到了他的话,整个人就震撼住了,久久的说不出话。她看着段誉的脸,那么年轻,那么俊秀……她茫然的摇着头,好小声好小声的说: “不会的,不会的,不会的,他不会死的……”说着,就摇晃着他的身子,喊: “段誉,你快醒醒,你快醒醒啊!”喊着喊着,泪水就滚了下来。 鸠摩智看着她这副模样,感到自己的心也仿佛被撕碎了,他握住她的手,真挚的、沉痛的喊: “语嫣,你听我说一句话!他已经死了,不会回来了!可是——你还有我啊!” 【曹雪芹版】 那王语嫣见段誉不醒,已唬去了半个神儿,抱着他只哭骂:“你个狠心短命的小祖宗,你若死了,我可怎么过啊?”到伤心处,又唤起慕容复的名字来:“若有你在,死一百个他,我也不管了!”只哭得天昏地暗,两眼肿得只如桃子一般。 【明晓溪版】 晶莹的泪水。 透明璀璨的泪珠在她的脸上蔓延。 眼前白雾氤氲…… 脑海中一片白茫茫…… …… 恍若冬日最晶莹清澈的雪…… ………… …… “语嫣……” …… “语嫣……”樱花般的唇角勾起一抹笑,呛咳出一串殷红的血沫,“我……喜欢你……” …… ………… 【鬼吹灯版】 不知过了多久,我才醒了过来,四周一片漆黑,看来这井深得很。正在绝望的时候,忽然感觉有丝阴风吹在脸上,不由心里一动,这井中既有空气流通,说明必和地下水脉相连,指不定就有一条秘道,通往皇宫的地下宝藏,毕竟这是西夏王朝剥削阶级的井。正胡思乱想着,忽然听到王语嫣在一边焦急地叫道:“老段,老段,你怎样了?”我刚想回答,猛听到身后一阵沉闷的异响,只觉得阴风更甚,不由毛骨悚然,忙压低了声音道:“嘘,别出声,有粽子。” 【韩寒版】 王姑娘先醒。这很奇怪,因为此人是先落下井去。段誉等人落下时必定要拿她当垫背。但是垫背居然还先醒来。我们只能理解为,王姑娘实在是人中极品,皮肉细嫩软和,故而充满弹力。用八戒的话说: 好大的棉花糖啊。 【郭敬明版】 直到午牌时分,井底三人才先后醒转。第一个醒的是王语嫣,她功力本浅,内力虽然全失,但原来并没多少,受损也就无几。她醒转后自然立时便想到段誉,其时虽是光天白日,深井之中仍是目不见物,她伸手一摸,碰到了段誉,叫道:“段郎,段郎,你……你……你怎么了?”不听得段誉的应声,只道他已被鸠摩智扼死,不禁抚“尸”痛哭,将他紧紧抱在胸前,哭道:“段郎,段郎,你对我这么情深意重,我却没有一天好言语、好颜色对你,我只盼日后丝萝得托乔木,好好的补报于你,哪知道……哪知道……我俩竟恁地命苦,今日你命丧恶僧之手……”
本周一参加了一个项目管理的新的交流会。牵头的是我们公司的老总,难得老总百忙之中抽出时间组织这次项目管理交流会,掌声鼓励。本篇是自己的工作记录而已,下面的内容仅在一定的环境下适用。
具体各个项目负责人交流的心得就不细陈述了,针对几个项目负责人交流出的心得把总结下的事情记录一下:
1、new一个新项目的时候,有一点要着重重视一下,就是招标项目的边界制定。客户需要什么?针对现有的需求做分析给出解决方案。需求分析要与客户进行确认,不确认项目无法启动。针对这一点我就在前一阵启动的项目深有感受,在我离开山西后的五年后第一次再次接山西的项目,由于经验的不足,以及主观以为是老总的关系客户,所以让自己负责的这个项目成本超过了预期不少,我觉得界线的制定不得力是我们这个项目成本超支的一个很凸显的原因。同时与客户签订的合同里要把建设内容明确下来,并且业务词汇一定要清晰,不可有歧义。
2、客户提的需求要进行平衡,合理的需求给出客户合理的解决方案,不合理的需求要提出合理的建议。
3、开发环节中,团队成员要有明确的工作任务,这就要求项目负责人在分配任务前一定要自己明确下来,忌讳抛给团队成员不明确的工作项。
4、沟通上,环境不同,地域的不同等等,寻找干系人可能会不同,并且交流的方式、方法也会不同。沟通上没有最,只有不断的去强化去完善。
5、项目进行过程中一定要做好时效的管理,举一个去客户现场的例子:一定要与甲方进行预约,告知他们你的日程安排、每个安排上需要什么人配合,以及离开时间都要告知给 甲方。
6、过程管理,文档的编写,关键性文档不能少(如软件测试文档)。
7、验收环节,不仅仅是该环节,凡是对客户的输出上都要做格外的关注,拿验收这个环节,现行的几篇纸的验收报告是不行的,要有专业的验收报告编制出来,呈献给甲方。
最后老总给我们强调了一点特别重要的内容,就是我们这些苦命做项目的人员与甲方是平等的,我们至少不能在心理上对客户产生畏惧的心理。
借着宝地上传个图片:
在 Win7上装了 VC++6.0 ,想要在创建的工程中添加 Windows 多媒体库支持,单击菜单中的 Project --》Add to Project --》Components and Controls ,会发现 MSDev89\Gallery 文件夹中什么都没有。
这个问题其实重装修复VC++6.0都是没有用的,只能在 Windows XP 系统中安装 VC++6.0 才会在单击菜单中的 Project --》Add to Project --》Components and Controls时出现 Registered ActiveX Controls 和 Visual C++ Components 这两个文件夹,且打开里面有东西。
我想过从 XP 系统中把这两个文件夹拷贝到 Win7 系统中,但是你会发现,其实 XP 中这两个文件夹也是空的。
这个问题比较权威的解释在这个链接里面 : http://technet.microsoft.com/zh-cn/subscriptions/aa293915
大概意思就是: Registered ActiveX Controls 和 Visual C++ Components 这两个文件夹包含的是已经在你的系统中注册过的组件的快捷方式,这些组件或者是你安装程序时自动注册的,或者是你单独购买后注册过的。Gallery 会在你每次通过 VC++6.0 打开它的时候,根据当前的注册表状态产生你注册过的组件的快捷方式。
也就是说:如果你删除了已经注册的组件的快捷方式,它还是会在你下次打开 Gallery 的时候出现。 如果你删除了一个已经注册的组件(比如 dll 或者ocx文件),但是你没有卸载它,那么这个快捷方式还是会出现,只是不可用。
如果你拷贝了一个组件到你的电脑上,但是你没有注册这个组件,它的快捷方式也不会出现在 Gallery 里面,因为注册表中没有该组件的信息,Gallery 识别不到。
osgOcean与osgEarth融合的主要技术问题有2点:
1.osgOcean是平面的海洋,所以不支持osgEarth球面。
2.osgEarth渲染最终依靠shader完成,并且自带一套着色器合成框架ShaderCompliction;这与osgOcean的着色器系统不兼容。
经过了很多尝试,我最后还是选择放弃,最后的选择解决方案是:集成sundog公司的triton海洋。troton海洋比osgOcean有很多优势,比如用到GPU模拟海洋效果和支持osgEarth,现在的售价大概在1w块左右。
1.JSP到SERVLET 可以使用隐藏表单域的方法: jSP: <form type="hidden" name="" value=""> servlet: String ps=request.getParameter(""); String[] ps = request.getParameterValues(""); 2.servlet传递参数给JSP 方法1. 可以使用request.setAttribute("name","value")来传递参数,使用request.getAttribute("name","value")来接受参数,但是此方式只能使用于跳转,而不适用于重定向 方法2. session会话:实质上就是一片内存空间,而这个空间不在你自已的电脑上,她在服务器上,所以你只要把你想要共享的数据放到这个空间里去就可以达到共享数据的目的. 发送端: HttpSession session=request.getSession(); session.setAttribute("artTypeList",artTypeList); 接收端: ArrayList typelist=(ArrayList)session.getAttribute("artTypeList"); 方法3:cookie
DPI(Dot Per Inch) 表示打印分辨率,指每英寸长度上的点数。DPI 又可细分为水平分辨率和垂直分辨率,例如一张 “1英寸*1英寸” (1英寸=2.54cm)的图片,如果它的水平分辨率是100 dpi,垂直分辨率是50 dpi,那么就是说,它水平每英寸分成100小段,垂直每英寸分成50小段,就像米尺上的一格格那样。那么这张图总共有100*50=5000个格子,这张图片共有5000像素。由于它的水平分辨率和垂直分辨率不相等,所以每个像素是一个微小的长方形,如下图左上角的小长方形:
所以像素实际上是一个面积的概念,而因为一般电脑/数码相机等生产出来的图片都是水平分辨率和垂直分辨率相等,每个像素是个微小的正方形,所以就讲成 "DPI 表示每英寸长度上的像素数目",其实就是"每英寸长度上的点数"了。
设备分辨率(DeviceResolution)又称输出分辨率,指的是各类输出设备每英寸上可产生的点数,如显示器、喷墨打印机、激光打印机、绘图仪的分辨率。这种分辨率通过 DPI 来衡量,目前,PC显示器的设备分辨率在60至120DPI之间,打印设备的分辨率在360至2400DPI之间。
某台打印机分辨率为360DPI,是指在用该打印机输出图像时,在每英寸打印纸上可以打印出 360 个表征图像输出效果的色点。打印机分辨率的这个数越大,表明图像输出的色点越小,输出的图像效果就越精细。打印机色点的大小只同打印机的硬件工艺有关,与要输出图像的分辨率无关。
建站系统:www.dvbbs.com
建站系统:http://www.dedecms.com/
镜像、正交投影和切变的推导都可根据缩放变形而来。在要缩放方向上去缩放因子k,如果|k|<1,物体"收缩", |k|>1,物体“膨胀”;k=0,正交投影;k<0,镜像; 切变稍有不同。
1. 缩放
01. 沿坐标轴缩放
2D中有两个缩放因子Kx和Ky,p和q是原来的基向量,缩放因子单独影响基向量,得到p`和q`:
得到缩放矩阵:
3D中增加缩放因子Kz
02.沿任意方向缩放
设n为平行于缩放方向的单位向量,k为缩放因子,缩放沿着穿过原点的并平行于n的直线(2D中)或平面(3D中)进行。
先讨论2D中的推导过程。我们需要推导一个表达式,给定向量v,可以通过v,n和k来计算v`。将v和v`分解为平行和垂直于n的分向量
v||是v在n上的投影
v⊥垂直于n,不会受缩放影响
v`||受缩放因子影响
推导得到v`
通过表达式来推导基向量
通过基向量构建矩阵,得到以单位向量n为缩放方向,以k为缩放因子的缩放矩阵
同样的原理运用在3D中
是scale(缩放)的缩写S(n,k)表示缩放矩阵
2.正交投影
投影意味和降维操作,将所有的点拉平到要投影的直线或平面上,从原来的点到投影点的直线相互平行,这就是正交投影。透视投影是另一种投影。
01. 向坐标轴或平面上投影
通过将垂直方向上缩放因子设为0来实现,如将3D点投影到xy平面,则抛弃z分量,通过将z方向上的缩放因子设为0实现。
P是projection(投影)的缩写,2D中,Px表示向x轴投影,Py同理:
3D中,Pxy表示向xy平面投影,其余同理:
02. 向任意指向或平面投影
投影有垂直于直线或平面的向量n定义,通过使n方向上的缩放因为0就能导出任意方向的投影矩阵。P(n)表示向垂直于向量n的轴或平面投影矩阵,S(n,0)表示在n方向上的缩放因子为0的缩放矩阵.
2D:
3D:
3. 镜像
也叫做反射,与正交投影相似,正交投影将缩放值k设为0,而镜像则设为-1.
R是reflect(反射)的缩写。2D:
3D:
4.切变(Shearing)
切变是坐标系的变换,非均匀的拉伸。切变时候,角度变化,但是面积或体积不变。也可以理解为坐标轴间的角度变化,造成的扭曲。
如下图,这是x坐标根据y坐标的切变,机器人的y坐标没有变化,只有x坐标变化了,变化后的坐标x`可以理解为将y坐标乘以切变因子s与原坐标x的和:x` = x + sy。如果是3D则增加z坐标的切变因子t: x` = x + sy,y` = y + tz
2D中切变矩阵为:
x坐标根据y坐标的切变
y坐标根据x坐标的切变
x,y坐标被z坐标切变
可以将矩阵对向量的转换理解为对向量所在坐标系的转换。
1.向量的每个坐标都表明了平行于相应轴的偏移量,所以向量可以改写成如下形式:
v = [x y z]
= [x 0 0] + [0 y 0] + [0 0 z]
= x [1 0 0] + y [0 1 0] + z [0 0 1]
设向量p,q,r分别为指向+x,+y和+z方向的单位向量
i = [1 0 0]
j = [0 1 0]
k = [0 0 1]
带入以上公式则有:
v = xi +yj +zk
这里i,j和k可以称为基向量,一个坐标系能够用任意3个线性无关的基向量定义,向量可以表示为基向量的线性组合。
2.M是矩阵,与基向量相乘:
向量v与矩阵M相乘有:
这里将iM,jM和kM改为p,q和r
p = iM
q = jM
r = kM
1.向量点乘公式推导和几何解释
01.向量点乘(dot product)是其各个分量乘积的和,公式:
用连加号写:
02.几何解释:
点乘的结果是一个标量,等于向量大小与夹角的cos值的乘积。
a•b = |a||b|cosθ
如果a和b都是单位向量,那么点乘的结果就是其夹角的cos值。
a•b = cosθ
03.推导过程:
假设a和b都是二维向量,θ1是a与x轴的夹角,θ2是b与x轴的夹角,向量a与b的夹角θ等于θ1 - θ2.
a•b = ax*bx + ay*by = (|a|*sinθ1) * (|b| * sinθ2) + (|a| * cosθ1) * (|b| * cosθ2)
= |a||b|(sinθ1*sinθ2 + cosθ1*cosθ2)
=|a||b|(cos(θ1-θ2))
= |a||b|cosθ
2.点乘交换率和分配率的推导
01.交换率
02.分配率
注:更多内容参见:<3D math primer for graphics and game development second edition>点击打开链接
1. 简介 对于一个新手,如果严格按照官方文档来安装redmine,我想会“疯”掉的。有没有一种简便的方法。有滴,那就是BitNami。
BitNami提供redmine的一键安装程序,简单、易用、方便。
2. 安装 下载地址:http://bitnami.org/stack/redmine
不仅仅是windows的有一键安装程序,linux也有一键安装程序。我的安装环境是windows xp,下载的版本是bitnami-redmine-2.3.0-0-windows-installer.exe。
跟大部分windows安装程序一样,一路默认“下一步”即可。需要注意的是,创建管理员账号的时候,需要将用户名称和密码记录下来,此用户即为redmine安装好后的管理员账号,如下图 2‑1所示:
图2‑1 设置管理员账号信息
安装完后会自动打开浏览器,如下图 2‑2所示,点击“Access BitNami Redmine Stack”即可访问redmine。
图2‑2 安装成功
输入图 2‑1所示的管理员账号和密码,即可登录redmine。如下图 2‑3所示。开始体验吧。
图2‑3 管理员登录
3. 集成git 3.1. 新建版本库 登录redmine,添加用户,新建一个project,新建完成后,在配置->版本库中选择git,然后在”Path to .git repository”中写入git的路径即可(注意:需要包括.git所在的路径)。如下图 3‑1所示。
图3‑1 新建版本库
标准安装的redmine只能访问本地git版本库,不能通过git协议访问git版本库,我们可以通过git clone --mirror克隆镜像到本地的方法来解决。
3.2. 浏览版本库 添加完版本库后,即可在通过edmine在web上浏览版本库,选择项目 > 版本库,等待一下,让Redmine处理下Repository 的信息,然后就可以看到版本库了,如下图 3‑2所示:
图3‑2 浏览版本库
注意:当配置完版本库第一次访问时, Redmine将抓取版本库中已经存在的所有提交信
息, 并存入数据库。所以如果你的版本库特别大, 那么该过程将会很长。
3.3. git提交和redmine问题关联 要实现在gi代码提交的同时关闭问题状态,实现提交跟问题建立关联,需要以管理员身份登陆,依次选择“管理” > “配置” > “版本库”,按下图 3‑3所示设置,设置完点击保存。
图3‑3 提交和问题关联的设置
回到项目中,在项目里新建一个问题,新建完后,如下图所示:
图 3‑4 新建问题
修改代码,git提交信息中只要包含有“closes #1”字眼的,就会自动关闭问题。如下图 3‑5所示,在这里还可以看到某个bug对应改动的代码是什么。
本博客已迁往http://coredumper.cn 对一个结构可以在初始化时进行整体赋值,例如:
struct node{ int i; int j; }; struct node a = {1, 2}; 但是对一个已经定义好的结构变量,不可以采用整体赋值的方式,只能对结构中的每个成员分别进行赋值,下面的两个例子便是错误的:
struct node b; b = {1, 2}; struct node *p = (struct node *)malloc( sizeof(struct node) ); *p = {1, 2}; 对结构数组也可以在初始化时进行整体赋值,例如:
struct node c[] = {{1, 2}, {3, 4}}; 其中内部的花括号可以省略,个人觉得完整写法更为清晰明了。
需要注意的是,相同类型的结构变量之间是可以直接整体赋值的,例如:
struct node d = {1, 2}; struct node e; e = d;
VS2010新建的VC++项目默认的组件平台是32位
要将它编译为64位程序,按以下步骤:
1.点击“Win32”下拉框,打开“配置管理器”
2.点击“活动解决方案管理平台”下拉框,选“新建”
3.点击“键入或选择新平台”下拉框,选"x64",然后点击“确定”
4.配置完成,可以看见项目平台都变为x64了,点击关闭即完成。
.Net单元测试之NMock
NMock是一款.NET平台下的基于动态代理的Mock模拟对象类库,用于C#开发。Mock对象使测试更简单,它测试单个组件或单个类时不需要其它所有组件真正实现。也就是说我们可以仅仅只是测试一个类,NMock生成的模拟是通过在运行时使用动态代理来实现的,这允许模拟对象动态的定义,并不需要添加任何附加的类。
通常,一个模拟的实现基于被依赖的接口而创建;NMock支持对接口和类的模拟,另外它还支持属性模拟。比起测试一个完整的对象关系树更容易查清楚Bug。Mock对象一般用于以测试为驱动的开发当中。
http://msdn.microsoft.com/msdnmag/issues/04/10/NMock/default.aspx http://nmock.org/ 为什么需要Mock 单元测试的基本原则应该是每次只验证一个方法,但是倘若遇到这样一种情况: 测试方法依赖于其他一些难以操控的东西,如:网络,数据库。或者是你测试的代码依赖于系统的其他部分,甚至是系统的多个其他部分。在这种情况下,倘若不小心,最终可能发现自己不小心几乎初始化了系统的每一个组件,而所有这一切只是为了给某一个测试创造必要的运行环境。这不仅花费了大量的时间,要命的是这样的测试用例会被引入大量的耦合因素,很难到达“单元”测试的目的。我们该怎么办呢? 这是Mock的测试方法就派上用场了。Mock的英文的字面意思是:嘲笑,模仿,欺骗的意思。通过Mock,我们可以创建很多真实对象的替代品,在测试用例中使用它。 什么情况下考虑使用Mock 1)真实的对象具有不可确定的行为(如:程序需要通过web service获得股票的实时价格) 2)对象很难被创建(如系统环境很难初始化) 3)真实对象的某些行为很难被触发(如网络错误,数据库ID自增序列溢出) 4)真实的对象令程序运行很缓慢 5)真实对象含有UI等不方便测试的因素 6)测试需要询问真实对象是如何被调用的(如异步调用的情况,需要验证Callbak的函数) 7)真实的对象目前还不存在(如依赖于其他项目组或则需要新的硬件系统) 进行Mock测试的步骤 测试代码首先引用NMock的框架 1)定义一个接口来描述这个对象
2)产品代码实现这个接口
3)测试中Mock对象实现这个接口
下面是一个使用NMock的快速教程: 示例
现在我们来做一个简单的“Hello”例子,测试 Hello 类的 Greet() 方法,Hello 类依赖于一个 Person 对象,并将根据 Person 的名字向对应的账号发送祝贺(Greet)。这个例子很简单,其实用不到模拟对象,不过用来理解 NMock 是很合适的。
public interface IPerson
{
stringName{get;}
} 然后定义具有 Greet 方法的 Hello 类,可以根据 IPerson 的名字发送祝贺信息。 public class Hello
{
IPersonperson;
publicHello(IPersonperson)
{
this.person=person;
}
publicStringGreet()
{
return"Hello"+person.Name;
}
} 我们可以看到,Hello 类对 IPerson 接口有依赖。
在我们继续对 Hello 类的开发之前,让我们来学习一些关于 NMock 的基础知识。使用 NMock 很容易根据一个给定的接口或类来创建一个模拟对象;