因为最近一段时间,一直在弄微信项目,其中涉及到了证件上传的功能,刚开始的时候一点头绪都没有,上网查了很多资料,QQ群里面也问了不少人,很多人说如果是app程序,可以申请系统权限,然后再去调用系统底层的东西,但是微信是在浏览器里面操作的,我们自定义的页面也是通过微信内置浏览器打开的,而且微信浏览器在内部进行了很多特殊处理,屏蔽了很多东西,所以要在页面调用拍照功能或者是打开手机系统的图库目录是不可能的,当然,这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而且实现的过程居然也很简单。只是用到了HTML5的file文件上传功能,再配合canvas即可。下面附上源代码:
<span style="font-family:KaiTi_GB2312;font-size:14px;"><!DOCTYPE html> <html lang="zh-CN"> <meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="format-detection" content="telephone=yes"> <head> <meta charset="UTF-8"> <title>上传证件</title> <style> body { margin: 20px 20%; color:#777; text-align: center; } #result{ margin-top: 20px; } </style> </head> <body> <h1 class="text-center">上传证件...</h1> <hr/> <input type="file"/> <div id="result" align="center"></div> <hr/> <!-- 引入jQuery --> <script type="text/javascript" src="../js/jQuery/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="../js/LocalResizeIMG.js"></script> <!-- mobileBUGFix.js 兼容修复移动设备 --> <script src="../js/mobileBUGFix.mini.js" type="text/javascript"></script> <script type="text/javascript"> $("input:file").localResizeIMG({ width: 500, quality: 0.
在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题:
l 我想分析一下用户行为(pageviews),以便我能设计出更好的广告位
l 我想对用户的搜索关键词进行统计,分析出当前的流行趋势。这个很有意思,在经济学上有个长裙理论,就是说,如果长裙的销量高了,说明经济不景气了,因为姑娘们没钱买各种丝袜了。
l 有些数据,我觉得存数据库浪费,直接存硬盘又怕到时候操作效率低。
这个时候,我们就可以用到分布式消息系统了。虽然上面的描述更偏向于一个日志系统,但确实kafka在实际应用中被大量的用于日志系统。
首先我们要明白什么是消息系统,在kafka官网上对kafka的定义叫:A distributed publish-subscribe messaging system。publish-subscribe是发布和订阅的意思,所以更准确的说kafka是一个消息订阅和发布的系统。publish-subscribe这个概念很重要,因为kafka的设计理念就可以从这里说起。
我们将消息的发布(publish)暂时称作producer,将消息的订阅(subscribe)表述为consumer,将中间的存储阵列称作broker,这样我们就可以大致描绘出这样一个场面:
生产者(蓝色,蓝领么,总是辛苦点儿)将数据生产出来,丢给broker进行存储,消费者需要消费数据了,就从broker中去拿出数据来,然后完成一系列对数据的处理。
乍一看这也太简单了,不是说了它是分布式么,难道把producer、broker和consumer放在三台不同的机器上就算是分布式了么。我们看kafka官方给出的图:
多个broker协同合作,producer和consumer部署在各个业务逻辑中被频繁的调用,三者通过zookeeper管理协调请求和转发。这样一个高性能的分布式消息发布与订阅系统就完成了。图上有个细节需要注意,producer到broker的过程是push,也就是有数据就推送到broker,而consumer到broker的过程是pull,是通过consumer主动去拉数据的,而不是broker把数据主动发送到consumer端的。
这样一个系统到底哪里体现出了它的高性能,如官网上所述,翻译如下:
(1)数据在磁盘上存取代价为O(1)。一般数据在磁盘上是使用BTree存储的,存取代价为O(lgn)。
(2)高吞吐率。即使在普通的节点上每秒钟也能处理成百上千的message。
(3)显式分布式,即所有的producer、broker和consumer都会有多个,均为分布式的。
(4)支持数据并行加载到Hadoop中。
等等
至此你应该对kafka是一个什么样的系统有所体会,并能了解他的基本结构,还有就是他能用来做什么。那么接下来,我们再回到producer、consumer、broker以及zookeeper这四者的关系中来。
我们看上面的图,我们把broker的数量减少,只有一台。现在假设我们按照上图进行部署:
l Server-1 broker其实就是kafka的server,因为producer和consumer都要去连它。Broker主要还是做存储用。
l Server-2是zookeeper的server端,zookeeper的具体作用你可以去官网查,在这里你可以先想象,它维持了一张表,记录了各个节点的IP、端口等信息(以后还会讲到,它里面还存了kafka的相关信息)。
l Server-3、4、5他们的共同之处就是都配置了zkClient,更明确的说,就是运行前必须配置zookeeper的地址,道理也很简单,这之间的连接都是需要zookeeper来进行分发的。
l Server-1和Server-2的关系,他们可以放在一台机器上,也可以分开放,zookeeper也可以配集群。目的是防止某一台挂了。
简单说下整个系统运行的顺序:
1. 启动zookeeper的server
2. 启动kafka的server
3. Producer如果生产了数据,会先通过zookeeper找到broker,然后将数据存放进broker
4. Consumer如果要消费数据,会先通过zookeeper找对应的broker,然后消费。
在项目中用到了mediastream2,mediastream2是一个框架,引擎,它驱动系统的整个流程,从接收rtp媒体流并解析到媒体解码到显示到android手机屏幕上,都是由mediastream2来驱动完成的。
mediastream2是由一个个filter来完成,我们可以把filter当做一个单独的数据处理模块,它就像一个盒子,有输入和输出接口,数据从输入接口进来,处理完成后,再从输出接口出来进入到下一个filter中,多个filter连接在一起,就组成了一个系统循环。在我们的系统中,主要流程是ipcam发送rtp媒体流,系统接收rtp媒体流并解析,然后进行解码,再显示到android手机屏幕上,因此我们定义了三个filter,分别是:RTP Recv filter(RTP媒体流接收),Video Decoder filter(视频解码)和Android Display filter(视频输出显示),其基本流程如下:
RTP Recv----------------->Video Decoder------------------------------> Android Display
首先我们要调用ms_init()这个函数,这个函数初始化mediastream2。
void ms_init(){
int i;
MSSndCardManager *cm;
#if defined(ENABLE_NLS)
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
#endif
#if !defined(_WIN32_WCE)
if (getenv("MEDIASTREAMER_DEBUG")!=NULL){
ortp_set_log_level_mask(ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
}
#endif
#ifdef ANDROID
ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
ortp_set_log_handler(ms_android_log_handler);
#endif
ms_message("Mediastreamer2 " MEDIASTREAMER_VERSION " (git: " GIT_VERSION ") starting.");
/* register builtin MSFilter's */
for (i=0;ms_filter_descs[i]!=NULL;i++){
ms_filter_register(ms_filter_descs[i]);
}
ms_message("Registering all soundcard handlers");
cm=ms_snd_card_manager_get();
for (i=0;ms_snd_card_descs[i]!=NULL;i++){
ms_snd_card_manager_register_desc(cm,ms_snd_card_descs[i]);
}
#ifdef VIDEO_ENABLED
ms_message("Registering all webcam handlers"
//(*p)[N] 指向由N个元素组成的一维数组的指针变量。 //p一定要指向行地址(p是按行动)。p是指向一维数组的指针。p的值即*p指向一维数组的起始地址(加*变成列地址) #include <iostream> using namespace std; int main() { int array_1[3]={7,8,9}; int array_2[2][3]={{1,2,3},{4,5,6}}; int (*p)[3]; int (*q)[3]; int i; p = &array_1; //一维数组中数组名array_1 默认代表的是行地址,取&变成列地址 cout<<*p<<endl; cout<<p<<endl; //p与*p都指向同一地址。但p是行地址,*q是列地址,即&q[0],表面上是*与&抵消又成p,但实际是行与列的区别 for (i = 0;i<3;i++) { cout<<(*p)[i]<<" ";//*p是列地址,即p[0] } for (q = array_2;q<array_2+2;q++) // 一维数组中数组名array_2 默认代表的是行地址 { cout<<q<<endl; cout<<*q<<endl; //q与*q都指向同一地址。但q是行地址,*q是列地址,即q[i][0],i表示第几行 cout<<(*q)[0]<<endl; //一维数组用这种。 cout<<*(*(q))<<" "<<endl; cout<<*(*(q+0)+0); //二维数组用这种 } return 0; }
(1)shell中的${},##和%%的使用部分
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值): ${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理) ${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.
重说二字恰如其分。“重”是因为书中叙述的中国近代史与我们从小到大从学校里教材上读到的有很大差别。当然从各种网上资源和书报电视,我们已经知道教科书上的历史许多地方与真实历史的差别,就像新闻联播和现实生活的差距一样。但是以一本书系统地将已从其他渠道得到还原的历史片段连贯地展现出来,还是有令人耳目一新的感觉。“说”是缘于本书基于张鸣教授的讲课实录,是用口语说历史,不是用书面语写历史。短小活泼的语言让读者如同身临课堂,读起来轻松酣畅。
发生得越近的事情,对人影响越大。剧烈动荡日新月异的近代,不仅是两千年未有之变局,而且是现在中国社会种种因素和侧面的源头与肇因。其纷繁之程度,资料之丰富,远非更早的数千年古代历史可比。对这段历史的认识,无疑会影响对当今中国的解读和社会的理解。官方教科书过去给了我们一套人民反帝反封建斗争的阶级史观,学者的著作、电视台的纪录片、报纸杂志和网络上的文章,则越来越多给出另一种史实和另一面观点。真正能够达到客观无争议的只有冷冰冰的事实,某年某月某日谁做了什么,细节如何。其他一切的看法、分析、观点、思想都是因人而异的主观价值判断。但是人的大脑不可能是书架和硬盘,不可能只装进事实而不产生想法。那么是一种思想统一天下好,还是百家争鸣好?既然都是价值判断,各家之说有无优劣高下?前一个问题无需多论。思想之多样性是人的天性。人之所以为人就是因为有感情和理智。不同人之间思想上的差异比不同物种身体的差异还大。观点的歧异不应也无法取消,百家争鸣就算听起来嘈杂喧闹也比一种声音的单调响亮好。后一个问题似乎会导致相对主义,每个人都有理由各持己见,那官方的观点不也是一种选择?观点之成立有两个前提,一是所基于的事实正确,二是所系于的逻辑无误。革命史观之不能令人信服,就是因为不符合这两项标准。官方口径里的史实存在大量颠倒混淆和以偏概全,用以建立观点的逻辑又不严密。要在各种史观里鉴别和剔除这样的莠误,并不困难,只要放任学者自由研究,公开辩论,伪自然会暴露,错也会被揭出。排除这些后,观点仍会是多元的。我们常常看到,即使对一个人,各方都可能有截然不同的评价,更何况对一个国家一个时代这样复杂的对象。其实这就像盲人摸象,每个人都根据自己获得的局部真实,依照各自的禀赋和倾向,得出结论。历史不是自然科学,除了客观发生的事情,人和人的思想本身也是史实,对他们的评价也不可能是测量出的数据,这种本质就决定了史观之多样性。
在这样的大前提下,读一本中国近代史就不单纯是记忆和接受,更要加上思考和判断。事实部分根据来源和与其他信息的参照,很快就能接受。观点和分析,最重要实际上也是唯一的评判工具就是思考它有无逻辑错误,是否有说服力。只要能自圆其说,便能成为一说。读完这本书,有倾服的见解,有了解的,有不能苟同的。对于历史,人人有经过比较和思考形成的自己的看法,这或许才是最自然和理想的。
读本书还有一个印象,时间晚近的部分讨论得有些仓促粗略。从鸦片战争到清廷新政,论述得一直有条不紊,全面覆盖,整体推进,事实的叙述穿插解释分析,而论点又进一步得到验证和发展。到了辛亥革命和北洋政府时期,就仿佛失去了整体的历史图景,只是取一些事件和人物来阐述,时代的其他方面一笔带过,有支离破碎之感。这应该是限于原课程的重点和篇幅,还有就是民国以来的人物和活动更加纷呈,于今天而言也仍有些敏感,只好这样处理。
shutdown的几种方式,shutdown abort的一些弊端有哪些 1、shutdown normal 正常方式关闭数据库。 2、shutdown immediate 立即方式关闭数据库。 在SVRMGRL中执行shutdown immediate,数据库并不立即关闭, 而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源), 当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。 3、shutdown abort 直接关闭数据库,正在访问数据库的会话会被突然终止, 如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间 -------------------------------------------------------- shutdown abort 的时候,跟kill 进程是一样的效果 数据库立即关闭,这个时候文件状态可能不一致 因为正常关闭数据库会同步校验各文件,使得重新启动的时候文件时间点一致并且不用进行崩溃恢复 若检查点信息一致,则做崩溃恢复 若检查点信息不一致(正好在更新文件头)则需要做介质恢复 这些问题都好处理,最怕的问题是这个时候系统有大量IO,结果这样造成写的突然中断,碰巧造成文件块的逻辑坏块,那麻烦比较大一些,尤其是系统表空间的block损坏 虽然shutdown abort 出错的几率很小,1000个人可能只有一个人碰到,但是我们还是要小心。 正确的处理流程是,shutdown immediate ,若数据库迟迟不能down下来,在os上观察IO状况,几乎没有io的时候,另开一窗口shutdown abort ,几乎不会出问题了
从2.6.31内核开始,linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找。
perf Performance analysis tools for Linux.
Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things
performance analysis. It covers hardware level (CPU/PMU, Performance Monitoring Unit) features and
software features (software counters, tracepoints) as well.
Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。
它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。
常用于性能瓶颈的查找与热点代码的定位。
CPU周期(cpu-cycles)是默认的性能事件,所谓的CPU周期是指CPU所能识别的最小时间单元,通常为亿分之几秒,
是CPU执行最简单的指令时所需要的时间,例如读取寄存器中的内容,也叫做clock tick。
Perf是一个包含22种子工具的工具集,以下是最常用的5种:
perf-list
perf-stat
perf-top
perf-record
perf-report
perf-list Perf-list用来查看perf所支持的性能事件,有软件的也有硬件的。
List all symbolic event types.
perf list [hw | sw | cache | tracepoint | event_glob]
题目描述 Description 对于一个素数P,我们可以用一系列有理分数(分子、分母都是不大于N的自然数)来逼近sqrt(p),例如P=2,N=5的时候:1/1<5/4<4/3<sqrt(2)<3/2<5/3<2/1。 任 务 : 给定P、N(N>sqrt(p)),求X、Y、U、V,使x/y<sqrt(p)<u/v且x/y与sqrt(p)之间、sqrt(p)与u/v之间都不能再插入满足题意的有理分数。
输入描述 Input Description 输入文件的第一行为P、N
输出描述 Output Description 输出文件只有一行,格式为“X/Y U/V”。注意,答案必须是既约的,也就是说分子、分母的最大公约数必须等于1。
样例输入 Sample Input 样例1: 2 5 样例2: 5 100
样例输出 Sample Output 样例1: 4/3 3/2
样例2: 38/17 85/38
数据范围及提示 Data Size & Hint P、N<30000
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 说实话,这道题真的把我唬住了……
刚看到这道题,感觉明显的二分,可是如何分?怎么分?是一个问题。
于是我想我没可以枚举分子和分母,然后找最接近的,然而 P、N<30000这的把我唬住了…
…尽管我看见了gcd(分子,分母)=1这个提示,但是我还是没有去写它(事实证明,这题很水,暴力可以a)
在时间竟破的情况下,我选择了放弃……
中午评测完以后,我发现,我们可以枚举固定区间内的分子,因为分母是从2-n的,那些远大于 分母*(p)^(1/2)的分子
是没有必要去枚举的。所以我们可以取(p)^(1/2)的上界和下界(即上下取整)这样我们可以把每一个分母的分子限制
在一个很小的区间内,再加上gcd(分子,分母)=1,还有二分枚举答案,这题就可以过了。
由于本人不会写二分,所以,我开了一个大根堆,一个小根堆来维护。看来,今晚还要补习一下二分了!!
注意:有可能输出如1/1或者2/1的情况!!
+++++++++++++++++++++代码如下++++++++++++++++++++++++++++++++++++
<span style="font-family:Comic Sans MS;font-size:18px;">#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <vector> using namespace std; struct node1{ int son,mot;double w; bool operator < (const node1 &a) const { return w<a.
最近经常碰到这个问题,当使用ArcGIS10.2(可能跟版本无关)连接SDE时,会碰到一个错误:
unable to create new database connection file,permission is denied。 这个问题很诡异,因为创建企业级地理数据库成功,但是连接SDE出现问题,细致的看一下报错信息,发现是没有权限创建连接数据库的文件,也就是说地理数据库并没有问题。
一般情况下以ArcGIS10.2 for Desktop为例,默认的ArcSDE连接文件(*.sde)默认存储在:
C:\Users\Esri\AppData\Roaming\ESRI\Desktop10.2\ArcCatalog 路径下,凡是出现该问题的操作系统环境,肯定只有 C:\Users\Esri\AppData\Roaming\ESRI\Desktop10.2\,并没有创建ArcCatalog文件夹,所以系统就找不到默认存储sde连接文件的文件夹,也就报了上面的错误。 解决方法: 用户手动创建ArcCatalog文件夹即可。 延伸错误: 凡是操作系统环境中报有上面的错误的软件,使用ArcCatalog导入数据肯定会出现000732的错误,当然解决方法很简单了,用户可以参考: ArcGIS桌面经验之谈(一): http://blog.csdn.net/linghe301/article/details/6236373 导致原因: 因为这个问题不是任何用户都能碰到的,所以无法望美国提交该问题,个人觉得导致问题的原因是杀毒软件或者安全卫士的问题,比如安装了360,或者使用360进行过垃圾整理文件删除。用户以后再安装ArcGIS for Desktop之前,要么卸载,要么全部关闭。目前该问题只是怀疑而已! .
个人出版专著,国内首部介绍企业级GIS地理数据库的技术书籍,淘宝、京东、当当、亚马逊均有销售 如果购买书籍,可以加入QQ群(78773981)将截图QQ我,邀请加入VIP群,获得更加优质服务。 微信号:arcgis_share
名称:ArcGIS技术分享
作者:李少华
CSDN:http://blog.csdn.net/linghe301
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
1、RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口。
RESTful接口URL的格式:
http://localhost:9200/<index>/<type>/[<id>]
其中index、type是必须提供的。
id是可选的,不提供es会自动生成。
index、type将信息进行分层,利于管理。
index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。
2、索引文档的创建 将如下一条歌曲信息的数据提交到ES中创建索引: url:http://127.0.0.1:9200/song001/list001/1 data:{"number":32768,"singer":"杨坤","size":"5109132","song":"今夜二十岁","tag":"中国好声音","timelen":319} 索引名字是:song001;
索引的类型是:list001;
本记录的id是:1
返回的信息可以看到创建是成功的,并且版本号是1;ES会对记录修改进行版本跟踪,第一次创建记录为1,同一条记录每修改一次就追加1。
至此一条记录就提交到ES中建立了索引,注意HTTP的方法是PUT,不要选择错了。
3、索引文档的查询 根据索引时的ID查询的文档的RESTful接口如下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法采用GET的形式。
4、索引文档的更新 根据索引时的ID更新的文档的内容其RESTful接口如下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法采用PUT的形式。
将歌手名由“杨坤”改成“杨坤独唱”;
结果中的version字段已经成了2,因为我们这是是修改,索引版本递增;created字段是false,表示这次不是新建而是更新。
更新接口与创建接口完全一样,ES会查询记录是否存在,如果不存在就是创建,存在就是更新操作。
5、索引文档的删除 根据索引时的ID更新的文档的内容其RESTful接口如下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法采用DELETE的形式。
删除过后,再通过查询接口去查询将得不到结果。
总结: 增删改查的RESTful接口URL形式:http://localhost:9200/<index>/<type>/[<id>]
增删改查分别对应:HTTP请求的PUT、GET、DELETE方法。PUT调用是如果不存在就是创建,已存在是更新。
数据文件的操作按以下步骤进行:
打开数据文件(首次操作为建立数据文件并且打开)
进行读写操作
关闭数据文件
1、文件的打开
格式:
Open 文件名 For 方式 [Access 存取类型] [lock] As [#]文件号 [Len=记录长度]
文件名:数据文件的名字,该文件名可能还包括目录、文件夹及驱动器。
方式:指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。
Append:顺序输出(写入数据文件)
Binary:二进制方式(读写)
Input:顺序输入(读出数据)
Output:顺序输出(写入数据文件)
Random:随机(读写)
存取类型:说明打开的文件可以进行的操作,有 Read(读)、Write(写)、或 Read Write(读写) 操作。
Read(读):只读文件
Write(写):只写文件
Read Write(读写):读写文件,在随机文件和二进制文件和Append方式下有效。
Lock:说明限定于其它进程打开的文件的操作。有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。
Lodk Shared:所有进程都可以对此数据文件进行读写操作。
Lock Read:不允许其他进程进行读操作。
Lock Write:不允许其他进程进行写操作。
Lock Read Write:不允许其他进程进行读写操作。
文件号:一个有效的文件号,范围在 1 到 511 之间。
记录长度:对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。
功能:
打开指定的文件。
如果指定的文件不存在,在用 Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。
如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。
常量与变量 • Objective-C中声明常量使用关键字const:
• const double PI = 3.141592654;
• Objective-C中变量可以分为成员变量、局部变量和全局变量。 int gCounter;//全局变量 @interface MyObject : NSObject { int counter;//成员变量 }@end @implementation MyObject -(void) print { int cter = 0;//局部变量 NSLog(@"%i", cter ); }@end 运算符与表达式
运算符可以分成如下几种:
•算术运算符,+,―,*,/,%,++,――
•关系运算符,>,<,>=,<=,==,!=
•布尔逻辑运算符,!,&&,||
•位运算符,&,|,^,~ ,>>,<<
•赋值运算符,+=,―=,*=,/=
•条件运算符,? :
前面转发了篇博客介绍了MTP, 偏重于上层,已经很清楚了。这篇侧重于底层,按照一定的流程讲。
1. 代码位置
packages/providers/MediaProvider/src/com/android/providers/media/MtpReceiver.java
packages/providers/MediaProvider/src/com/android/providers/media/MtpService.java
packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
frameworks/base/media/java/android/mtp/MtpServer.java
frameworks/base/media/java/android/mtp/MtpDatabase.java
frameworks/base/media/java/android/mtp/MtpStorage.java
frameworks/base/media/java/android/mtp/MtpPropertyGroup.java
frameworks/base/media/java/android/mtp/MtpPropertyList.java
frameworks/base/media/java/android/mtp/MtpConstants.java
frameworks/base/media/jni/android_mtp_MtpServer.cpp
frameworks/base/media/jni/android_mtp_MtpDatabase.cpp
frameworks/av/media/mtp/MtpServer.h
frameworks/av/media/mtp/MtpServer.cpp
frameworks/av/media/mtp/MtpDatabase.h
frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java (UsbManager, UsbService)
kernel/drivers/usb/* (主要是android.c, f_mtp.c)
2. 在Settings设置mtp后,代码执行 Usbanager.SetCurrentFunction() ->UsbService.SetCurrentFunction()
->UsbDeviceManager.setCurrentFunctions()
-> mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS)
->setEnabledFunctions(functions, makeDefault);
->SystemProperties.set("persist.sys.usb.config", functions);
此时会调用到init.usb.rc执行相应的代码
如果直接开机,开机时会在设置persist.sys.usb.config/sys.usb.config时执行init.usb.rc中代码(没有经过framework及以上代码)。
write /sys/class/android_usb/android0/enable 0/1
以上代码对应执行enable_store (android.c)
enable_store
1)enabled
f->enable(f_holder->f);
adb_android_function_enable
android_disable
usb_ep_dequeue
usb_remove_config
android_enable(dev);
usb_add_config
usb_gadget_connect
2)disabled
android_disable(dev);
usb_ep_dequeue
usb_remove_config
f->disable(f_holder->f)
adb_android_function_disable
usb_add_config(android_bind_config) composite.c
bind()
android_bind_config()
android_bind_enabled_functions()
f->bind_config()
mtp_function_bind_config(mtp)
adb_function_bind_config(adb)
-> usb_add_function()
usb_remove_config() reset_config(cdev);
(1)win下安装
原文链接:http://xserver.iteye.com/blog/726908
因oracle应用程序及其工具toad、PLSQL Developer等的部署很多,动辙要安装几百兆的Oracle Client实在很烦。 Instant client小而够用。这里共享出自己的经验,供同行参考,如果能给你帮助,荣幸之至。 运行环境:windows XP sp3,新安装系统,从未安装过任何版本Oracle 1、下载Instant Client http://www.oracle.com/technology/software/tech/oci/instantclient/index.html 下载: instantclient-basic-win32-11.1.0.7.0.zip instantclient-sqlplus-win32-11.1.0.7.0.zip 这两个文件,看名字就知道意思了,如果你只用客户端工具,不使用命令行下sqlplus,第二个包可以不用 2、解压缩包到C:\instantclient_11_1 3、设置变量: NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK(注意中间有空格,这个如果不设,toad查询中文会是乱码) TNS_ADMIN=C:\instantclient_11_1 Path=C:\instantclient_11_1 4、保存以下内容为注册表文件,导入注册表(路径部分,请自己修改) Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1] "NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" "ORACLE_BUNDLE_NAME"="Enterprise" "ORACLE_GROUP_NAME"="Oracle - OraClient10g_home1" "ORACLE_HOME"="c:\\instantclient_11_1" "ORACLE_HOME_KEY"="SOFTWARE\\ORACLE\\KEY_OraClient10g_home1" "ORACLE_HOME_NAME"="OraClient10g_home1" 5、建立tnsnames.ora,并保存到安装目录:C:\instantclient_11_1 这个这里就不多说了 # tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\client_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) 6、测试: C:\Documents and Settings\Administrator>sqlplus /nolog SQL*Plus: Release 11.
今天学习的是Django的Model Query,前一篇已经学习过Model了,讲述的主要是Django中是如何处理关系型数据的模型的,一对一,多对一,多对多等,这篇则主要是描述的查询,能够将数据存进去,还得取出来,Django给每一个Model自动提供了丰富的查询接口,而且能够进行关联查询,基本上,能够满足绝大多数的查询需求。
在Django的文档中,有一句话说的非常好:
A model class represents a database table, and an instance of that class represents a particular record in the database table.
Model类的实例代表的是数据库中的记录,我们在进行查询的时候,得到结果一般都是一个数据库记录集合,这对应到Django里,就是QuerySet,Django提供的查询接口全都封装在QuerySet中,比如filter(), order_by()等,这对应到SQL语句,就是SELECT语句。这里我们只对经常用到的QuerySet方法进行简单描述,起到一个勾起回忆的作用,至于更多的内容还请参考QuerySet详细的API:QuerySet API。
先构造几个有关联关系的Model:
from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): return self.name class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __unicode__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.
//整理之,分享之,欢迎指正。for_wind 1、nonstatic member functions 其至少和一般的nonmember function 有相同的效率。编译器内部已将“member函数实体”转换为对等“nonmemer函数实体”。 转换步骤: 改写函数原型(signature),以安插额外参数this指针改由this指针存取nonstatic data member;name mangling处理函数名称成独一的外部函数名,以及进行name return value的优化
2、virtual member functions 调用的两种方式: 1)经由一个class object调用一个virtual function,编译器将其视为一般的nonstatic member function进行resolved。 2) 经由指针或引用调用,通过vptr,指向virtual table,通过其内的索引值,关联到该虚函数。 执行期多态: 以一个public base class的指针(或引用),寻址出一个derived class object。 具体: 准备工作:安插vptr指向该表格;给每一个virtual function指派一个表格索引值。 执行期任务:在特定的virtual table slot中“激活”virtual function。 一个class只会有一个virtual table。每一个table内含有其对应的class object中 所有active virtual functions函数实体的地址。 这些 active virtual functions包括: (1)这个class 所定义的函数实体,改写(overriding)一个可能存在的base class virtual function函数实体。 (2) 继承base class 的函数实体。 (3) pure_virtual_called()函数实体。(表示pure virtual function,或有时当作执行期异常处理函数) 多重继承下的virtual functions 其复杂度在于第二个及后继的base class 身上,以及“必须在执行期调整this指针”。 调整方法:thunk技术,address points技术(微软) 虚拟继承下的virtual functions 建议:不要在一个virtual base class 中申明nonstatic data members。因为太过复杂。 3、static member function 其主要特性: 没有this指针 相关次要特性: 不能够直接存取其class 中的 nonstatic members不能够被申明为const, volatile 或virtual不需要经由class object才被调用,虽然经常这样用。 取一个static member function的地址,获得是其在内存中的位置,其地址类型是一个nonmember函数的指针 注:this指针把“在member function存取的nonstatic class member”绑定于“object内对应的member”上。 参考资料及推荐资料: 深度探索C++对象模型
一、ExecuteNonQuery方法 :执行非查询SQL操作,包括增insert、删delete、改update;ExecuteNonQuery()方法执行SQL语句并且不返回数据。
public static int ExecuteNonQuery(string strSql, SqlParameter[] parameter)
{
SqlConnection sqlConn = new SqlConnection(strConn);
SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
if (parameter != null)
{
sqlCmd.Parameters.AddRange(parameter);
}
sqlConn.Open();
int objResult = sqlCmd.ExecuteNonQuery();
sqlConn.Close();
return objResult;
} 二、ExecuteDataset会运行你的基本SELECT(选择)查询并生成一个DataSet,然后就能够被绑定到服务器对象上,或者被用来创建DataView(数据视图)。
public static DataSet ExecuteDataSet(string strSql, SqlParameter[] parameter)
{
SqlConnection sqlConn = new SqlConnection(strConn);
SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
SqlDataAdapter sqlAdp = new SqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
sqlAdp.Fill(ds);
return ds;
}
<span style="
=====================================================
最简单的基于FFmpeg的推流器系列文章列表:
《最简单的基于FFmpeg的推流器(以推送RTMP为例)》
《最简单的基于FFMPEG的推流器附件:收流器》
=====================================================
本文记录一个最简单的基于FFmpeg的推流器(simplest ffmpeg streamer)。推流器的作用就是将本地的视频数据推送至流媒体服务器。本文记录的推流器,可以将本地的 MOV / AVI / MKV / MP4 / FLV 等格式的媒体文件,通过流媒体协议(例如RTMP,HTTP,UDP,TCP,RTP等等)以直播流的形式推送出去。由于流媒体协议种类繁多,不一一记录。在这里记录将本地文件以RTMP直播流的形式推送至RTMP流媒体服务器(例如 Flash Media Server,Red5,Wowza等等)的方法。
在这个推流器的基础上可以进行多种方式的修改,实现各式各样的推流器。例如: * 将输入文件改为网络流URL,可以实现转流器。 * 将输入的文件改为回调函数(内存读取)的形式,可以推送内存中的视频数据。 * 将输入文件改为系统设备(通过libavdevice),同时加上编码的功能,可以实现实时推流器(现场直播)。 PS:本程序并不包含视频转码的功能。
简介 RTMP推流器(Streamer)的在流媒体系统中的作用可以用下图表示。首先将视频数据以RTMP的形式发送到流媒体服务器端(Server,比如FMS,Red5,Wowza等),然后客户端(一般为Flash Player)通过访问流媒体服务器就可以收看实时流了。
运行本程序之前需要先运行RTMP流媒体服务器,并在流媒体服务器上建立相应的Application。有关流媒体服务器的操作不在本文的论述范围内,在此不再详述。本程序运行后,即可通过RTMP客户端(例如 Flash Player, FFplay等等)收看推送的直播流。 需要要注意的地方 封装格式RTMP采用的封装格式是FLV。因此在指定输出流媒体的时候需要指定其封装格式为“flv”。同理,其他流媒体协议也需要指定其封装格式。例如采用UDP推送流媒体的时候,可以指定其封装格式为“mpegts”。 延时发送流媒体的数据的时候需要延时。不然的话,FFmpeg处理数据速度很快,瞬间就能把所有的数据发送出去,流媒体服务器是接受不了的。因此需要按照视频实际的帧率发送数据。本文记录的推流器在视频帧与帧之间采用了av_usleep()函数休眠的方式来延迟发送。这样就可以按照视频的帧率发送数据了,参考代码如下。 //… int64_t start_time=av_gettime(); while (1) { //… //Important:Delay if(pkt.stream_index==videoindex){ AVRational time_base=ifmt_ctx->streams[videoindex]->time_base; AVRational time_base_q={1,AV_TIME_BASE}; int64_t pts_time = av_rescale_q(pkt.dts, time_base, time_base_q); int64_t now_time = av_gettime() - start_time; if (pts_time > now_time) av_usleep(pts_time - now_time); } //… } //… PTS/DTS问题没有封装格式的裸流(例如H.
在做安卓程序的时候,我们经常要调试程序,但是我们在开发的时候发现
程序只能run,不能debug ,界面一直停在waiting for debug 无法调试
经过在网上搜索
1 重启ADB,eclipse,电脑无效
2 重新安装驱动无效
3 重装ADT无效
最后解决的办法以及原因
解决办法:卸载360手机助手,手机上也卸载,恢复正常,能run,能debug
原因分析:
1 如果你观察仔细,你会发现在ADT的devices列表里面能显示设备,
并且能查看设备里面的文件,而在出问题的设备你只能看到设备名,不能看到设备文件
这表示设备运行配置不正确。如果你可以看到里面的文件,那么表示你肯定能debug
2 造成这种原因是adb和其他程序冲突,360手机助手也会链接到安卓手机,adb也要链接到安卓手机,造成冲突
解决办法就是卸载或者完全关闭360手机助手之类的软件,防止和ADB抢手机资源造成冲突
//gdb调试相关的学习笔记~ for_wind 用GDB调试程序 http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F GDB的基本工作原理剖析 http://www.embeddedlinux.org.cn/html/xinshourumen/201304/06-2530.html 通过一个系统调用:ptrace。说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册) gdb的启动 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先 在编译时,我们必须要把调试信息加到可执行文件中。使用编译器( cc/gcc/g++)的 -g 参数可以做到这一点。如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行 时的内存地址。
gdb命令 我们简要介绍一下在gdb调试中需要用到的命令字
file [filename]
装入想要调试的可执行文件
kill [filename]
终止正在调试的程序
break [file:]function
在(file文件的)function函数中设置一个断点
clear
删除一个断点,这个命令需要指定代码行或者函数名作为参数
run [arglist]
运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序)
bt Backtrace
显示程序堆栈信息
print expr
打印表达式的值
continue
继续运行您的程序 (在停止之后,比如在一个断点之后)
list
列出产生执行文件的源代码的一部分
next
单步执行 (在停止之后); 跳过函数调用(与step相对应,step会进入函数内部)
nexti
执行下一行的源代码中的一条汇编指令
set
设置变量的值。例如:set nval=54 将把54保存到nval变量中;设置输入参数也可以通过这个命令(例如当三个入参分别为a、b、c的话,set args a b c)
step
PackageInfo packageInfo;
try { packageInfo = this.getPackageManager().getPackageInfo( "程序的包名", 0); } catch (NameNotFoundException e) { packageInfo = null; e.printStackTrace(); } if(packageInfo ==null){ System.out.println("没有安装"); }else{ System.out.println("已经安装"); }
Qt图片显示效率的比较 转 Posted on 2012-03-13 16:06 Finley 阅读( 533) 评论( 0) 编辑 收藏 转http://blog.sina.com.cn/s/blog_5c70dfc80100r257.html 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不能够直接显示出来,要想能看到图片,初步发现有两种方法。
一、QImage转QPixmap,然后用QLabel::setPixmap() image=new QImage("D:/Temp/XX.jpg");
pixmap=newQPixmap(); pixmap->convertFromImage(*image); label=newQLabel(this); label->setGeometry(100,0,1000,700); label->setPixmap(*pixmap); 二、在paintEvent()中直接画 void MyWindow::paintEvent(QPaintEvent*) { QPainter paint(this); paint.drawImage(0,0,*image); } 有两种方法,就有比较。经过试验发现,第一种方法效率更高,虽然代码开起来多了,但是经过优化用于显示的QPixmap能够体现出其优势。同样显示一幅1200*1600的图片,第一种方法几乎不需要时间,用毫秒计时显示为0,而第二种方法需要15ms,在需要大量运算的地方,15ms的差距区别可是相当大的。
这里主要是遇到两个问题:第一个是,自己编写的hal层源码怎么添加进Android的默认编译中去,也就是说在根目录执行make时,自己编写hal源码也会被编译。第二个问题是,编译完成后还要自动安装在指定的系统目录lib/hw下。
刚开始时不太了解,总是需要使用mmm来进行编译安装,但是打包之后再编译这是不现实的。为此需要添加到默认中去。
一般来说hal层所在的位置在hardware/libhardware/modules目录下。假如我写个led的hal层,那么在modules目录下建立一个led文件夹即可,在led文件夹添加代码和Android.mk。对于第一个问题的解决方法是,修改modules目录下的Android.mk文件,在hardware_modules变量中添加led文件夹的名字即可。这样在默认中就会自动编译这个led的文件了。
这样虽然可以编译了,但是却不会自动安装。那么安装这个要修改哪里呢,找了好久终于找到了,要修改device/samsung/smdkv210/device.mk这个文件中的PRODUCT_PACKAGES变量,在该文件的最后添加PRODUCT_PACKAGES += led.default这行代码即可。
有了以上两个修改,默认就会编译并且安装了,其他的也都类似了。
另外还有一个jni层的东西,这个修改添加的文件都是默认被编译安装的,只需要添加代码即可。
一段美妙神奇的代码-世界编程大赛一等奖作品(好像这个很老了,回味一下)
这是世界黑客编程大赛第一名的作品(97年Mekka ’97 4K Intro比赛),汇编语言所写。
整个程序全长4095字节, 生成.com程序只有4K!!
可是却实现了3D动画的效果!!!!还有一段!背!景!音!乐!!!!音乐啊!!我的天,怎么做到的!!!才4K大小啊!!!!!
画面是游戏天旋地转的一个场景!绝对牛! !!!!
下面是一段由英语字母和数字的组合,实际是一段代码,请按我的说的去做,你会拥有美妙的视觉和听觉享受。 操作简单: 1、把这段代码复制下来存为文本文档,命名为1,存放在C:\Documents and Settings\Administrator 2、再“运行”——CMD,在窗口中粘贴debug<1.txt,回车,享受就开始啦。
——————————以下为代码———————————— e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1 e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20 e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aa e14f 4a 75 f9 eb de cb 57 bb 21 13 8b c1 40 f7 27 f7 f5 8b fb ba 11 1 4f 4f 4a e168 39 5 7f f9 52 8b c5 f7 25 f7 37 2b c8 95 f7 65 2 f7 37 95 2b e8 fe e fe e181 10 79 6 c6 6 fe 10 7 46 d0 14 d1 d1 d1 e5 79 ec 5a b8 11 1 ff 7 4b 4b 48 e19b 3b d0 75 f7 5f c3 83 f7 83 a6 5d 59 82 cd b2 8 42 46 9 57 a9 c5 ca aa 1b e1b4 4f 52 b4 92 3f ab 6e 9e a8 1d c6 3 fc e 6a e7 ae bb 5f 7b 10 b8 b4 f7 8 e1cd e2 bf 36 4e 39 9d 79 29 3f a f9 36 52 16 fb 5 e8 e5 a6 c2 e9 b0 43 d3 a3 e1e6 cf d3 fd fd cb d1 4c 5e e0 63 58 86 bb 3e 9 c1 20 bc cc 91 a3 47 81 70 b3 e1ff d6 1a 9e c2 c9 12 e7 4e ad f4 5f e3 30 e9 9 39 d7 e8 f9 f4 d2 44 e8 d7 22 e218 be e2 ce 88 25 cf 30 4a a8 29 ae 3f 47 c6 2d 85 e9 73 54 13 b e6 e0 34 65 e231 e2 50 8a 89 18 5f ce 70 99 3 5f 42 bf eb 7 ae d0 ca 5 22 8d 22 a5 b7 f0 e24a 90 81 bc 7a bc dc 5 db c0 6a 2 e5 57 38 be 60 cb ac ba a5 3b 9d f1 77 38 e263 a6 84 d1 3c af 49 d8 6a 45 a2 76 60 21 12 c0 c2 44 f2 5e bb e5 37 a9 2b e27b ec 4a 8c 4c f2 f7 a9 58 71 2b ba 6d d6 6a e5 60 46 e0 da e5 b9 90 e5 a3 e293 f7 7f 31 60 58 f0 c4 88 10 4e 3c a3 ee 4e 11 55 8f a 92 eb db ad 7a 9c f e2ac db 5a 28 96 da 87 ae 91 91 2d e3 5e ea df 6 95 71 67 71 40 ce d1 2e 31 6d e2c5 c1 9c d8 6a 76 9b 4a e8 36 44 d6 76 d 30 5 ff d4 1b ac 1f 32 65 31 bf 55 e2de 26 b a4 55 e1 5d 5e 16 ed 97 48 6c 77 fb 81 86 e f9 18 bd d4 f4 8b de 1d e2f7 ba d 47 75 3 89 4b 3e dc 27 86 1c d0 17 89 48 d1 a6 8d d4 2b 54 4e 8f b0 e310 2 e1 6b 1a 75 78 ea 21 91 13 c0 cf 78 a0 ab f3 35 c6 b4 c8 90 8d d7 45 e7 e329 c 5b a4 ba 52 10 64 f5 4a 50 b7 ec 46 22 15 23 84 30 81 5c df 61 5a 8f 67 e342 c4 63 57 6d f7 26 92 a3 1f e5 3 a5 0 54 41 8 48 7c 26 90 33 82 9c 91 b0 e35b ab 78 5d df 99 e0 b9 fc 5 36 ac d9 49 91 ab 20 a2 63 48 89 ce 5c 60 64 f0 e374 63 d9 a8 38 3b d3 e6 4c 8c 23 34 4e 20 51 93 5e 6d b4 7a 22 9b 4c f2 d3 e38c c4 f8 3 6f 47 40 f4 f8 45 9b 83 f3 83 6 31 d0 0 17 82 83 dc 67 f9 62 77 e3a5 90 3b d9 ec f3 55 96 b8 d9 db 79 55 f1 e5 8c 5e f2 e5 2e b0 b 6e e2 81 25 e3be 93 8e b5 dd 5b 46 f9 af ed 6 12 cf c9 1d f0 f7 3b 16 2d c6 58 73 8d e9 5f e3d7 fd 5a b6 a1 94 4d 1a 8 ff eb b7 6 80 c7 86 83 b6 b9 fd 1c e0 c c3 2e a0 e3f0 2f b 3e 3 6b 29 e1 27 85 1c ea 6d df b3 a3 ed 65 4a 9a 59 3b 54 e 4b ae e409 9e 27 f0 4d 3b c 4c 46 b7 e5 57 1b 1f 1f bb 80 86 f5 b7 ef 73 52 bf 2c c7 e422 ed a b7 81 2 f3 90 3e ee cc 6c eb f 38 1 6c 68 b1 d 45 78 b2 f f6 83 b0 e43c c4 33 df b1 d1 91 98 1e 81 a5 e2 59 9f f4 8c b6 72 8 a7 8c f6 e a3 b2 1f e455 d9 d3 23 f0 7c 5e 5f 68 61 8b 45 da 1d 91 ec 8d 4e ea 1a 38 85 94 aa ac e46d f2 4 f6 c4 e5 92 8e 9a 4e 83 e1 73 e8 cf 2a 5c 2b 7e f1 30 2 8a e6 28 1a e486 3b ce bc 96 aa 7f eb 87 cd 8b 96 2d 9 59 7a a0 1a 43 62 9a 9e 4f ff 8e d9 e49f ce d6 a4 70 79 cd 65 fa 2e 92 14 29 f7 6c 74 4b 49 60 80 bb ff 41 bb 2d e4b7 60 33 3f 98 77 9a 1 ee a6 a3 da bc ba e9 f3 72 f4 7c c3 59 2 a6 44 a4 c8 e4d0 c8 54 93 ce bd 69 bb b9 43 21 2c c4 ea 4a 5c 3f 75 60 f2 b4 91 ca 9 82 e3 e4e9 a e9 a6 20 b9 76 50 ed 47 e9 fe 6d 41 34 13 2f 28 2f 4e f4 da e 3c 78 6c e502 b1 79 87 45 98 a4 d4 c3 b3 29 c2 4a 8b ed a6 54 e2 1b 31 62 60 ff 2c 1d e51a 21 0 15 b2 4e 5c c 2 d 83 fa a2 f3 8a 5 12 72 4a c7 44 7c 91 d4 be b a f2 e535 70 52 fb b4 a2 df 89 de ff c4 96 73 c9 c ed d3 c9 8e 5c dc 8e d1 3b de 8c e54e 53 a2 8b f9 e9 91 dd d6 df 6e 74 d1 dd 34 60 8f 9e 32 7f 3b ec 79 a3 83 e566 45 78 b4 2f 1c 50 7b 7a 97 b0 9d 2d c dd 8a 26 cd 7d 8c 4c 5a 8a 4c f9 a4 e57f 11 f9 2c 6c 92 e9 b5 cb 56 89 8c be f6 64 fa 25 43 fa 6f e2 c8 3a 18 a8 e597 f0 e9 f4 c2 86 e6 2b 44 67 4a b9 34 9 ed 5f 33 42 62 d4 8a 1e 5b 31 67 cd e5b0 3d 71 6d 83 fd 36 20 69 ea 1 c3 e6 e6 de 99 aa 7 11 5b 59 8a 1f 43 83 52 e5c9 ea 5d 8c 6a 69 c7 3 eb 4e 3b 88 a5 5f b1 6e 27 5f 3 5c 28 c 9b 6c c3 f8 e5e2 e5 b9 d6 11 d6 8b fa 5c 8 c7 1 eb 45 db f3 6c 9f 16 46 61 51 ed df f bb e5fb c0 c4 1e 64 68 98 4 79 30 94 72 df d4 cd 1f 7f 72 c6 82 2e 79 47 4e 8c 4b e614 a2 c7 e2 36 df 76 fd a4 b6 4e db 96 40 3b 8b b5 d4 85 64 c6 0 2c ad 9d 27 e62d 14 99 82 4b bc 9 fa 94 b5 db 7c 98 eb b 13 a7 b0 79 1d 7e c5 45 aa 20 49 e646 be ff 9d 64 0 5d c ec 6 5 ad f2 38 6b ed 7a d6 b2 c7 2e 6a a6 12 4b ff 55 e660 20 3b a 77 f b9 0 9d 57 4a ad ce a4 d3 ff 1 4f fb 53 54 88 f 1 ed 4b 56 e67a 15 c8 dc 28 bf f2 72 d4 10 1f 99 42 69 9e 78 e2 47 82 93 31 d0 2d be 9f e692 93 93 9a 1b 80 c0 10 c 53 78 a0 26 2a 96 4f 74 4b 16 c7 9c 8d ad ac fb 16 e6ab 15 c6 fd c9 a4 14 48 62 47 20 c9 41 ed 61 f8 9b f8 ff ba 39 50 65 87 ee e6c3 bd ce 95 c0 fb a5 7e d8 cd 27 fd 2c 74 3 c1 1b 89 b9 51 d5 e3 da ef 9e 6 e6dc f0 aa a9 a7 fb 87 4c 5d cd ff 65 36 8c 73 6f 9 c6 78 9a b6 77 db df 81 68 e6f5 3b b8 ae 5d e1 af d4 e6 66 8c d6 a4 83 9f 37 3c 1 dc a2 a6 57 c2 20 1b 90 e70e 75 df cd a5 62 a5 36 79 fb 35 8a 9b b0 a0 a5 c3 37 6f 80 72 bc 52 30 8d e726 9f 7a 64 d3 7 41 45 d8 68 97 f2 aa 1c a1 6c 7c 9d 32 7d ad 15 b1 53 e3 33 e73f 8a ed e9 49 d4 cf dc 96 22 37 36 11 9d 7f f0 4d e0 62 31 b1 c7 69 c4 79 e757 ac 20 1 e8 3c 6a 8c 32 cb 52 63 36 68 f4 10 2b 9c 21 4f df 5d 60 92 39 91 e770 e2 f9 c9 7d ca 48 3 3f 21 dd 6c f 23 2e 61 3a 9f ba c3 f9 4e 7 ea ed ef e789 71 4a 72 3a ed 23 3d 77 b5 ed d5 1d f6 a4 99 fa ef 98 dd 2 98 80 b6 7c a3 e7a2 62 96 7b 8e bf 7b 81 9f 9a ce 3f 12 40 2e 25 db 84 16 dd 2e 86 f f4 b2 7e e7bb 5e b4 14 6a f3 29 b1 a4 57 d5 a8 17 6f 87 a4 74 5b 9b 17 79 f1 ec 33 c8 e7d3 f0 1d b2 7e a8 4d 95 7f 5f 9 d5 1a 5a 45 f4 41 c6 d 3f eb 66 2a c0 e8 5b e7ec 3c bd 50 ad f1 53 9d 2e 45 9a d8 7d 2c 17 a8 6e 15 48 13 39 53 ed 3d 78 e804 ad f 3a 65 a3 3e 2e fa ca 7 94 4a 1f b4 d8 7e 47 8a 8e de e7 7e 34 c1 69 e81d 7f 6a aa 66 58 18 31 24 72 13 22 34 8a 56 36 87 df c2 d 8e 3f 71 a2 5f 25 e836 8b 8d 4 78 fd c9 45 d1 55 79 c1 9f 13 84 1b c8 5 db 95 d0 7c 64 96 20 51 e84f c4 e0 5e ee 47 8a 11 ac fb 9 e0 bb 40 db 86 84 12 93 b9 c9 f2 9c 63 47 c9 e868 eb ad 1 3e fa 6d 3f a 64 5b 58 56 27 f ca 5d e0 30 bc 3e 10 5d ec 17 28 e881 85 5 51 8e 95 a3 94 3a a8 f1 96 f2 f 29 5c 97 dc 47 db 9d 6c 63 e8 e7 f0 e89a e4 a 70 f8 f1 47 54 d3 2d 32 7c ef bb 9a b4 1b 0 2b d6 dd e7 30 b a2 75 e8b3 c7 f5 d0 31 d7 d2 8a b0 ac 1c 6d 60 3a f7 c2 db 1e 6d 7 f6 8f 35 88 e5 7f e8cc 3c 26 81 34 a0 32 a3 25 18 6e 73 b2 a0 f1 cb 86 61 e7 65 8b 76 98 19 6f e8e4 c0 62 9b a3 cc 18 5e 40 12 97 2b d0 15 79 de 19 ea df 7a 59 2f b5 d7 39 e8fc 52 e2 6 f1 3 a0 a5 d9 1b 88 93 4d 30 c8 2d f5 db 55 ea 85 6f a 3f dc bd e915 57 15 6a a3 a3 3e 8e ad 2d da a0 ca 75 7c 57 8b c5 cb b 1d 2c 8e c6 96 2e e92e 6d 59 83 7d 64 72 ca 80 2e 6 a4 ff f6 f2 d5 1e 7 4 ba 34 6e 9 86 25 aa 4e e948 e0 7f f5 32 47 3e 7c 43 d8 28 c4 1c 11 1d bd 33 3 b5 ca 13 43 34 2 b1 a0 e961 57 ed 9d 3c 23 d4 45 b2 6e 81 6e af 3e 67 90 be 59 a5 45 34 53 46 85 d1 e979 25 ee 7d cb a4 db 12 c3 aa 17 61 9a fb 66 40 76 fe 3a 69 96 c0 91 14 a7 e991 5d cc 9f f6 73 59 ee b8 55 97 20 26 ff 99 ec 72 41 b5 27 21 6e ae 8a d0 e9a9 e4 d3 da 6f c4 53 c5 f8 b3 a7 a1 5d 66 93 d8 b1 89 40 23 92 c0 90 fb cb e9c1 e7 6b 4e 51 0 5d 57 f7 cd 1 e2 88 bf 44 9f ef c4 33 ce fa 46 46 a1 86 b e9da 7a 84 66 66 b9 2 ec 10 c6 a1 d4 c1 18 33 b1 d1 2 18 ad 2f 53 e4 b9 33 59 e9f3 be 3c af 80 4c 8a d5 76 c 3b a7 e2 97 94 15 75 4d 17 d5 97 cf f9 4a d0 6e ea0c bb 27 20 fc f1 f5 9 a8 df 4d b6 5d f0 1d 69 3b 76 35 82 a4 f3 56 64 39 5b ea25 6b b3 7 e7 5 8e 82 11 22 a8 1a db c8 3e 67 4a 3 7e 72 51 d6 3d 1a 1c f6 ea3e b8 da 4b 18 8a 15 9d d0 a4 84 96 3e cd 3 f9 3a 30 f3 fb 8f 6e 2 73 eb 52 ea57 93 95 cf dc 6f 48 fb ab d2 a9 70 b4 e2 23 8d 72 86 a8 fa 78 98 1d c5 fe ea6f 8a 51 88 2b b7 58 b0 ca ae 40 8a 33 32 75 1 6 c0 d4 b7 da 2a a7 bb ad f7 ea88 48 98 5a bc d3 d1 e6 16 97 c3 80 ab 73 ac 32 11 41 1f d 5d aa 0 dc d9 6e eaa1 fc 30 6 ef 11 60 27 a2 5f eb 5f b9 35 8 23 4 be 10 c0 85 3e 55 b3 82 fd eaba f7 c3 24 9f 2d 83 94 32 36 de ff 7c 87 7f 4a 80 7 2 23 cf a4 52 eb 3e 19 ead3 a0 b4 a 94 1a 40 58 d9 16 6d c0 64 c4 69 ed 60 46 65 cb df 58 38 0 51 c3 eaec ad a0 37 e4 cf ab f7 6c 24 7d 9 48 65 4a 9f 91 ad 1c 79 a4 a1 78 55 c e8 eb05 44 5b d ef 51 bd ea 2d a7 42 57 ab 3a 4f 2 b 3 19 6a 4d 72 76 5c 97 0 6c eb1f c5 5d bc dd e7 81 cf 8d 34 38 50 3c 98 58 cc 41 aa 99 90 af fe 4e 96 77 eb37 ed 54 18 ce 2c d1 5d 34 cb 79 50 ff 28 96 44 e0 51 64 6 a8 b7 6e 8c 62 c4 eb50 66 95 81 4f 8c f6 26 ba ea 5d d2 79 b1 e4 e9 29 fc a fd b3 85 8c e6 52 dd eb69 33 bd 5d c7 39 ef 6 ef 9e a6 6a 61 9c 9f d5 54 b4 fa a1 d4 10 9b ff 7e 33 eb82 11 52 99 c7 26 6e a1 36 8a ad ee 48 7a 2c 7f d5 b7 27 8a 6b 37 c 71 39 85 eb9b 9c ba a8 a 17 b9 d0 51 56 95 c2 3b 5 a7 31 c5 8b 5c 95 6e 4c 89 6f 17 ef ebb4 d4 5a a 77 65 e1 49 b2 e8 72 ac 3c f0 6b 71 fa 3 c7 ca fc ad f9 55 22 ec ebcd 58 2f 1c fa 29 cf 73 b4 ad 51 5c f8 66 70 59 5d 70 3e d1 3f c4 eb ec f1 ebe5 7 78 6a 93 67 9f 44 fc cb 5b 95 ff 74 c0 b7 42 77 26 c9 aa 8c ed 39 a2 db ebfe 9c b3 eb 3d 4a 1e 9b 89 e4 d8 a8 27 74 ef a3 ed a5 24 5d bb ab d0 fe a1 ec16 29 ab df 75 a a6 23 0 cc f1 14 72 9b 1a 55 7e e5 d1 da 98 dc c4 cf ab 34 ec2f ba 8d de 4a 59 6 13 dd d8 44 3c e bb 56 95 ae 97 e2 3b 49 e5 9a 6b a2 53 ec48 c1 33 35 24 1b 33 17 c3 8a 8c 12 3d 3d 4e 5b 75 22 30 67 4f a0 5d 3a 78 ec60 88 a 11 35 7 b1 77 42 32 a8 c3 bb 20 fb 98 5 d6 ac e7 3a 63 35 90 93 9e ec79 44 24 2e 1b d7 8c aa 29 53 4d d9 ab eb e6 1 56 c4 fd 54 a3 bd 14 5b b0 8f ec92 ce be 23 24 93 c4 48 18 a3 e7 4 5 4b 78 cc 79 dd 3 56 a4 ed dd 5f 98 41 ecab 1b 68 4c c1 bb 41 c2 1e 3e 94 8e ef 28 1e b 76 e 4f 36 b1 c 6e e2 18 17 ecc4 20 fc 35 40 1f e4 6d a4 18 bb bc d5 9e ea 85 86 af af 63 d4 13 66 92 c4 ecdc 2b 69 84 ca 23 2b d3 66 81 6b 81 73 26 4 85 36 21 4c 49 44 75 64 39 16 3c ecf5 ed e0 6d 44 75 45 30 43 68 c0 78 fc d0 17 b eb 81 3e c3 ba 1b f 4d ae c5 ed0e 55 1f c 39 12 5d 8 65 f1 34 59 de dd 98 56 17 43 38 66 49 9a eb db c1 87 ed27 51 38 cc b7 5f 98 fd 43 be 2d bb 74 f3 f8 f2 36 3d a4 34 a5 7e d2 26 cc ed3f 84 1f ea 56 f0 80 18 69 4d 88 41 fc 56 fd 41 3b 1e e 9 27 4f f6 3b 62 4e ed58 5a 1b 2a 4e 85 8c b2 4f 79 ef 59 4e e 73 3d bd c4 ca 60 e7 4a 47 90 b5 8 ed71 2a f0 4e dc ba 66 ae 48 2b 31 73 a2 11 c 32 ff 54 14 77 6b d6 58 4b bf ee ed8a f6 6a bc dd 1 88 d da a9 f 81 24 c5 f8 72 9a db d5 c8 2a 80 a9 16 d7 c6 eda3 b1 91 c0 a9 95 40 b5 b3 a8 2a 28 c6 92 16 ab 54 7d f8 93 5f 3a 17 c8 45 edbb a9 f0 e0 71 23 76 53 38 a5 a1 cc d4 f1 f2 3c 2b 46 43 a1 d5 ba e d7 19 7a edd4 c2 e1 8f 67 1d d 98 9d a1 79 9d 1b 20 7f 4d e7 bf f9 ff fe aa 28 ab 8f c eded 4d 50 33 e3 26 fc 3c 3 3a 2b 26 12 f7 1 8f ee 97 4c e6 6 2b d9 1f a1 4a ee06 77 44 d4 8b b7 3e 5e 2d 18 c3 54 68 99 a8 8d 92 96 9e 9d ab 33 38 ff b8 ee1e ee 78 c6 7b b5 84 95 d3 6 27 ae 5d 27 38 a 38 8e f0 1 a5 96 4b d7 9b 42 ee37 e5 6f 57 75 4c e9 78 2d 5b ec b6 d2 29 e2 a8 92 95 9c 65 2a 3e bf 8d e0 ee4f bf b3 ac c8 e 7e 13 af 88 26 7d 48 5a c7 39 29 36 d2 90 e8 3b 3 d0 61 1a ee68 d2 e8 a8 f ba 8e a1 9f df 12 ab 54 7 23 98 de 62 af 4c 7e d4 fb 6b 2 6e ee81 40 40 37 b7 73 f2 d8 81 be 29 d2 99 c0 73 25 1a 3c 92 75 6e bd d7 79 79 ee99 4 14 c0 4e 99 57 66 93 74 ec b0 29 7c df 61 b0 3 3a d1 c3 fa a4 f7 f 9f eeb2 d3 f 0 b9 2a 5a 3a c5 88 25 b8 b9 cc 82 3 57 3a e1 7b 51 75 70 a6 74 1a eecb ca cb 3 18 68 ca 77 fe 1b ad cd 68 7f 36 85 fc b7 4f a0 11 da 69 fa 79 87 eee4 d6 b9 21 dd 3e 70 db dc 84 d4 6e d1 20 4 af f6 32 a2 8e d 54 25 fe 7 54 eefd e 7a 74 4b a0 4b f7 f4 e8 74 22 e9 98 70 fb 25 2e f4 64 57 75 28 85 45 53 ef16 3a 2e e2 3c 54 36 e9 29 6 67 59 43 10 7e c1 49 cd 5e f9 97 a 58 5f 8a 11 ef2f 4f 3d 9a e2 2b 22 58 fa be fc 69 91 7a 8c 3f 77 9f c9 3b 54 26 23 93 b3 ef47 85 de ae f5 bd c5 47 4c c4 cd 5e ad bc 8f ba 31 f6 e4 70 fb 6e a7 96 d5 ef5f ad 10 80 39 43 97 4f 10 cc 1b 8f 8d cd 4c 63 4 d8 1e 85 70 41 6c a8 eb df ef78 7f 36 c5 60 a7 12 9 16 73 fe 75 3a 2d 40 29 7d aa a 5c 2 29 23 0 a6 e5 6b ef92 24 6d 9b 20 e5 7 cb 40 b0 38 59 9c a7 69 6a 70 d3 38 ef e2 b2 11 3e ea 2a efab f9 2b 2e 43 1d 65 cf d6 1b ef 83 5a 5f e6 c5 62 16 ca 5e 4c a6 39 e4 53 efc3 2d 23 d2 5e 7e 15 54 8a 8 b7 3d bb 88 59 b9 9e a2 7c 42 1f a2 77 3c 5b 9 efdc 6d fa 8f 21 46 1a 3e ed ce 49 56 1d 29 2d 70 3 a7 6f 75 ac 1 87 ff 27 86 eff5 73 49 28 85 2d 97 7a 84 e 37 3d 86 10 21 4c e2 74 62 6b 51 70 8f 15 72 f3 e100e 81 b2 a9 9d 8a 63 ad 1b d5 aa 8a dc 96 3c e7 47 16 51 fc 87 50 9 b7 60 e1026 29 33 52 fb b0 df 70 c5 65 4a 60 3b c d7 a8 29 47 51 f7 8a 77 f3 99 3f e103e 38 16 60 de 68 27 b2 24 7 62 a2 fd 40 86 b2 75 c3 3c 2f 3d fa 9 d9 a9 9a e1057 71 3c ce 46 94 0 f9 bc 46 7f b8 2e 85 7f 7d d3 8d ea b4 63 81 59 10 bb e106f 57 d0 b6 ab e1 83 74 1e 25 d5 73 78 18 b1 60 62 c f4 76 8d 17 d5 ed 23 e1087 23 e4 f6 32 64 5a 61 9 63 f6 92 57 d5 29 40 d6 3b ba 63 72 18 0 25 1b 7 e10a0 ee 7f 25 4a fa 6 74 19 46 e3 e8 89 7a c6 56 54 a7 43 13 4e bf 97 a5 6f e10b8 99 2f ac 33 4d fa 58 3a 5a a a4 1a 74 62 c8 4f 3b 78 9 d7 ee 7e ee 2d 69 e10d1 30 40 ea 47 82 3b 85 8e 3 23 8f 74 4e 8 35 ab 74 4 1 57 d5 85 b1 6b 1e e10ea f4 7d 1e d2 1e b3 fe f3 12 10 32 39 51 48 2d 6f e5 d3 a3 8c 8 8 g rcx fff n1.
1.Cookie::make()、Cookie::forever()、Cookie::get()的使用方法: Route::get('cookieset', function() { $foreverCookie = Cookie::forever('forever', 'Success'); $tempCookie = Cookie::make('temporary', 'Victory', 5); return Response::make()->withCookie($foreverCookie)->withCookie($tempCookie); }); Route::get('cookietest', function() { $forever = Cookie::get('forever'); $temporary = Cookie::get('temporary'); return View::make('cookietest', array('forever' => $forever, 'temporary' => $temporary, 'variableTest' => 'works')); }); 2、Cookie存储数组: <pre name="code" class="php">Route::get('cookieset', function() { $user_info = array('name'=>'good','age'=>12); $user = Cookie::make('user',$user_info,30); return Response::make()->withCookie($user); }); Route::get('cookietest', function() { dd(Cookie::get('user')); });
因为在阅读文章C++中虚函数工作原理和(虚)继承类的内存占用大小计算后,我们在sizeof一个类或者是一个具体的类实例(对象)的时候,发现得到的最终结果没有将虚函数表的存储的具体内容计算进去,所以在想,那么虚函数表的数组具体内容信息具体存放在哪里?在下面的一篇文章中作者给出了一个很好的回复:
http://blog.csdn.net/houdy/article/details/1496161
存放在当前你编写好的类文件在编译的时候生成的.dll文件中,这样就可以供其他的类进行调用,同时该类的成员函数,静态和非静态的成员变量的信息都存储在这个导出的.dll类文件中。
原文地址: http://blog.csdn.net/hackbuteer1/article/details/7883531 一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl。当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的 vptr 指向的 vtbl,然后在 vtbl 中寻找合适的函数指针。 虚拟函数的地址翻译取决于对象的内存地址,而不取决于数据类型(编译器对函数调用的合法性检查取决于数据类型)。如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表,即vtable。而在类的对象地址空间中存储一个该虚表的入口,占4个字节,这个入口地址是在构造对象时由编译器写入的。所以,由于对象的内存空间包含了虚表入口,编译器能够由这个入口找到恰当的虚函数,这个函数的地址不再由数据类型决定了。故对于一个父类的对象指针,调用虚拟函数,如果给他赋父类对象的指针,那么他就调用父类中的函数,如果给他赋子类对象的指针,他就调用子类中的函数(取决于对象的内存地址)。 虚函数需要注意的大概就是这些个地方了,之前在More effective C++上好像也有见过,不过这次在Visual C++权威剖析这本书中有了更直白的认识,这本书名字很牛逼,看看内容也就那么回事,感觉名不副实,不过说起来也是有其独到之处的,否则也没必要出这种书了。 每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就会为这个类创建一个虚函数表(VTABLE)保存该类所有虚函数的地址,其实这个VTABLE的作用就是保存自己类中所有虚函数的地址,可以把VTABLE形象地看成一个函数指针数组,这个数组的每个元素存放的就是虚函数的地址。在每个带有虚函数的类 中,编译器秘密地置入一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。 当构造该派生类对象时,其成员VPTR被初始化指向该派生类的VTABLE。所以可以认为VTABLE是该类的所有对象共有的,在定义该类时被初始化;而VPTR则是每个类对象都有独立一份的,且在该类对象被构造时被初始化。 通过基类指针做虚函数调 用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数调用插入代码,所有这些都是自动发生的,所以我们不必担心这些。 [cpp] view plain copy #include<iostream> using namespace std; class A { public: virtual void fun1() { cout << "
BugFree基于PHP和MySQL开发,是免费且开发源代码的缺陷管理系统。服务器端在Linux和Windows平台上都可以运行;客户端无需安装任何软件,通过IE,FireFox等浏览器就可以自由使用。
BugFree 2 在BugFree 1.1的基础上,集成了Test Case和Test Result的管理功能。具体使用流程是:首先创建Test Case(测试用例),运行Test Case产生Test Result(测试结果),运行结果为Failed的Case,可以直接创建Bug。Test Case标题、步骤和Test Result运行环境等信息直接复制到新建的Bug中。
关闭selinux:
# vim /etc/selinux/config
将配置文件中 SELINUX=permissive
关闭iptables
# chkconfig --level 35 iptables off [root@bugfree ~]# chkconfig --list |grep iptables 查看iptables状态 0:off 1:off 2:on 3:off 4:on 5:off 6:off
1. 安装apache
yum install httpd
2. 安装mysql
yum install mysql mysql-server
注:已安装mysql的跳过此步骤
3. 安装PHP
yum install php php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc
4. 安装PHP加密算法插件
yum install libmcrypt
商域无疆 (http://blog.csdn.net/omni360/)
本文遵循“署名-非商业用途-保持一致”创作公用协议
转载请保留此句:商域无疆 - 本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
以下代码是THREE.JS 源码文件中Math/Vector3.js文件的注释.
更多更新在 : https://github.com/omni360/three.js.sourcecode/blob/master/Three.js
// File:src/math/Vector3.js /** * @author mrdoob / http://mrdoob.com/ * @author *kile / http://kile.stravaganza.org/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */ /* ///Vector3对象的构造函数.用来创建一个三维向量的对象.Vector3对象的功能函数采用 ///定义构造的函数原型对象来实现. /// /// 用法: var p2d = new Vector3(5,3,2) /// 创建一个x坐标为5,y坐标为3的向量,z坐标为2的向量. /// NOTE: 参数(x,y,z)坐标为可选参数,如果不指定参数(x,y,z),将创建一个坐标为(0,0,0)的向量. */ ///<summary>Vector3</summary> ///<param name ="x" type="number">x坐标</param> ///<param name ="
除了低级作图命令之外,图形的显示也可以用绘图参数来改良。绘图参数可以作为图形函数的选项(但不是所有参数都可以这样用),也可以用函数par来永久地改变绘图参数,也就是说后来的图形都将按照par指定的参数来绘制。例如,下面的命令:
> par(bg="yellow")
将导致后来的图形都以黄色的背景来绘制。有73个绘图参数,其中一些有非常相似的功能。这些参数详细的列表可以参阅?par;下面的表格只列举了最常用的参数。
adj 控制关于文字的对齐方式,0是左对齐,0.5是居中对齐,1是右对齐,值> 1时对齐位置在文本右边的地方,取负值时对齐位置在文本左边的地方;如果给出两个值(例如c(0, 0)),第二个只控制关于文字基线的垂直调整。
bg 指定背景色(例如bg="red", bg="blue"; 用colors()可以显示657种可用的颜色名)
bty 控制图形边框形状,可用的值为: "o", "l", "7", "c", "u" 和"]" (边框和字符的外表相像);如果bty="n"则不绘制边框
cex 控制缺省状态下符号和文字大小的值; 另外,cex.axis控制坐标轴刻度数字大小,cex.lab控制坐标轴标签文字大小,cex.main控制标题文字大小,cex.sub控制副标题文字大小
col 控制符号的颜色; 和cex类似, 还可用:col.axis, col.lab, col.main,col.sub
font 控制文字字体的整数(1: 正常,2: 斜体,3: 粗体,4: 粗斜体);和cex类似,还可用: font.axis, font.lab, font.main, font.sub
las 控制坐标轴刻度数字标记方向的整数(0: 平行于轴,1: 横排,2: 垂直于轴,3:竖排)
lty 控制连线的线型, 可以是整数(1: 实线,2: 虚线,3: 点线,4: 点虚线,5: 长虚线,6: 双虚线),或者是不超过8个字符的字符串(字符为从"0"到"9"之间的数字)交替地指定线和空白的长度,单位为磅(points)或象素,例如lty="44"和lty=2效果相同
lwd 控制连线宽度的数字
mar 控制图形边空的有4个值的向量c(bottom, left, top, right), 缺省值为c(5.1, 4.1, 4.1, 2.1)
mfcol c(nr,nc)的向量,分割绘图窗口为nr行nc列的矩阵布局,按列次序使用各子窗口
mfrow 同上,但是按行次序使用各子窗口
GRASP(General Responsibility Assignment Software Pattern)是通用职责软件分配模式。GRASP的核心是自己干自己能干的事,自己只干自己的事,也就是职责的分配和实现高内聚。用来解决面向对象设计的一些问题。GRASP提出了九大原则,下面笔者将对这九大设计原则做一一阐述。
高内聚、低耦合(High Cohesion、Low Coupling)
在面向对象的程序设计时,小到一个类,大到一个功能模块,如果他们之间的相互依赖很高就会对整个软件的开发造成诸多障碍。例如:当你修改一个类或者某一个模块的时候,相应的你要改动其他的与之相依赖的类和模块,使得程序很难维护,代码会变得很难理解,一个很单一的操作,就会涉及到很多程序之间相互调用,程序更是难以复用,当你想复用一个类的时候,对应的与之相依赖的类或方法也会被陆陆续续的添加进来。
这就是我们为什么要遵循这一原则的原因,而高内聚和低耦合往往是伴随在一起出现的。低耦合其实就是两个类或模块之间联系的紧密程度,高内聚就是类中方法和方法之间的职责相关性。要想避免低内聚、高耦合,解决办法就是既要降低因为一个类的变化而对另一个类产生的影响,又要保持类或模块是有重点的、可理解的、可管理的并且支持低耦合的,也就是更加精确的给一个类或者模块分配职责。
高内聚和低耦合是软件开发中最重要的原则,GRASP的其他模式也是以高内聚、低耦合原则为中心的。
信息专家(Information Expert)
如何实现高内聚,也就是如何给类分配职责?我们要遵循的原则就是把职责分配给具有完成该职责信息的那个类。
创建者(Creator)
如何分配创建对象的职责呢?原则就是当下列条件满足时(越多越好),由B创建A:
1.B频繁的使用A
2.B包含或聚合了A
举个简单的例子,如果类A实现了B接口,类C、D是类A的一个属性,那么C、D应该由A来创建,A应该由B来创建。如果C、D由B来创建,那么当C或者D改变的时候,B和A也要跟着改变,大大增强了B和C、D的之间的耦合度,违背了低耦合的原则。通俗点说就是如果B使用的了A,那么就应该由B来创建A,而不是由其他的类来创建。
控制器(Controller)
在UI层外,应该由哪个类来处理系统操作呢?原则就是把系统事件的处理职责分配给控制器类,这个控制器类就相当于MVC中的C。这个控制器类通常是系统事件发生的用例的控制类。
多态(Polymorphism)
根据类型的不同而发生变化的行为的定义职责,应该分配给谁?
举个简单的例子,坐车去广州,坐车算是一个行为,但是这个行为是可以变化的,比如坐飞机、坐汽车或者坐火车,那么坐车这个行为的定义应该分配给谁呢?
原则是通过多态操作把基于类型的可变行为的定义职责分配给发生该行为的类。放到JAVA当中来实现就是定义一个坐车的接口,然后具体的坐飞机、坐汽车或者坐火车的行为分别定义一个类来实现该功能,然后让这三个具体的类去实现坐车接口。
纯虚构模式(Pure Fabrication)
非问题领域的职责应该分配给谁?
我们在设计类的时候,通常都尽量的保持和现实世界当中的对象一致,那么我们从现实世界的对象抽象出来的类就叫做问题领域里的类,那么当我们保存这个对象的时候要操作数据库,操作数据库就是一个非现实世界存在的业务对象,他就是非问题领域的职责。
这种职责分配的原则就是将非问题领域的职责分配给人工生成的类。比如问题领域的类通常是放到PO里面的,它不应该包括CRUD等操作。那么CRUD这些操作应该放到一个人工生成的也就是我们在业务逻辑以外加的一个类。
间接性(Indirection)
为了避免两个或多个事物之间直接耦合,应该如何分配职责?
设计原则是将职责分配给中介对象。例如类A和类B是多对多的关联关系,当A改变的时候,B需要做相应的改变,当B改变的时候,A需要做相应的改变,这是违反低耦合原则的,解决方法就是在A和B之间加入一个C类,类C的属性只有A和B,用C来记录A和B之间的关系,当A想使用B或者B使用A的时候,他们都通过C来调用对方。
防止变异(Protected Variation)
如何设计对象、系统和子系统,使其内部的变化或者不稳定因素不会对其他元素产生不良影响?
预计识别不稳定的因素,在其外部创建稳定的接口。例如:坐汽车去广州当中的坐汽车就是一个不稳定的因素,以后也许会坐飞机或者火车,那么我们就要把坐汽车抽象出一个坐车的接口,当有一天想坐火车的时候直接加一个实现的类就可以了。
引自:http://fjilyfe.iteye.com/blog/232448
在1.2内核版本中,在Linux/fs目录下,有一个block_dev.c文件,里面主要包含了block_read、block_write、block_fsync函数。
先说说我遇到的问题,在块读写函数中,内核根据文件指针f_pos找到当前要读或写的文件的块号,然后在一个循环中,根据要读写的字符数进行循环。然后,问题就来了,我们知道,对于一个文件,其所对应的磁盘块在磁盘上并不一定是连续的,内核在建立文件的时候,是将文件分散存储在磁盘上的,然后将具体的磁盘块号保存在文件i节点的一个数组中,其中还用到了二次、三次间接引用的技术。比如一个文件,内核将其分散存储在磁盘块2,4,8中,则将这些磁盘块存储在此文件i节点数组中。但是,问题就来了,在block_write函数中,读写循环的时候,读写完一个块,则要进行下一个块的读写的时候,内核是直接让块号自增的!而且调用的底层磁盘读写函数,也没有传入任何包含文件i节点的信息,也就是说,block_write函数是根据传入文件的文件指针找到要读写的开始文件块号,然后按顺序读写磁盘的,即使文件指针当前指向块2,若要写入三个块,内核也是写入块2,3,4,而不是2,4,8!
对于这个问题,百思不得其解。经过一番的网上冲浪和对内核源码的跟踪和分析,最终终于找到了答案!
原来,block_read, block_write及block_fsync都是通用函数,i被用来代替任何针对某个驱动程序的函数。他们相当于一种面向底层的驱动程序,也相当是对底层设备进行直接编程。他们面对的是块设备文件的读写,注意一下区别,块设备文件不是通常所说的普通文件,Linux的文件抽象更为抽象,将设备也抽象为文件。我的理解就是,硬盘设备整体作为一个文件,CD_ROM光盘也可抽象为一个文件...最终,对实际设备的访问就变成了对设备文件的访问,但普通文件就不一样了,普通文件是(分散)存储在磁盘上的数据。也可能在一个设备上单独分出一块连续的存储空间,作为一个新的块设备文件???
设备文件是独立于具体的文件系统而存在的,或者说,各种设备的设备文件组成一个单独的文件系统。比如,ext文件系统部署在磁盘设备A上,但是磁盘A也被内核抽象为一个设备文件,而且设备文件不会调用ext文件系统的函数,反之亦然。在linux/drivers/block目录下可以看到linux支持的各种块设备及其驱动程序,在hd.c中,是硬盘的驱动程序,其中定义了硬盘的操作函数集:
static struct file_operations hd_fops = {
NULL, /* lseek - default */
block_read, /* read - general block-dev read */
block_write, /* write - general block-dev write */
NULL, /* readdir - bad */
NULL, /* select */
hd_ioctl, /* ioctl */
NULL, /* mmap */
hd_open, /* open */
hd_release, /* release */
block_fsync /* fsync */
};
可以看到,block_write和block_read被引用了;在 floppy.c中的floppy_write函数中嗲用了ret= block_write(inode, filp, buf, count);说明软盘的操作也是基于块设备操作,可能是在软盘上的文件系统采用的是连续存储的方式;在ide.
ubuntu移动文件到另一个文件夹命令:
假设你的用户目录是/home/yangxin,也就是你Crtl+Alt+T打开终端时,
窗口中是yangxin@ubuntu:~$意思是你的用户名为yangxin当前默认的操作目录是/home/yangxin,如果你需要移动/home/yangxin/download目录下的aaa文件到/home/development目录下的操作如下:
1、先把改变操作目录:
cd /home/yangxin/download
2、移动文件到指定目录
sudo mv aaa /home/development
也可以同时移动多个文件到指定目录,文件之间用空格分开。
有时候我们不想使用任何框架,但又需要用JDBC实现类似于iBATIS的orm映射功能,把一个ResultSet转换成我们的JavaBeans,我们可以模仿iBATIS的方式自己写一个ResultSetMapper实现类,利用反射原理把ResultSet转换成一个JavaBeans,下面是网上的一个开源实现,主要用到的是 注解和 反射机制,我们先看一下使用效果: package com.heaven.mapper; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; public class SampleMain { public static void main(String ...args){ try { ResultSetMapper<SamplePojo> resultSetMapper = new ResultSetMapper<SamplePojo>(); ResultSet resultSet = null; // simple JDBC code to run SQL query and populate resultSet - START Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String database = "jdbc:odbc:AkDb"; Connection connection = DriverManager.getConnection( database ,"",""); PreparedStatement statement = connection.prepareStatement("SELECT * FROM UsersSample"); resultSet = statement.
原文链接:Vertica “ERROR: Too many ROS containers exist”
最近在用Vertica的时候碰到一个问题,Vertica在运行了一段时间后总是出现类似下面的错误
java.sql.SQLException: [Vertica][VJDBC](5065) ERROR: Too many ROS containers exist for the following projections: <projection> (limit = 18078, ROS files = 12088, DV files = 5992, new files = 10) 碰到找个问题就不得不说说Vertica的存储机制了。Vertica在默认情况下会把新写入的数据写入到WOS(写优化)中,然后根据一定的条件(比如说一定的时间周期)再把WOS中的数据写入到ROS(读优化)中,这时ROS有可能很多都是很小数据块的碎片,这是Vertica会在一定的时间周期后把这些ROS数据块合并成大的ROS文件。
这里把数据从WOS写入到ROS的过程Vertica管它叫MoveOut操作,而把零散的ROS合并成大的ROS的过程Vertica管它叫MergeOut操作。
好了,现在来看看我们的问题吧。错误里报的是ROS太多,那可能的原因是 1. WOS写ROS太多,这个原因的原因很大的可能是每次insert/update的数据集太小,导致生成的碎片太多。 2. ROS太多,而配置的MoveOut和MergeOut的时间间隔太长,导致来不及做MoveOut和MergeOut。
好吧来看看我的应用吧 1. 针对第一个可能的原因,确实是我们的应用的需求的问题,这个目前来说我们没法改变。 2. 对于第二个可能的原因,我们查了一下Vertica的资料,在Vertica中默认的MergeOutInterval是600,MoveOutInterval是300。这两个参数可以通过下面的命令来查看
SELECT GET_CONFIG_PARAMETER('MoveOutInterval'); SELECT GET_CONFIG_PARAMETER('MergeOutInterval'); 由于我们的应用本身会产生很多的ROS碎片,所以我们想到了是不是可以通过减小MoveOut和MergeOut的Interval来让Vertica尽快的做MoveOut和MergeOut。因此我们修改了Vertica的参数
SELECT SET_CONFIG_PARAMETER('MoveOutInterval', 60); SELECT SET_CONFIG_PARAMETER('MergeOutInterval', 30); 在修改了这两个参数以后,我们的应用确实在运行了很长时间后都没有再出现上面的问题了。
其实关于这个问题,还有几个参数可以调节,具体资料可以参考 Vertica Tuple Mover Parameters
goog正常途径基本不能访问了;加上近几年信息被搜集越来越敏感;弃chrome,转投firefox开源怀抱;
下载火狐,默认会跳转到火狐中国,也无所谓;中国版访问火狐中国服务器快些,试了下访问美官网,巨慢。
mac windows平台问题不大,都是独立的安装包;顺利申请帐号,同步书签;
英文版ubuntu麻烦,默认自带的试英文版火狐(中文版ubuntu应该也是装us版火狐),us原版帐号和中国版不相关联,完全独立(不吐槽了)
试了一天,装了卸甚至重装ubuntu,终于摸索出可以用中国版帐号的方法,分享给大家,少走弯路:
1,打开home目录,ctrl+h,删除.mozilla目录(里面其实就是火狐当前的配置,历史记录,插件等等信息)
2,去中国官网下载firefox最新版本,解压运行一次,会在~/下重新生成.mozilla目录;
3,ok,删掉刚刚下载tgz和解压后的文件,重新启用默认自带的firefox,登录帐号,就可以和其他平台同步了
http://askubuntu.com/questions/355034/ubuntu-12-04-3-lts-installation-failed-says-grub-installation-failed
http://forum.ubuntu.com.cn/viewtopic.php?f=48&t=446368&p=3019940
the grub-efi-amd64-signed package failed to install into /target/. Without the GRUB bootloader the system will not load
uefi安装,总是报错,当然我肯定设置了efi分区。还是失败,原来这是个bug,晕彩
It's a bug. /pool/main/g/grub2-signed/grub-efi-amd64-signed 1.9~ubuntu12.04.4+1.99-21ubuntu3.10_amd64.deb file rename when you burn it in CD/DVD or usb disk to grub-efi-amd64-signed 1.9~ubuntu12.04.4+1.99-21ubuntu3.10_amd.deb. As a result installation script can't find the file and failed to install grub. Quick workaround is that(if you burn iso in USB flash drive) go to pool/main/g/grub2-signed(in usb flash disk) and rename the deb file manually (add 64).
初识谢霆锋这个名字,是在十几年前上大学期间。彼时的香港,经济和流行文化上都傲视全中国。香港电影就如同今日的美国大片。十多岁的少年心中,电影里那个遥远又有些神秘的城市就意味着海市蜃楼般的高楼大厦和夜晚永远闪烁的霓虹灯火。那里的人,说着不一样的语言,留着前卫的发型,穿着时髦的服装,做着酷酷的事情。谢霆锋就是以这样一个染着发的酷帅青年的形象出现在《特警新人类》里。这部平庸的警匪动作片除了几个年轻主演的外形没给我留下太多的印象。 另一次看到这个名字是在宿舍里的一张报纸上:香港娱乐圈冉冉兴起的几位新人将成为未来十年的新天王:谢霆锋、陈冠希、古巨基。经过十多年这些信息在脑海里还如此清晰我自己都有些奇怪,原因当然不是我的记忆力好,至少不光是,而是作为一个从小对偶像追星没特别兴趣的人,看过的娱乐消息寥寥无几。
《因为爱所以爱》、《活着Viva》……谢霆锋的歌声在香港流行音乐黄金时代的尾声也留下了一抹印记。同时演戏和唱歌几乎是香港艺人的标准配备,影视歌多栖发展是热词。
锋菲恋、与张柏芝这对“金童玉女”的相恋、结婚、生子,以致后来被艳照门事件牵连,离婚。对于我这个非粉丝的局外人,娱乐圈里惊天动地的谢霆锋的大事件,仅仅是零星接收到的消息。
视觉上的新印象来自《无极》里谢霆锋的奇葩造型,当然在那起“一个馒头引起的血案”里,造型奇葩是普遍的。在后来的打斗电影里,谢霆锋拼命三郎的风格让人印象深刻。但和剧烈运动的肢体比,表情肌却永远处于休假状态。
至此,提起谢霆锋的形象,我每每会想起在网上看到的一段不厚道的评论:在气质上和一个工地上染发的青年并无二致。
这一切都是在无意中看到《十二道锋味》之前。
在西班牙慵懒温暖的阳光下,谢贤、谢霆锋星二代父子和可爱的陈妍希,闯入了一间农场里伊比利亚黑毛猪的幸福生活。晚风、篝火、烤猪,再加上童年录像和家常似的聊天玩笑,温馨感满溢而出。不知不觉我突然发现谢霆锋的形象让我找不到一丝非主流的感觉,首先想到的形容词只有内敛、英俊、干练。斧劈刀削一般冷酷的面部偶尔现出的微笑,也似乎蒙上了一层神秘迷人的纱。
接着看了来宾是张家辉、桂纶镁和阿Sa的几期。在异国风光中旅行,览胜历奇,与朋友一道追寻美食,《十二道锋味》糅合的微电影和生活秀风格让人眼前一亮。谢霆锋扮演着导游、美食介绍和大厨的角色,温情里有一味幽默,任务中有八分轻松。而无时无刻不保持着广告片中一般整齐清爽的发型、衣着当然还有脸的他渐渐让两个词浮现脑海:阳光和英气。P.S.陈研希、桂纶镁、阿Sa,三个女生都活泼可爱,陈研希温柔婉淑,桂纶镁精灵聪明,阿Sa朴实贴心。
谢霆锋的普通话比大部分香港人好,不光是发音,表达上的自如和词汇量很多时候都不逊于以普通话为母语的大陆明星,远没有看香港明星参加大陆节目时生硬的腔调和动辄“搞”、“东西”、“不好”高频出现的词汇极度匮乏的彆扭感觉。据说这是拜与王菲恋爱之赐,恋爱确实是件好东西。
每期节目最后的一道烹调,是完美的收官。央视里戴着高高的白色厨师帽,脸型和身材一般都很魁梧的大厨机械地介绍着做菜的原料和步骤,这样的节目只有原来就喜欢做菜的人愿意看,对于包括我在内的其他人,只能加深做菜的枯燥印象。其余我见过的肥妈厨房、Yan can cook的华人烹饪节目,厨师再绞尽脑汁,面目可亲,无奈话题上只是围绕当前所做食物,除了介绍信息和惊讶感叹增加不了多少趣味。即使是西方的俊俏小生当主厨,伶牙俐齿滔滔不绝,空间和视觉也仅限于厨房和食材。《十二道锋味》最奇妙的地方是,醉翁之意不在酒,在几十分钟的游山玩水聊天说笑后,再由偶像脸庞的谢霆锋着一袭黑色的厨师服出场,伴奏以轻快律动的音乐,动画特效又给食材加上一层梦幻效果,再在有条不紊的解说、操作下,精致的画面和谢霆锋专心致志的表情是最佳搭档(不怪吃货女性说会做饭的男人最帅,在我看来,谢霆锋纹丝不动的面部肌肉最适宜的表情便是认真),一道不论味道(观众也无法论味道),视觉上已能享用的菜品诞生了。过程和结果,皆动听悦目。
谢霆锋与朋友的联系和行程都水到渠成,这样的巧合和缘分不是天定而是人为,但做得巧妙,无刻意安排之感。与父亲和好友的情感交流也自然真挚,虽然旁边就是好几台摄像机,不过也许长期作为艺人的他们已经习以为常,能够视若无物地交流。与一个个朋友一起,谢霆锋展现出与他人关系的不同侧面和个人的更多细节,就像一道道锋味的调制融入了不同的配料,风味各异,却也有一以贯之的心思。既是食,也是人。
就像节目中谢霆锋和阿Sa感叹的,时间过得真快!谢霆锋这个名字已经和我共同存在了十几年了。最近才知道其实论年龄他只比我大两岁,长久以来比我年长一些的明星印象完全是因为他出道很早。从少年起就没怎么追过星的我,突然对偶像一词有了新的理解。不用疯狂,不必痴迷,即使经过打造,即使是设计曝露的形象,从一个人身上,如果获得的不仅是简单的养眼,还能感觉到一股积极健康的力量,这便是偶像存在的意义。不是少男少女对比他们年长十多岁的明星的崇拜,而是成年人从同龄人身上感受的一缕阳光,一点钦慕——这便是《十二道锋味》让我认识的谢霆锋。
目录 211462.html =========================================
1.报表函数简介
2.RATIO_TO_REPORT函数
一、报表函数简介:
回顾一下前面《Oracle开发专题之:窗口函数》中关于 全统计 一节,我们使用了Oracle提供的: sum ( sum (tot_sales)) over ( order by month rows between unbounded preceding and unbounded following) 来统计全年的订单总额,这个函数会在记录集形成的过程中,每检索一条记录就执行一次,它总共执行了12次。这是非常费时的。实际上我们还有更简便的方法: SQL > select month ,
2 sum (tot_sales) month_sales,
3 sum ( sum (tot_sales)) over ( order by month 4 rows between unbounded preceding and unbounded following) win_sales,
5 sum(sum(tot_sales)) over() rpt_sales
6 from orders
7 group by month ;
MONTH MONTH_SALES WINDOW_SALES REPORT_SALES
今天在使用rvm 1.9.3 --default设置默认的ruby的命令时出现 RVM is not a function, selecting rubies with 'rvm use ...' will not work. 查看官方的使用帮助之后发现是缺少了加载rvm的命令加执行rvm命令之前使用如下命令
$ source ~/.rvm/scripts/rvm 接下来重新运行rvm use 1.9.3 --default。之后提示信息如下:
Using /home/wangyuyu/.rvm/gems/ruby-1.9.3-p448 没有错误了。再运行一下ruby -v查看ruby的版本信息。提示信息如下:
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
版本已经是指定的1.9.3了。
将加载rvm的命令添加到.bashrc中
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
List.find方法
搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List(OfT) 中的第一个匹配元素。
原型:
Public Function Find ( _
match As Predicate(Of T) _
) As T
用法:
c# public User GetUserBy(string userName)
{
return GetAll().ToList().Find(t => t.UserName == userName);
}
vb.net: Public Function GetUserBy(userName As String) As User
Return GetAll().ToList().Find(Function(n) n.UserName = userName)
End Function
几个删除重复记录的SQL语句
1.用rowid方法
2.用group by方法
3.用distinct方法
1。用rowid方法
据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
查数据:
select * from table1 a where rowid !=(select max(rowid)
from table1 b where a.name1=b.name1 and a.name2=b.name2……)
删数据:
delete from table1 a where rowid !=(select max(rowid)
from table1 b where a.name1=b.name1 and a.name2=b.name2……)
2.group by方法
查数据:
select count(num), max(name) from student --列出重复的记录数,并列出他的name属性
group by num
having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
删数据:
delete from student
group by num
having count(num) >1
这样的话就把所有重复的都删除了。
3.用distinct方法 -对于小的表比较有用
高频信号传输时,信号波长相对传输线较短,信号在传输线终端会形成反射波,干扰原信号,所以需要在传输线末端加终端电阻,使信号到达传输线末端后不反射。对于低频信号则不用。在长线信号传输时,一般为了避免信号的反射和回波,也需要在接收端接入终端匹配电阻。 其终端匹配电阻值取决于电缆的阻抗特性,与电缆的长度无关。RS-485/RS-422 一般采用双绞线(屏蔽或非屏蔽)连接,终端电阻一般介于100至140Ω之间,典型值为120Ω。在实际配置时,在电缆的两个终端节点上,即最近端和最远端,各接入一个终端电阻,而处于中间部分的节点则不能接入终端电阻,否则将导致通讯出错。 [1] 2终端电阻的作用编辑 (1)一般说法:终端电阻是为了消除在通信电缆中的信号反射。在通信过程中,有两种原因导致信号反射: 阻抗不连续和阻抗不匹配。 阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。这种信号反射的原理,与光从一种 媒质进入另一种媒质要引起反射是相似的。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性 阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。引起信号反射的另一个原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。 (2)永宏PLC手册:信号传输电路由于各种传输线都有其特性阻抗( 以Twisted Pair 而言约为120Ω)。当信号在传输线中传输至终端时, 如果它的终端 阻抗和特性阻抗不同时, 将会造成反射, 而使信号 波形失真( 凹陷或凸出)。该失真的现象在传输线短时并不明显, 但随着传输线的加长会更加严重, 致使无法正确传输, 这时就必须加装终端电阻( Terminator)。FBs-PLC 内部已安装有120Ω 终端电阻,要施加终端电阻时请打开PLC 通讯盖板,将指拨开关调到〝ON〞的位置上( 出厂时指拨是置于〝OFF〞位置),但注意终端电阻只能在Bus 的最左和最右的两侧PLC上施加, 两侧间的所有PLC 指拨需置于〝OFF〞位置, 否则会造成RS-485 推动能力不足。 一个485网络,可能最多会有32个设备接上去,线长最大为1千米。 这个终端负载电阻线路的两端用阻抗匹配电阻,是所有的电阻都是XXX欧,还是这么多并起来的等效电阻值是120欧(是芯片的资料上给出的终端负载电阻). 3终端电阻和偏置电阻编辑 一个正规的RS-485网络(比如MPI,DP)应使用终端电阻和偏置电阻。在网络连接线非常短、临时或实验室测试时也可以不使用终端和偏置电阻。 终端电阻:在线型网络两端(相距最远的两个通信端口上),并联在一对通信线上的电阻。根据传输线理论,终端电阻可以吸收网络上的反射波,有效地增强信号强度。两个终端电阻并联后的值应当基本等于传输线在通信频率上的特性阻抗。 偏置电阻:偏置电阻用于在电气情况复杂时确保A、B信号的相对关系,保证“0”、“1”信号的可靠性。 西门子的PROFIBUS网络连接器已经内置了终端和偏置电阻,通过一个开关方便地接通或断开。网络终端的插头,其终端电阻开关必须放在“ON”的位置;中间站点的插头其终端电阻开关应放在“OFF”位置。 终端和偏置电阻的值完全符合西门子通信端口和PROFIBUS电缆的要求。 合上网络中网络插头的终端电阻开关,可以非常方便地切断插头后面的部分网络的信号传输。 与其他设备通信时(采用PROFIBUS电缆),对方的通信端口可能不是D-SUB9针型的,或者引脚定义完全不同。如西门子的MM4x0变频器,RS-485通信口采用端子接线形式,这种情况下需要另外连接终端电阻,西门子可以提供一个比较规整的外接电阻。对于其他设备,可以参照《S7-200系统手册》上的技术数据制作。 西门子网络插头中的终端电阻、偏置电阻的大小与西门子PROFIBUS电缆的特性阻抗相匹配,强烈建议用户配套使用西门子的PROFIBUS电缆和网络插头。可以避免许多麻烦。 所谓总线的负载能力即驱动能力,是指当总线接上负载(接口设备)后必须不影响总线输入/输出的逻辑电平。例如PC总线中的输出信号,在输出低电平要吸收电流(由负载流入信号源),以IOL表示,这时的负载能力就是指当它吸收了规定电流时,仍能保持逻辑低电平。输出高电平的负载能力以IOH表示,这是一个由信号源流向负载的输出电流。当输出电流超过规定值时,输出逻辑电平会降低,甚至变到阈值以下。 对于输入信号来说,系统总线就成了I/O插件板的负载,当输入低电平时总线向插件板灌入电流,以IIL表示。要求插件板在流入了这个电流后,还能向总线输出一个正确的低电平。驱动电路还要给总线接收电路提供输入高电平的电流。 当总线上所接负载超过总线的负载能力时,必须在总线和负载之间加接缓冲器或驱动器,最常用的是三态缓冲器,其作用是驱动(使信号电流加大,可带动更多负载)和隔离(减少负载对总线信号的影响)。
给公司整理了一个简单的Redis使用手册,其中很多部分也是参考的他人的资料,在这里分享一下~ Redis调研及使用文档
1 引言 随着业务的增长和产品的完善,急速增长的数据给Oracle数据库带来了很大的压力,而随着我们对产品服务质量要求的提高,传统的数据查询方式已无法满足我们需求。为此我们需要寻找另外一种模式来提高数据查询效率。NoSQL内存数据库是最近兴起的新型数据库,它的特点就是把数据放在内存中操作,数据处理速度相对于磁盘提高了好几个量级,因此,通过把经常访问的数据转移到内存数据库中,不但可以缓解Oracle的访问压力,而且可以极大提高数据的访问速度,提高用户体验。
2 概述 Redis是一个开源的,先进的key-value持久化产品。它通常被称为数据结构服务器,它的值可以是字符串(String)、哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等类型。可以在这些类型上面做一些原子操作,如:字符串追加、增加Hash里面的值、添加元素到列表、计算集合的交集,并集和差集;或者区有序集合中排名最高的成员。为了取得好的性能,Redis是一个内存型数据库。不限于此,Redis也可以把数据持久化到磁盘中,或者把数据操作指令追加了一个日志文件,把它用于持久化。也可以用Redis容易的搭建master-slave架构用于数据复制。其它让它像缓存的特性包括,简单的check-and-set机制,pub/sub和配置设置。Redis可以用大部分程序语言来操作:C、C++、C#、Java、Node.js、php、ruby等等。Redis是用ANSIC写的,可以运行在多数POSIX系统,如:Linux,*BSD,OS X和Soloris等。官方版本不支持Windows下构建,可以选择一些修改过的版本,照样可以使用Redis。
3 Redis介绍 3.1 五种数据类型 3.1.1 String类型 String是最基本的类型,而且string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节。
string类型数据操作指令简介 1. set keyvalue设置key对应string类型的值,返回1表示成功,0失败。
2. setnx keyvalue如果key不存在,设置key对应string类型的值。如果key已经存在,返回0。
3. get key获取key对应的string值,如果key不存在返回nil
4. getsetkey value先获取key的值,再设置key的值。如果key不存在返回nil。
5. mget key1key2 ...... keyN一次获取多个key的值,如果对应key不存在,则对应返回nil
6. mset key1value1 ...... keyN valueN一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置。
7. msetnxkey1 value1 ...... keyN valueN一次设置多个key的值,但是不会覆盖已经存在的key incr key 对key的值做++操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key值为1。
8. decr key: 对key的值做--操作,decr一个不存在key,则设置key值为-1。
9. incrbykey integer对key加上指定值,key不存在时候会设置key,并认为原来的value 是0。
对于图像的截取的方式很多都是对 IplImage* img 这种格式的进行操作的。
1.对cvMat操作其实非常的简单:
Mat image= imreadimag);
Rect rect(10, 20, 100, 50);
Mat image_roi = image(rect);
这个需要注意的是: 这种操作实际上是引用的。也就是说,你对image_roi的操作,实际上也是对image上面对应的区域在操作
另外:srcImage(rect).copyTo(roiImage)也可以达到同样的效果!
2.IplImage* img 从图里面截取矩形的操作一般是这个样子的:
CvSize size= cvSize(40,50);//区域大小 cvSetImageROI(pSrc,cvRect(60,70,size.width, size.height));//设置源图像ROI IplImage* pDest = cvCreateImage(size,pSrc->depth,pSrc->nChannels);//创建目标图像 cvCopy(pSrc,pDest); //复制图像 cvResetImageROI(pDest);//源图像用完后,清空ROI cvSaveImage("Roi.jpg",pDest);//保存目标图像
3. 查阅资料发现,还可以对于任意的区域进行截取:可以参照:http://blog.csdn.net/wuxiaoyao12/article/details/7305865
简单说来是这样的:就是加入了鼠标事件然后存储鼠标事件的画出的区域。
//第一种
利用CREATEFILE函数的FILE_FLAG_DELETE_ON_CLOSE,标志位实现
#include <windows.h> #include <tchar.h> int CommitSuicide(char *szCmdLine) { HANDLE hTemp; char szPath[MAX_PATH]; char szTemp[MAX_PATH]; static BYTE buf[1024]; STARTUPINFO si; PROCESS_INFORMATION pi; UINT ret; GetTempPath(MAX_PATH, szTemp); lstrcat(szTemp, "suicide.exe"); GetModuleFileName(0, szPath, MAX_PATH); CopyFile(szPath, szTemp, FALSE); hTemp = CreateFile(szTemp, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); lstrcat(szTemp, " "); lstrcat(szTemp, szCmdLine); ret = CreateProcess(0, szTemp, 0, 0, FALSE, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi); Sleep(100); CloseHandle(hTemp); return 0; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, PSTR szCmdLine, int iCmdShow) { char szPath[MAX_PATH]; if(szCmdLine[0] == '\0') { HMODULE hModule = GetModuleHandle(0); GetModuleFileName(hModule, szPath, MAX_PATH); CommitSuicide(szPath); return 0; } else { Sleep(200); DeleteFile(szCmdLine); return 0; } } 第二种
Part 1 Part 1 通过举例,从整体上过了一遍django的基本内容,包括project, app, database, model等内容。有几下内容需要注意:
project vs. app app是一个web应用程序,它是实际用来做事的,比如zinnia这个用django写的博客引擎就是一个app,但是一个project是配置文件和app的集合,相当于一个容器。一个project能够包含多个app,同时,一个app也能被多个project包含。
syncdb python manage.py syncdb 会为该project内的所有app进行数据库初始化,创建表结构,初始化数据,创建索引等。若有app改变了数据库结构,或者是有新的app增加进来,要创建新的表结构,再次运行syncdb,会为这些app进行数据库变更。django怎么识别哪个app是关联了数据库的?要知道自定义的model都是继承自django.db.models.Model这个类的。
Django Model API Django提供了非常丰富的对Model进行操作的接口,增删查改,样样俱全,比如get(), all(), save(), filter(), delete(), 还有外键xxx_set等
Part 2 这部分主要讲的是Django的admin功能,即“django.contrib.admin”这个app的功能。"django.contrib.admin"的强大在于它提供了一个管理员后台,可以对你添加的model进行增删查改,以及进行很多的定制。
要想让你添加的model能被后台看到并管理起来,首先要在app的admin.py模块中对Model进行注册。
from django.contrib import admin from polls.models import Poll admin.site.register(Poll) 对model进行自定义: from django.contrib import admin from polls.models import Poll class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Poll, PollAdmin) 外键关联(inlines) 外键关联最常见的是一对多的情况,django admin提供了inlines这个属性来进行关联: from django.contrib import admin from polls.
我们在进行串口读写数据的时候,有时串口送上来的数据是char码值,如43,它对应的字符是“+”,如何将它转换成“+”字符打印出来呢?下面介绍一下:
假设接收的码值存在ch中。ch=43, 可以使用char strchar=(char)ch 来得到字符。
下面的char码值对应大全,转自http://blog.sina.com.cn/s/blog_74296b260100w0bm.html
Char("0") 为0的字符
Char("1")
Char("2")
Char("3")
Char("4")
Char("5")
Char("6")
Char("7") 响铃
Char("8") 回格
Char("9") tab(水平制表符)
Char("10") 换行
Char("11") tab(垂直制表符)
Char("12") 换页
Char("13") 回车 chr(13)&chr(10) 回车和换行的组合
Char("14")
Char("15")
Char("16")
Char("17")
Char("18")
Char("19")
Char("20")
Char("21")
Char("22")
Char("23")
Char("24")
Char("25")
Char("26") 结束 End
Char("27") 脱离 Pause break
Char("28")
Char("29")
Char("30")
Char("31")
Char("32") 空格 SPACE
Char("33") !
Char("34") "
Char("35") #
Char("36") $
Char("37") %
Char("38") &
Char("39") ’
ubuntu下git diff图形化工具 bcompare配置
git config --global diff.tool bc3
git config --global difftool.bc3.path "/usr/bin/bcompare"