public static void many2one(List<String> bookFilePaths, String toPath,String distFileName) { if (bookFilePaths != null && bookFilePaths.size() > 0) { File[] files = new File[bookFilePaths.size()]; for(int i = 0; i < bookFilePaths.size(); i++){ files[i] = new File(bookFilePaths.get(i)); } if (files != null && files.length > 0) { try { ArrayList pages = new ArrayList(files.length - 1); FileSeekableStream[] stream = new FileSeekableStream[files.length]; for (int i = 0; i < files.length; i++) { stream[i] = new FileSeekableStream( files[i].
解决方式是:1.先安装python 的setuptoos工具包
2.安装pytz模块
[本文属原创,如有转载,请注明出处http://blog.csdn.net/yl02520/article/]
Web Worker是HTML5引进的一个重要的API,它让一直受人诟病的单线程运行的JavaScript有了多线程的能力,有了Web Worker,开发者就可以把一些重量级耗时的计算任务单独放在另外一个线程中去运行,这样就可以让多个线程同时运行,最大限度的发挥CPU多核的功能。
Web Worker基本的用法如下:
var worker = new Worker(“background.js”); // background.js文件是事先准备好的,里面的JavaScript文件运行在后台,一般为重量级或耗时的运算。那么假设开发者需要动态的执行一系列的JavaScript程序该怎么办呢?
下面介绍一下Web Worker的高级用法,如何在不事先创建JS文件的前提下,动态的指定JavaScript程序在Worker中运行?
我们可以创建一个Blob对象,并把JavaScript文本赋值给Blob对象,然后通过window.URL.creatObjectURL方法生成一个URL,最后根据该URL创建Worker对象,那么刚才的JavaScript文本就运行在Worker线程中。这样就完成了把任务动态的分配给Worker线程去执行,而不需要事先创建一个JavaScript文件。
实例代码如下:
<html> <body> <script id="worker" type="javascript/worker"> self.postMessage("Message from Web Worker."); </script> <script> var worker_blob = new Blob([document.getElementById("worker").textContent]); var worker = new Worker(window.URL.createObjectURL(worker_blob)); worker.onmessage = function(event) { console.log("Received event: " + event.data); }; </script> </body> </html>
背景 开篇之前我一直在想怎么把这个项目给讲清楚,如果在互联网公司有高并发场景对于这个内容的就比较容易接受。这里大概说一下背景:代码写于2013年四月份,最开始的雏形是在2012年写的,从另外一个项目上进行,代码侵入性比较强。我在今年四月份进行了剥离,实现可插拔式的监控。言归正传,当时对于性能领域非常有兴趣,所以就在想如何写一个框架对于现有项目对于"类级别(严格来讲是方法级别)"做性能监控。既然是性能监控,很容易就会发现需要回答三个问题:一、这个方法的并发请求数有多少?二、响应时间是多少?三、最佳并发请求数是多少?这三个问题其实就会衍生出我们今天要讲的这个框架意义:保证应用的可用性,实时监控各个节点的并发数,响应时间等。(吞吐量和响应时间相生相克,所以会在两者之前找一个最佳平衡点,就是常说的最佳并发数。理想状态下最佳并发请求数就是我们这里要设的限流上限阀值)。
限流的意义 下面先用一个简单的图来看看限流框架所处在的位置。
看到这张图的时候估计有很多人下意识的会想到Spring的拦截器,这里确实非常像,原理也类似。而且在我后面的实现中有两种方式:其中的一种就是基于Spring的拦截器实现的。另外一种其实是JDK的动态代理去实现的。讲到这里不知道有没有人会问为什么要限流?这里就做一些简单的解释。举一个浅显的例子:联想一下长江的三峡大坝,除了能发电之外另外一个作用就是防洪,如果洪水来了,没有三峡大坝,很有可能对于下游产生重大的洪涝灾害。引用到我们这里其实是一样的。当请求数异常升高时(洪水来了),对于应用来讲所承担的负载也会异常升高,这样直接的影响就是整个响应时间变慢,更糟糕的情况是系统直接崩溃。不仅如此,由于系统之前都是相关联的,所以很容易就会对其依赖的相关应用产生冲击(有点像多米诺骨牌)。限流的一个很重大的意义就是保证应用的可用性,讲到这里应该明白为什么需要限流了。
UML类图 接下来看一下整个UML类图:
这个图是比较简单。在这里我把整个限流做了一些简化,在完整版里面会有数据的存储和响应时间的监控。开始的数据是存储在DB里面,后面为了学习数据库的一些核心知识所以自己在写一个很简单的存储(写存储的意义仅仅只是为了学习,只是希望了解一下整个存储在于空间分配的一些思想,对于SQL协议那一块没有更多的涉及)。这里将不在讨论有关于存储的细节。
回到上面这张图,如我前面所说的,我用了两种方式去实现:一种就是Spring的拦截器方式,另外一种就是JDK的Proxy方式。
代码展示 接下来看一下几个类的代码,这里面最核心的类就是FlowMonitor.java,限流的具体逻辑都在里面。下面会把具体的代码贴出来,当看到代码的时候估计会觉得这东西太简单了。下面我会抛出更多的问题,也是本文中没有实现的。 FlowMonitor类 /** *限流的作用 *实现一个缓冲队列,让一部分进入等待状态 *区间监控 *如果一个线程返回特别慢怎么办,比如在release之前抛了异常 * @author 百恼 2013-04-11上午11:26:36 * */ public class FlowMonitor { //默认最大的并发数默认为100,可以配置 private int maxFlowSize = 100; //最大并发数 private int maxRunningSize = 0; //当前并发数 private AtomicInteger runningSize = new AtomicInteger(); //通过的数量 private AtomicInteger passSize = new AtomicInteger(); //失败的数量 private AtomicInteger loseSize = new AtomicInteger(); public FlowMonitor(){ super(); } public FlowMonitor(int maxFlowSize){ this(); this.maxFlowSize = maxFlowSize; } /** * 线程进入开关,即使这里用了一些Atomic类,这里仍然会有并发问题。 * @return */ public boolean entry(){ //每个类中一个配置maxFlowSize if(maxFlowSize>0){ if(maxFlowSize<=runningSize.
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平均值,而由于数据倾斜的原因造成map处理数据量的差异过大,使得这些平均值能代表的价值降低。Hive的执行是分阶段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本所在。规避错误来更好的运行比解决错误更高效。在查看了一些资料后,总结如下。
关键词
情形
后果
join
其中一个表较小,但是key集中
分发到某一个或几个Reduce上的数据远高于平均值
大表与大表,但是分桶的判断字段0值或空值过多
这些空值都由一个reduce处理,非常慢
Count(Distinct)
某特殊值过多
处理此特殊值的reduce耗时
Group by
group by 维度过小,某值的数量过多
处理某值的reduce非常耗时
1.2原因:
1)、key分布不均匀
2)、业务数据本身的特性
3)、建表时考虑不周
4)、某些SQL语句本身就有数据倾斜
1.3表现:
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。
2数据倾斜的解决方案
2.1参数调节:
hive.map.aggr = true
Map 端部分聚合,相当于Combiner
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
2.2 SQL语句调节:
力导向图(可拖动) 1. 数据格式 定义节点和连接对象数组。
【司机提示】
nodes和edges是必备的两个属性。nodes中的数据是一个表示节点的对象数组;edges是一个表示边的对象数组,其中source和target子属性是必备的,其值代表了nodes数组中的索引。节点和边数组都可以有额外的属性。 var dataset={ nodes:[//节点 { name:"Adam"}, { name:"Bob"}, { name:"Carride"}, { name:"Donovan"}, { name:"Edward"}, { name:"Felicity"}, { name:"George"}, { name:"Hannah"}, { name:"Iris"}, { name:"Jerry"} ], edges:[//边 { source:0,target:1,weight:1,color:1}, { source:0,target:2,weight:3,color:4}, { source:0,target:3,weight:4,color:6}, { source:0,target:4,weight:6,color:65}, { source:1,target:5,weight:3,color:76}, { source:2,target:5,weight:8,color:879}, { source:2,target:5,weight:7,color:989}, { source:3,target:4,weight:9,color:643}, { source:5,target:8,weight:1,color:54}, { source:5,target:9,weight:3,color:54}, { source:6,target:7,weight:4,color:45}, { source:7,target:8,weight:0,color:43}, { source:2,target:8,weight:8,color:243}, { source:3,target:8,weight:1,color:43}, { source:5,target:8,weight:5,color:13}, { source:6,target:8,weight:3,color:351}, { source:8,target:9,weight:4,color:1} ] }; 2. 力布局 转化数据为适合生成力导向图的对象数组
最后效果:
单击更新能实现像之前那样的更新了。
但是,单击添加和删除时,只能捕获第一个p标签,不能捕获第二个。
1. 根据ID确定点击的是哪个标签 var paragraphID=d3.select(this).attr("id") ; 2. 添加删除组合起来 if(paragraphID=="add"){ 3. 根据最后一个key添加一个值 var lastKeyValue=dataset[dataset.length-1].key; dataset.push({ key:lastKeyValue+1, value:newNumber }); 4. 根据i添加一个值 dataset.push({ key:i, value:newNumber });} 5. 1/2 值函数 var value=function(d){ return d.value; }; 6. 2/2// 更新比例尺,免使纵坐标超出范围 yScale.domain([0,d3.max(dataset,value)]);//只要更新定义域就行了,映射到的值域不变 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>testD3-18-update.html</title> <script type="text/javascript" src="http://localhost:8080/spring/js/d3.v3.js"></script> </head> <body> <button>单击更新</button> <br> <p id="remove">单击删除</p> <p id="add">单击添加</p> <br> <script type="text/javascript"> //键值对数据集 var dataset = [ {key:0,value:5}, {key:1,value:10}, {key:2,value:13}, {key:3,value:19}, {key:4,value:21}, {key:5,value:25}, {key:6,value:22}, {key:7,value:18}, {key:8,value:15}, {key:9,value:13}, {key:10,value:11}, {key:11,value:12}, {key:12,value:15}, {key:13,value:20}, {key:14,value:18}, {key:15,value:17}, {key:16,value:16}, {key:17,value:18}, {key:18,value:23}, {key:19,value:25}]; //设置SVG的高宽 var w=600; var h=250; var barPadding = 1; //定义序数比例尺 var xScale=d3.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>testD3-18-update.html</title> <script type="text/javascript" src="http://localhost:8080/spring/js/d3.v3.js"></script> </head> <body> <button>单击更新</button> <br> <p>单击添加</p> <br> <a>单击删除</a> <br> <script type="text/javascript"> //(1) 准备数据集 var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ]; //(2) 设置SVG的高宽 var w=600; var h=250; var barPadding = 1; //(3) 定义比例尺 var xScale=d3.scale.ordinal()// x是序数比例尺 .domain(d3.range(dataset.length)) .rangeRoundBands([0,w],0.05); var yScale=d3.scale.linear()// y仍然是线性比例尺 .domain([0,d3.max(dataset)]) .range([0,h]); //(4) 创建SVG元素 var svg = d3.
买了3年的x200的风扇终于残了。
其实早就有问题了,开始是转速慢,然后发展成声音特别大,后来是必须嘴吹以下作为初始启动力,如此种种。
联想做活动的时候还那去免费清洗了下,回来发现其实就管两天,然后问题依旧。
终于下定决心换。4S店换一个风扇400,淘宝买一个自己换25,所以直接从taobao买了俩。
换之前还得准备下。
第一是找个好的手动更换风扇的教程,拆解教程也行,操作时按图索骥。推荐这个:http://wenku.baidu.com/view/549d9846b307e87101f696ba.html
图文并茂,很详细。每一个步骤都有编号,其实这个很好。工具只要有一个小的十字螺丝刀就行了。千万别指望用要换风扇的这台电脑看教程。。。。。哈哈,这是笑话。
第二,一定要记住把所有的螺丝收拾好。一共有3~5种螺丝,不能混用,所以要分类放好。如果最后安装完了再多出来几个可就。。。。。个人认为最好的办法是:找一些纸袋,上面写上步骤编号,然后把每一步拆下的螺丝放入对应编号的袋子里,就完全不会错了。当然,用胶带粘什么的也行。
拆机和更换的过程基本没什么悬念,教程上写的很详细,个人感觉唯一需要注意的是拆装饰框的时候要小心,因为这玩意儿非常细,很脆弱,卡扣又比较结实,需要很耐心地水平方向慢慢往外撬。
换了风扇后我遇到一个问题:启动的时候风扇不转,及时运行过程中温度上升也不转,必须在温度上升后再重新启动,此时会报一个“fan error”错误,然后自动关机。再启动一次就好了。上网找了不少资料查原因,最后感觉可能是因为风扇是山寨的,要不传感器不行,要不电机不行,要不需要的启动电流过大,反正第一次启动的时候bios检测到的风扇转速不对,而那时系统温度还不高,所以风扇不转也启动了。
解决的办法就是去下一个软件“TPFanControl”来控制风扇。
但是试验了几次,貌似也不好使。最后,重装了win7,重启了5次,貌似还没问题。从这里看似乎是因为山寨风扇和原装风扇在系统中识别的并不相同吧。
eclipse中Ctrl+F查找功能,某天突然不能模糊匹配了,并且Ctrl+F面板中没有了原来的option,
用着好不方便,网上有说人需要重装eclipse,今天突然发现其实是我们犯2了,
Ctrl+F面板中的option并没有消失,只是面板变小了,把面板按右下角拖大一些就出来了。
纠结于Ctrl+F功能失效的同学,看到这个有没有什么想法?
void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)
源地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
目的地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
每次启动DMA相应通道,都会把B装载入A
void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)
Bsize: 每一个脉冲传递的字的个数,实际脉冲数为bsize+1
Srcbstep:每传递一个字后,源地址A增量
Desbstep:每传递一个字后,目的地址A增量
void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)
Tsize:每一帧的脉冲个数,脉冲递减到0时(即一帧传递完成,也是DMA传递完成),产生DMA中断。实际帧数为tsize+1
Srctstep:每个脉冲的最后一个字传递结束后,源地址A增量
Deststep:每个脉冲的最后一个字传递结束后,目的地址A增量
void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)
Srcwsize:当已经传递的脉冲数为srcwsize+1的整数倍时,源地址(B)增加srcwstep(常为0),并装载入源地址A
Deswsize:当已经传递的脉冲数为deswsize+1的整数倍时,目的地址(B)增加deswstep(常为0),并装载入目的地址A
void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)
Persel:选择触发DMA的外设中断源
Perinte:外设中断使能,
Oneshot:使能时,外设产生一次中断,就能够把一帧传递完。禁止,外设产生一次中断,只能传递一个脉冲
Cont:使能时,每次DMA结束后,需要再次启动DMA时,就不需要调用void StartDMACH1(void)。禁止时,重启DMA,需要调用void StartDMACH1(void)
Datasize:设置每个字是16位或者32位
8月15日,百度2道面试题:
1、来自《编程之美》的概率题:一个桶里面有白球、黑球各100个,现在按下述规则取球:的
i 、每次从通里面拿出来两个球;
ii、如果取出的是两个同色的求,就再放入一个黑球;
ii、如果取出的是两个异色的求,就再放入一个白球。
问:最后桶里面只剩下一个黑球的概率是多少?
2、算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
9月5日,华为2014校园招聘的机试题目
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数: void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
输入pInputStr: 输入字符串lInputLen: 输入字符串长度
输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
9月6日,网新恒天2014校园招聘笔试编程题
已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。
点评:老题,参考答案如下 //copyright@July 2013/9/24 void* memcpy(void *dst, const void *src, size_t count) { //安全检查 assert( (dst != NULL) && (src != NULL) ); unsigned char *pdst = (unsigned char *)dst; const unsigned char *psrc = (const unsigned char *)src; //防止内存重复 assert(!
1) Linux中主要有哪几种内核锁? 2) Linux中的用户模式和内核模式是什么含意? 3) 怎样申请大块内核内存? 4) 用户进程间通信主要哪几种方式? 5) 通过伙伴系统申请内核内存的函数有哪些? 6) 通过slab分配器申请内核内存的函数有? 7) Linux的内核空间和用户空间是如何划分的(以32位系统为例)? 8) vmalloc()申请的内存有什么特点? 9) 用户程序使用malloc()申请到的内存空间在什么范围? 10) 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式? 11) ARM处理器是通过几级也表进行存储空间映射的? 12) Linux是通过什么组件来实现支持多种文件系通的? 13) Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个) 14) 对文件或设备的操作函数保存在那个数据结构中? 15) Linux中的文件包括哪些? 16) 创建进程的系统调用有那些? 17) 调用schedule()进行进程切换的方式有几种? 18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的? 19) 进程调度的核心数据结构是哪个? 20) 如何加载、卸载一个模块? 21) 模块和应用程序分别运行在什么空间? 22) Linux中的浮点运算由应用程序实现还是内核实现? 23) 模块程序能否使用可链接的库函数? 24) TLB中缓存的是什么内容? 25) Linux中有哪几种设备? 26) 字符设备驱动程序的关键数据结构是哪个? 27) 设备驱动程序包括哪些功能函数? 28) 如何唯一标识一个设备? 29) Linux通过什么方式实现系统调用? 30) Linux软中断和工作队列的作用是什么? 转载于 http://blog.chinaunix.net/u3/118354/showart_2311237.html 1. Linux中主要有哪几种内核锁?
Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;
伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。
Linux的内核锁主要是自旋锁和信号量。
自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
1.墨迹书写工具是office的一个批注功能,在office的07及以上版本可以使用。首先需要在office中开启墨迹书写工具。 方法是
2.在加入墨迹书写工具后,在菜单栏上会出现笔的选项
点击进入
但你会发现你的笔,荧光笔,橡皮,选择对象都是不可用的,要达到上图的可用的状态需要做如下操作,因为该功能本事是微软用于其tablePC的,在普通pc机器上不可使用。
我们做如下激活。需要下载该链接里的文件,按照说明激活。
http://down.51cto.com/data/1081617
3.有了墨迹书写工具我们在c#里该如何使用呢?
以下是我本人写的代码,请参照
http://down.51cto.com/data/1081618
最近在对hive做优化时遇到了Case When Else End语法,所以就总结一下相关的知识给大家分享一下,
具体的格式如下:
条件判断语句 update:
update table set 字段1=case when 条件1 then 值1 when 条件2 then 值2 else 值3 end where …… select:
select 字段1, 字段2, case 字段3 when 值1 then 新值 when 值2 then 新值 end as 重新命名字段3的名字 from table where …… order by …… CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用CASE。 首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下: SELECT <myColumnSpec> = CASE WHEN <A> THEN <somethingA> WHEN <B> THEN <somethingB> ELSE <somethingE> END 在上面的代码中需要用具体的参数代替尖括号中的内容。
1. 添加元素语法: [selection].append("p"); 2. 怎么做? 将D3.js解压到桌面,同时在桌面创建一个index.html
<html> <head> <meta charset="utf-8"> <title>D3测试</title> <script type="text/javascript" src="d3.js"></script> </head> <body> <script type="text/javascript"> d3.select("body").append("p").text("New paragraph!"); </script> </body> </html> 3. 效果: 4. 代码解释: 引用D3所在路径 <script type="text/javascript" src="d3.js"></SCRIPT> 选择body标签,为之添加一个p标签,并设置它的内容为New paragraph! d3.select("body").append("p").text("New paragraph!"); 你可以将链接选择换行,这样代码结构更清晰 d3.select("body") .append("p") .text("New paragraph!"); 当然,也可以避免使用链接语法: var body = d3.select("body"); var p = body.append("p"); p.text("New paragraph!"); 以后,你也可以把这些页面和JS部署到你自己的服务器中。我们之后的示例都将部署到服务器,并使用Chrome浏览器演示!!
Treap是一棵二叉搜索树,只是每个节点多了一个优先级fix,对于每个节点,该节点的优先级小于等于其所有孩子的优先级。
当然,引入优先级fix的目的就是防止BST退化成一条链,从而影响查找效率。
所以,这样看来就是:Treap中对于节点的关键字key来说,它是一棵二叉搜索树,而对于fix来说,它是一个最小堆,所以
Treap可以看成是Tree+Heap,只是这里的Heap不一定是完全二叉树。Treap的平均时间复杂度为log(n).
Treap跟笛卡尔树几乎是一模一样的,只是用途不同。
笛卡尔树是把已有的一些(key, fix)二元组拿来构造树,然后利用构树过程和构造好的树来解决LCA,RMQ等等问题。而
Treap的目的只是对一些key进行二叉搜索,但是为了保证树的平衡性,为每个key随机地额外增加了一个fix属性,这样从概
率上来讲可以让这棵树更加平衡。
对于Treap来说,主要有几大操作:插入,删除,查找,旋转,找第K大元素,找关键字x的排名,计算Treap的高度,删除
Treap,其它的操作比如合并,分离,反转等等以后再说,另外,对于Treap来说,它的中序遍历的结果就是按照关键字从小到
大的顺序排列的。
下面用一个题来看看Treap的各种操作。
题目:http://poj.org/problem?id=1442
题意:给一个序列,然后给出m个查询,每次查询输入一个数x,对于第i次查询,输出前x个数中第i大的关键字的值。
分析:我们可以用其它数据结构解决,这里我们先学用Treap怎么做吧,方法就是:每次我们都插入前x个数中没有插过的,当
然程序中我们用index来划分界限,然后输出Kth(root,i)即可。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct Treap
{
int size;
int key,fix;
Treap *ch[2];
Treap(int key)
{
size=1;
fix=rand();
this->key=key;
ch[0]=ch[1]=NULL;
}
int compare(int x) const
{
if(x==key) return -1;
return x<key? 0:1;
}
void Maintain()
{
size=1;
if(ch[0]!=NULL) size+=ch[0]->size;
if(ch[1]!=NULL) size+=ch[1]->size;
}
};
void Rotate(Treap* &t,int d)
{
Treap *k=t->ch[d^1];
t->ch[d^1]=k->ch[d];
k->ch[d]=t;
t->Maintain(); //必须先维护t,再维护k,因为此时t是k的子节点
k->Maintain();
t=k;
}
void Insert(Treap* &t,int x)
{
if(t==NULL) t=new Treap(x);
else
{
//int d=t->compare(x); //如果值相等的元素只插入一个
int d=x < t->key ?
之前碰到一个文件采用第一种加载方式时,如果地图文件以及相对应的图块文件放在资源文件中的另一个文件下,比如map文件夹下时,会发生错误,找不到图块文件,因为源码依然实在资源文件下找。
这种情况下,比如对资源进行分类,把地图文件单独放到一个文件夹下,就要用到第二种加载方式了
//创建一个CCTMXTiledMap(第一种加载方式) CCTMXTiledMap *bgMap = CCTMXTiledMap::create("tiledMap\\background.tmx"); //创建一个CCTMXTiledMap(第二种加载方式) std::string resources = "TileMap"; std::string file = resources + "/orthogonal-test1.tmx"; CCString* str = CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()->fullPathForFilename(file.c_str()).c_str()); //create参数说明:资源文件全路径,资源路径目录 CCTMXTiledMap *map = CCTMXTiledMap::createWithXML(str->getCString() ,resources.c_str()); 另外tiledMap不支持bmp的图块图片,每一个layer不能为空,必须有一个图块填充,不然也会报内存错误!
转自:《http://ccckmit.wikidot.com/ja:listener》
專案下載:Listener.zip
簡介 在 Java 當中沒有像 C# 當中的委派 (delegate) 語法,所有的委派任務都交由一種稱為 Listener 的物件完成,其實作方法乃是利用 Register - Callback 的反向呼叫機制,為了說明這個機制的原理,我們撰寫了以下的程式,以便說明 Listener - Callback 的實作原理。
程式範例 檔案:Listener.java
interface Listener { void onEvent(String str); } 檔案:EventListener.java
public class EventListener implements Listener { String name; public EventListener(String name) { this.name = name; } public void onEvent(String str) { System.out.println(name+":"+str); } } 檔案:Callback.java
import java.util.*; public class Callback { List<Listener> listeners = new ArrayList<Listener>(); public static void main(String[] args) { Callback callback = new Callback(); callback.
这几天做xml打包、解包的通用工具,学习了下xpath的使用方法,它可以很方便查询某一节点的值,有点类似于jquery的选择器,具体事例如下:
public String queryNodeValue(final Document doc, String expression) throws XPathExpressionException { XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(new NamespaceContext() { @SuppressWarnings("rawtypes") @Override public Iterator getPrefixes(String namespaceURI) { throw new UnsupportedOperationException(); } @Override public String getPrefix(String namespaceURI) { throw new UnsupportedOperationException(); } @Override public String getNamespaceURI(String prefix) { return doc.lookupNamespaceURI(prefix); } }); XPathExpression expr = xpath.compile(expression); Object result = expr.evaluate(doc, XPathConstants.STRING); return result == null ? null : result.
setlocale函数原形为: char *setlocale( int category, const char *locale ); 头文件:<locale.h>
所支持的操作系统为: Win 95, Win NT 对于简体中文可以使用如下设置:setlocale( LC_ALL, "chs" ); (编码ANSI) 调用setlocale原因:
在C/C++语言标准中定义了其运行时的字符集环境为"C",是ASCII字符集的一个子集,mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以会将每一个中文拆成2个ASCII编码进行转换,结果是会形成4个wchar_t的字符组成的串。
通过调用setlocale( LC_ALL, "chs" )函数,告诉mbstowcs目前cstr串中包含的是chs编码的字符串.
这个函数会改变整个应用程序的字符集编码方式,需要调用setlocale( LC_ALL, "C" )函数来还原。
应用场景:
针对无法读取中文路径下的文件的问题,在解析配置文件前,加入一句: setlocale(LC_ALL,"chs");即可。
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。 他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢? viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为 nil 的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
- ( void ) loadView {
UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view setBackgroundColor:_color] ;
self.view = view;
[ view release] ;
}
你在控制器中实现了 loadView 方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到 didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy 里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的 view。
1.打开Deployment tool工具。
2.在其中新建project。
3.在“building”内选择*.m文件为主文件,其余文件为附加文件。
4.在package内选择要打包的文件,不要选择不需要打包的文件。开始我把源文件都选择了打包,结果,每次解包都要提示是否覆盖。
5.building -->package.
6.在distrib内,选择*.exe文件即可。
注意:
开始生产的打包文件fig界面总是一闪而过,后来发现,将设置背景写在了“function Dimage_OpeningFcn(hObject, eventdata, handles, varargin)”内导致,将设置背景写在“function varargout = Dimage_OutputFcn(hObject, eventdata, handles) ”内问题解决。
1.问题描述:一个在Django框架下使用Python编写的定时更新项目,在Windows系统下测试无误,在Linux系统下测试,报如下错误:
ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128)
2.原因分析:字符问题。在Windows系统转Linux系统时,字符问题很容易出现。
3.解决办法:在出现问题的页加上如下三行即可:
import sys reload(sys) sys.setdefaultencoding('utf-8')
今天在OOW的ACOUG专场分享了Think Different的主题。
[@more@] 今天一天在会场非常的充实。到了会场后先去听了今天的KeyNotes,其中Steve Miranda的云计算的主题以及Andy Mendelsohn的12c数据库对云计算的支持,都是本次大会的重点话题。Oracle 12c中的C指的就是CLOUD,而12c最大的亮点PLUGABLE DB就是Oracle在DB层对云架构的支持。
如果说去年OOW大会只是给出了12c PLUGABLE DATABASE的概念,那么今年OOW上Oracle已经想好要如何用PDB来支持云服务了,甚至我怀疑Oracle来云服务的收费细则都已经定义好了,青铜、白银和黄金三档,每档对应的架构和服务都已经定义清楚,而在各个档之间进行升级也同样进行说明。看来Oracle已经准备利用12c来打造数据库服务云了。只不过以Oracle以往收费的标准,不知道一些不想自己搭建环境、维护数据库的中小企业,能否接受正版云服务的价格。
中午OOW的午饭一如既往的不给力,这种面包、三明治的配置更适合老外,估计大部分国内参会者,这三天午饭会比较郁闷。
下午全程参加了展览大厅的ACOUG活动,首先是Eygle两个优化的主题,然后是Kamus三个关于升级的主题,最后是我的两个主题,一个是ODA,另一个是Think Different。可惜的是,每个主题的时间只有二十分钟,而我们任何一个主题正常时间都应该超过1小时。因此,最终Eygle只讲了一个主题就超过了两个主题的时间,而Kamus最后紧赶慢赶终于完成了三个主题,但是时间方面超了不少。根据他们两个的前车之鉴,我直接选择了现场绝大部分人都想听的Think Different,而舍弃了ODA的主题。其实舍弃ODA也比较可惜,在OOW的现场展示了ODA的最新版本,而我在中午的时候还把最新版的ODA的内容添加到了PPT里面。
剩下一些零碎的时间基本上都在公司的展台帮忙,除了解答问题,当背景合影外,还碰到了不少新、老朋友。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-1060792/,如需转载,请注明出处,否则将追究法律责任。 转载于:http://blog.itpub.net/4227/viewspace-1060792/
查看命令
1.变更查看commit log的格式
git log --pretty=oneline 每个commit内容只显示一行(oneline还可以改为short等)
2.获取远程分支后,查看要并进本地分支的内容是什么,本地分支为branchName
git fetch origin
git log --no-merges origin/master branchName
3.查看远程分支更新内容,同2
git fetch origin
git log origin/featureA ^featureA
创建和更新分支 1.本地新建一个featureB,并把远程服务器的master分支clone下来
git checkout -b featureB origin/master 2.合并远端服务器
git checkout featureB
如果远端服务器已经更新了,要先fetch
git fetch origin
会把远端的新分支和内容取下来。
git merge origin/featureBee
融合远端分支到本地
git push origin featureB:featureBee (格式——git push 远端名 本地分支名:远程服务器对应的分支名)
把本地的featureB内容push到远端featureBee
3.衍合——即把分支A的特性融合到指定分支
git checkout featureA 打开分支A
git rebase origin/master 意思是已经从远端服务器(origin)fetch下来master了,现在要把当前的featureA的内容衍合到origin/master(服务器端的master)
git push origin featureA 提交该衍合操作
如果要覆盖远端的featureA(当现在的featureA并非原来的后续更新)可以加-f参数,表示force
git push -f origin featureA
应届生进入普华永道pwc的待遇如何?有什么福利?怎么发展?来看看吧……
上海普华永道pwc在市中心最繁华的地段的普华永道大厦,和花旗银行同处一楼,新天地对面,环境非常幽雅。在普华永道工作,待遇不会低,但是想要有个好身体很难,因为压力太大,工作强度也大,加班和随时随地接电话是家常便饭。先来看看一个应届生的情况:
我普通本科毕业,家住黑龙江齐齐哈尔,刚毕业时在普华永道实习,半年后录用,当时月工资+奖金平均下来4500左右,现在从助理会计师升级,月工资奖金7000+. 人在上海,去掉房租吃饭应酬每月最多能存下2000块钱,不知道何时能买上房子,哎,遥遥无期啊,最羡慕那些上海公务员,很多人什么都不干都能10000+哎 顺便说下,我每天只能睡6个小时,压力巨大,外企不是人啊
如果一个专业员工(professional staff)在普华永道终老一生的话(但是大多数人都不用妄想了),
他的职业路径会是如下所示:
审计员(associate,2年)——高级审计员(senior associate,3年)——经理(manager,3年)
——高级经理(senior manager,3年)——董事(director,可选)——合伙人(partner,终身)
在审计员到高级审计员的5年时间里,由低到高可以细分为a2,a1,sa3,sa2和sa1。
无论是本科生还是研究生毕业,如果没有四大的专业经历的话,进公司必须从a2做起。
研究生可以多拿300-500元的工资,仅此而已。
所以研究生进四大绝对是鸡肋,一方面拼体力不是本科生的对手,
另一方面,得到的回报也不能和3年研究生的投入相匹配,
还要听一些比自己年少的senior的使唤,
因此,这几年来,研究生入四大已经越来越稀少了。
通常在升经理之前,每年晋升一级是很有保证的,
尽管在审计员升高级审计员会有一个小坎,但多数人都能顺利过关
如果你因为工作不力或者结怨而被delay的话,那么你真的算混得比较惨的
比delay更惨的则是劝退,现在上海普华永道的员工总数已近2000人
所以每年有几个员工被劝退也是很正常的事情
决定审计员阶段(含高级审计员)升迁的主要依据
是高级员工(如高级审计员和经理)对下级员工的评价和推荐
每年6月份,公司会要求下级员工在专门的考评系统中按项目进行自我评价
再由高级员工在考评系统中对本项目的下级员工进行评分并撰写评语
一般是高级审计员评审计员,经理评高级审计员,合伙人评经理
因为项目实在太多,高级员工需要评价的下级员工也实在太多
所以高级员工只管评分,评语部分也有下级员工自行撰写,高级员工审阅通过即可
评分为5分制,1分最好,5分最低
通常如果没有个人恩怨的话,就从3分开始起评
为了保证大家评分标准基本一致,hr会计算高级员工打出的加权平均分,
如果分数打得比较极端的话,会要求进行相应的更正
评分完毕后就是开senior meeting(这里仅以为审计员升高级审计员为例)
因为需要评价的员工实在太多,而会议时间也就2、3个小时
因此只能按“枪打出头鸟”的方法形式,对特别优秀和特别失败的员工进行评价
hr将各个审计员按照加权评分高低进行排列,选出评分最高的几位和最低的几位
然后由各个高级审计员进行评价,然后大家就七嘴八舌的说开了
除非你真的结怨很深,一般大家也就得过且过,默认分数的排列
对于排列最末的几位,hr还会征询其他经理的意见,如果大家都觉得这些员工很差的话
delay和劝退就是难免的事情了
所以这个会议俗名“小黑会”
小黑会结束后,就是论功行赏的时候,按照分数的不同分为5到6级
渐次拉开每个分数段的工资水平,
最高级和最低级的基本工资差距约在1500元左右(sa3 level)
考虑到加班费是按照基本工资计算的,实际到手的差距可能更大
在公司里,如果你会做事的话,大家自然会为你说好话;
如果你不会做事但是很会做人的话,大家也愿意睁一眼闭一眼,让你随大流晋升;
如果你上述两件都不在行的话,那真的只能说sorry了。
无论在哪里,做事和做人都是十分重要的。
四大的一个特点是可以准确预计未来几年自己的收入水平,
因为四大员工的收入来源有限,而工资的涨幅比较稳定
四大员工的收入来源限于基本工资、加班费和出差补贴
第一年员工的工资现在是5100元左右,其后每年约有20-30%的涨幅
仅以涨幅论的话,审计员升高级审计员(a1-sa3)是最大的
因为你在成为高级审计员后,需要单独负责一个项目,责任和工作负担都有较大的增长
然而,一切也仅限于此了,四大没有任何其它形式的补贴,如房贴车贴等
也不会发放任何节假日的奖金福利,甚至连发个月饼也不行
所有的报酬都是建立在金钱上的,万分简单却也十分单调
对于税务部门来说,上述路径图换成顾问——高级顾问——经理即可
咨询部门也与此类似,区别在于,咨询的a2大多已经是有工作经验的员工了
因此升经理的时间可能会推迟2年
在普华永道作了3年高级审计员之后,通常就该升经理了
在四大,升经理比在外面的企业相对容易,
因为在四大,经理是一个title;
刊名全称小类名称(中文) 2008年影响因子
HUMAN-COMPUTER INTERACTION 计算机:控制论2.905
BIOINFORMATICS 计算机:跨学科应用4.328
IEEE TRANSACTIONS ON MEDICAL IMAGING 计算机:跨学科应用4.004
JOURNAL OF THE AMERICAN MEDICAL INFORMATICS ASSOCIATION计算机:跨学科应用 3.428
MEDICAL IMAGE ANALYSIS 计算机:跨学科应用3.602
NEUROINFORMATICS 计算机:跨学科应用2.889
ACM COMPUTING SURVEYS 计算机:理论方法9.92
IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION 计算机:理论方法 3.736
IEEE TRANSACTIONS ON NEURAL NETWORKS 计算机:理论方法3.726
JOURNAL OF THE ACM 计算机:理论方法2.339
INTERNATIONAL JOURNAL OF COMPUTER VISION 计算机:人工智能5.358
IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE计算机:人工智能 5.96
MEDICAL IMAGE ANALYSIS 计算机:人工智能3.602
IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION 计算机:人工智能 3.
GridView和ListView都是android比较重要的控件,但是横滚的控件不是太多。
这里介绍怎么把GridView横向滚动起来,看到其他网友也有相应的解决方法,自己只是把这些知识总结一下,供大家参考!
首先让GridView横向滚动需要HorizontalScrollView这个控件,例如:
[html] view plain copy <span style="font-family:'Microsoft YaHei';font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <HorizontalScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="none" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" > </GridView> </LinearLayout> </HorizontalScrollView> </LinearLayout></span> 以上是主要布局,然后我们写GridView中每个item中的布局,比较简单,只是给大家介绍下: [html] view plain copy <span style="font-family:'Microsoft YaHei';font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:layout_width="100dp" android:layout_height="100dp" android:background="#00ff00" /> <TextView android:id="@+id/item_textview" android:layout_width="100dp" android:layout_height="20dp" android:gravity="center" /> </LinearLayout></span> 上面是item的布局,比较简单,就是一个ImageView和TextView,然后是主要实现GridView的Adapter。 以下是Activity的实现方法。
[java] view plain copy <span style="font-family:'Microsoft YaHei';font-size:14px;"
服务器处理性能估算
系统的建设,必须满足未来5年业务发展和管理的需求,所以下面对服务器性能指标的估算,将以满足未来5年的需要为基准。
1. 数据库服务器
1.1. TPCC值估算
约定:
系统同时在线用户数为100人(U1); 平均每个用户每分钟发出2次业务请求(N1);
系统发出的业务请求中,更新、查询、统计各占1/3;
平均每次更新业务产生3个事务(T1);
平均每次查询业务产生8个事务(T2);
平均每次统计业务产生13个事务(T3);
一天内忙时的处理量为平均值的5倍;
经验系数为1.6;(实际工程经验)
考虑服务器保留30%的冗余;
服务器需要的处理能力为:
TPC-C=U1*N1*(T1+T2+T3)/3*3*经验系数/冗余系数 则数据库服务器的处理性能估算为:
TPC-C= 100*2*(3+8+13)/3*5*1.6/0.7= 18,285 TPM
1.2. 内存估算
该服务器内存主要由操作系统占用内存、数据库系统占用内存、并发连接占用内存等几部分组成。
约定:
操作系统占用约400M内存空间; 数据库系统占用内存0.8G ;
每个并发连接占用5 M;
考虑服务器内存保留15%的冗余;
则服务器的内存估算为:
Mem =(400M + 0.8GB + 100*5M) /(1-15%) = 2 GB
1.3. 存储容量估算
预算管理系统中存储着预算编制数据等资料信息以及日志等管理信息。
在已经考虑了数据冗余的前提下,约定:
? 每月有100个分局或部室编制预算;
? 每月每个分局或部室编制1次预算;
? 预算模板共含6000个预算指标;
? 每个预算指标含5条明细项目;
? 每条记录占用空间300B;
每月的预算数据存储容量需求:6000*5*100*500B=1.5G
每月的日志数据存储容量需求:0.1G
每月进行数据备份一次,数据存储容量需求:12*9G=108G
整年总共需用存储容量:12*1.5G+1.5G+12*0.1G+12*9G=20.7G+108G=128.7G
约定系统中预算编制数据等资料信息以及日志等管理信息在线保存5年(备份数据每年进行清除),则预算管理系统的存储容量估算为:
5*20.7G+108G =103.5G+108G=211.5G
1.4. 服务器安装软件
该服务器中将需要安装的软件如下:
操作系统为:Windows 2000 Server
注:本文由破船译自:thejoeconwayblog
你是否有过这样的感觉:有时某些代码是放到viewDidLoad还是viewWillAppear:中,这很容易让人混淆。在Stack Overflow上经常会遇到这样的问题:viewDidLoad和viewWillAppear到底哪个方法先被调用?实际上,理解这些方法的去向,以及为什么会这样并不重要,重要的是需要知道这些方法的作用,以及它们是如何与程序协调分工的。
我们知道,一般iOS应用程序都是由多个view controller构成的,每个view controller代表一个屏幕的信息。而当程序与用户交互时,根据程序中不同的状态,显示不同的view controller。例如,如果用户需要注册一个账号时,屏幕上应该显示出允许用户输入个人信息的界面,当用户完成注册之后,应该能够看到相应的主页面。
viewWillAppear:方法的作用是与屏幕中改变的内容进行交互。告诉view controller将对应的界面内容显示到屏幕最前端:确保view controller中所有的文本控件显示出最新的信息、必要的数据是可访问的、并对适当的通知(notification)进行观察等。当viewWillAppear:被触发时,说明对应的view controller变为”active”状态。
那么viewDidLoad方法存在的理由又是什么呢?唯一的原因——有时无法或者不能有效的在XIB文件中对用户界面进行100%的配置。例如,有时希望给view设置一个特殊的属性(该属性在XIB中不可用)、有时在给一个button设置背景图片之前,希望能先对该图片进行修改、再比如,在使用auto layout时,有时你可能会意识到在XIB中进行相关操作还不如用代码来写auto layout相关的代码。
我们不能根据viewDidLoad方法的调用情况,来推断出应用程序的状态相关信息。viewDidLoad方法实际上就是简单的一个文件加载后处理机制。换句话说,作为开发者,应该把viewDidLoad方法当做XIB文件的一个有效扩展,而不要理解为应用程序运转流程中的一部分。
这到底是什么意思呢?——我们应该在viewWillAppear:方法中对view中显示的内容进行变更,而不是在viewDidLoad中。view中的内容是程序实际运行时由controller传递给view来显示的数据(模型对象)。
下面我们来看一个示例:一个银行应用程序,可以显示用户当前的余额。当用户点击一个按钮时,可以在一个modal view controller中显示一个列表:该列表列出了用户附近的ATM机。在此,为了获得附近的ATM机列表信息,程序必须使用core location已经web service请求。在上面这种情况下,如果程序员把从服务器请求用户附近ATM列表的操作放到viewDidLoad中。此时,由于view controller只显示一次(viewDidLoad和viewWillAppear都只会被调用一次),所以,从服务器请求用户附近ATM列表的操作,放到viewDidLoad与viewWillAppear中,对程序的效果都是一样的。
但是这样做法是不好的。想一下,如果把这个ATM view controller移到tab bar controller中,会是什么情况。现在,ATM view controller——在viewDidLoad中获取ATM信息的代码只会获取一次。所以,如果你周二在亚特兰大打开该程序查找ATM,然后查询一下余额。接着周三你去了纽约,再次打开该程序时,只能看到亚特兰大的ATM信息——view已经加载过了,所以不会再调用viewDidLoad方法。
注意:在这里应该有这样的前提条件:程序没有退出。
实际上,在这种情况下,写代码时犯下了一个最大的错误:the easiest way is the easiest way。应用程序是会发生变化的,而用户界面也会发生改变。刚开始使用简单的方法,可能会在以后引发各种问题。
本文由破船翻译●转载请注明出处●2013-07-02
项目使用的mysql数据突然宕掉了,使用ps -ef|grep mysql ,没有发现mysql的进程,只有一些使用了mysql的项目的进程。
数据库脚本目录:/usr/bin/mysql
mysqld目录:/etc/init.d/mysqld
1、检查mysql服务状态:
[root@ bin]# /usr/bin/mysql status
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [root@ init.d]# /etc/init.d/mysqld status
mysqld dead but subsys locked
对于“mysqld dead but subsys locked” 网上找的资料都是说安装完数据库后没初始化数据造成无法启动的,这里不适用。没办法只有自己摸索了。
2、检查mysql 的pid文件 和socket文件,发现对应目录下没有 这2文件(目录可以通过查看my.cnf配置找到)
这里数据库pid和socket文件目录为:
pid-file:/var/run/mysqld/mysqld.pid
socket:/var/lib/mysql/mysql.sock 之前遇到过mysql无法启动,删除pid和socket文件 后就能启动了。
启动数据库:/etc/init.d/mysqld start 提示启动失败
查看日志 cat /var/log/mysqld.log,发现如下日志:
130708 12:36:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
130708 12:36:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?
启动模拟器的时候就会报错:
unfortunately,launcher has stopped
这时候要注意你创建项目版本
1. esc 自动完成, 作用和VS中的ctrl+j类似,像 Eclipse 的 alt+/ 2. command + / 注释代码和反注释,用 //,相当于 Eclipse 的 ctrl+/ 3. control + command + 上/下箭头 快速在头文件(.h)和实现文件(.m)之间切换 4. command + b 编译程序,不运行 5. command + r 编译并运行程序 6. command + shift + b 分析代码,找到潜在内存溢出问题 7. command + 单击 跳转到声明 8. option + 单击 弹出层中显示帮助信息 9. option + command + 左/右 方向键,折叠/打开当前方法 10. control + command + f Xcode 全屏,在 Lion 上支持 11. command + shit + y 打开/关闭控制台窗口 12.
1、简单描述一个单片机系统的主要组成模块,并说明各模块之间的数据流流向和控制流 流向。简述单片机应用系统的设计原则。(仕兰微面试题目) 2、画出8031与2716(2K*8ROM)的连线图,要求采用三-八译码器,8031的P2.5,P2.4和 P2.3参加译码,基本地址范围为3000H-3FFFH。该2716有没有重叠地址?根据是什么?若 有,则写出每片2716的重叠地址范围。(仕兰微面试题目) 3、用8051设计一个带一个8*16键盘加驱动八个数码管(共阳)的原理图。(仕兰微面试 题目) 4、PCI总线的含义是什么?PCI总线的主要特点是什么? (仕兰微面试题目) 5、中断的概念?简述中断的过程。(仕兰微面试题目) 6、如单片机中断几个/类型,编中断程序注意什么问题;(未知) 7、要用一个开环脉冲调速系统来控制直流电动机的转速,程序由8051完成。简单原理如 下:由P3.4输出脉冲的占空比来控制转速,占空比越大,转速越快;而占空比由K7-K0八 个开关来设置,直接与P1口相连(开关拨到下方时为"0",拨到上方时为"1",组成一个八 位二进制数N),要求占空比为N/256。 (仕兰微面试题目) 下面程序用计数法来实现这一功能,请将空余部分添完整。 MOV P1,#0FFH ;做输入
LOOP1 :MOV R4,#0FFH ;
-------- MOV R3,#00H LOOP2 :MOV A,P1 -------- SUBB A,R3 JNZ SKP1 -------- SKP1:MOV C,70H MOV P3.4,C ACALL DELAY :此延时子程序略 -------- -------- AJMP LOOP1 8、单片机上电后没有运转,首先要检查什么?(东信笔试题) 9、What is PC Chipset? (扬智电子笔试) 芯片组(Chipset)是主板的核心组成部分,按照在主板上的排列位置的不同,通常分为 北桥芯片和南桥芯片。北桥芯片提供对CPU的类型和主频、内存的类型和最大容量、 ISA/PCI/AGP插槽、ECC纠错等支持。南桥芯片则提供对KBC(键盘控制器)、RTC(实时时 钟控制器)、USB(通用串行总线)、Ultra DMA/33(66)EIDE数据传输方式和ACPI(高级 能源管理)等的支持。其中北桥芯片起着主导性的作用,也称为主桥(Host Bridge)。 除了最通用的南北桥结构外,目前芯片组正向更高级的加速集线架构发展,Intel的 8xx系列芯片组就是这类芯片组的代表,它将一些子系统如IDE接口、音效、MODEM和USB直 接接入主芯片,能够提供比PCI总线宽一倍的带宽,达到了266MB/s。 10、如果简历上还说做过cpu之类,就会问到诸如cpu如何工作,流水线之类的问题。 (未知) 11、计算机的基本组成部分及其各自的作用。(东信笔试题) 12、请画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口、控制接 口、所存器/缓冲器)。 (汉王笔试) 13、cache的主要部分什么的。(威盛VIA 2003.
1. 在C++中的详细说明 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象, 简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 2. 使用vector, 必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int> vInts; 或者连在一起,使用全名: std::vector<int> vInts; 建议使用全局的命名域方式: using namespace std; 3. 初始化 vector <Elem> // 创建一个空的vector。 vector <Elem> c1(c2) // 复制一个vector vector <Elem> c(n) // 创建一个vector,含有n个数据,数据均已缺省构造产生 vector <Elem> c(n, elem) // 创建一个含有n个elem拷贝的vector vector <Elem> c(beg,end) // 创建一个含有n个elem拷贝的vector 4. 析构函数 c.~vector <Elem>() // 销毁所有数据,释放内存 5. 成员函数 c.assign(beg,end)c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 c.back() // 传回最后一个数据,不检查这个数据是否存在。 c.begin() // 传回迭代器中的第一个数据地址。 c.capacity() // 返回容器中数据个数。 c.
http://hi.baidu.com/haifeng60902/item/e0641a3d366b25f9a9842828
从这里看到的!
vpb记录 这不是版本问题,这是vs2010的问题
要解决,最简单的方法是不要用vs,第二简单的方法是在link commandline加上一行/FORCE:MULTIPLE
简单来说就是VS10的STL从import变成static了
osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: "public: void __thiscall std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ) 已经在 SpatialProperties.obj 中定义
正在创建库 D:/OpenSceneGraph/OSG3.0.1/VirtualPlanetBuilder_buildx86b/Debugpbd.lib 和对象 D:/OpenSceneGraph/OSG3.0.1/VirtualPlanetBuilder_buildx86b/Debugpbd.exp
这个,我觉得是版本问题
最近使用了一下cxf,简单的查看了部分源代码,给我的感觉它就是一个可以大大简化我们客户端编写远程方法调用的一个工具框架,只需要简单的几行代码就可以解决这种复杂的问题,下面就举个例子:
package com.yonge.cxf; import java.util.Date; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.apache.cxf.transport.jms.spec.JMSSpecConstants; import com.erayt.solar2.adapter.config.Weather; import com.erayt.solar2.adapter.fixed.HelloWorld; public class CXFClientTest { public static void main(String[] args) { ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress("http://localhost:9000/Hello"); HelloWorld hello = factory.create(HelloWorld.class); Weather weather1 = hello.getWeather(new Date()); System.out.println("forecast:" + weather1.getForecast()); } } 上面一段是客户端调用远程服务器中HelloWorld接口的getWeather方法 的一个具体实现。服务端的代码如下:
package com.erayt.solar2.adapter.driver; import org.apache.cxf.frontend.ServerFactoryBean; import com.erayt.solar2.adapter.config.HelloWorldImpl; import com.erayt.solar2.adapter.fixed.HelloWorld; public class CXFServer { protected CXFServer() throws Exception { HelloWorld helloworldImpl = new HelloWorldImpl(); ServerFactoryBean svrFactory = new ServerFactoryBean(); svrFactory.
计算机软件的专利保护
ZTX
(南京***系,江苏·南京 210094)
摘要:本文梳理了知识产权和计算机软件的概念。介绍了国内外计算机软件保护模式的历史沿革。比较了版权保护、专利权保护和商业秘密权保护三种保护模式的基本内容,分析出三者的利弊。最后,根据分析结果提出可行性建议。
关键词:计算机软件知识产权法律保护模式
Patent Protection of Computer Software
ZTX
(Department of Information Management,Nanjing University of Science and Technology, Nanjing 210094)
Abstract:This paper reviews the concept of intellectual property and computer software.Introduces the history of the computer software protected mode at home and abroad..Then compares the basic content of three kinds of protection mode:copyright, patent and trade secret rights.Otherwise analysis the pros and cons of the three.Finally, put forward feasible suggestions according to the results of the analysis.
<!-- configuration为根元素,包含三个属性: debug,指是否开启logback内部日志,没有设置此属性或设置其值为空、null或false时,表示不开启,否则,开启; scan,设置是否定时扫描配置文件 scanPeriod,设置扫描周期,与scan属性配合使用,默认是60000毫秒,如果该属性值没有带单位,则单位为毫秒,可带的单位有milli/millisecond/second/seconde/minute/hour/day,可忽略大小写 --> <configuration debug="true" scan="true" scanPeriod="600 seconds"> <!-- appender表示日志输出的方式,该元素必须包含name、classs属性; name,表示appender的唯一标识 class一般常见有ch.qos.logback.core.FileAppender、ch.qos.logback.core.rolling.RollingFileAppender、ch.qos.logback.core.ConsoleAppender --> <!-- 下面appender表示输出到控制台 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 设置级别过滤器 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- level级别的日志才会被处理,其他级别不处理 --> <level>DEBUG</level> <!-- 用于配置符合条件的操作 --> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合条件的操作 --> <onMismatch>DENY</onMismatch> </filter> <!-- encoder指定编码格式,并根据指定的pattern输出日志信息 --> <encoder charset="UTF-8"> <!-- pattern指定日志的输出格式 --> <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread][%logger{20}]-%msg%n</pattern> </encoder> </appender> <!-- 下面是将日志输入到指定的文件中 --> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- 指定的日志文件名 --> <file>logFile.log</file> <!-- 是否追加到文件末尾,默认true --> <append>true</append> <encoder> <pattern>%-4r [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!
以前用过log4j,只知道简单的使用,是在多人开发的项目中,看到别人使用了,自己才copy过来使用的,但没有深入了解过。前两天开始接触slf4j,据说是一个可以将原有项目中的日志输出框架转换成另外一种新的日志输出框架的第三方开源工具,可以把多个不同项目中的不同日志输出框架通过它转换成同一种输出框架,看了下源码,官网上给了一幅图,如下:
目前它支持过渡的日志框架有jcl、jul和log4j,最终的日志输出框架支持jcl、jul、log4j、logback。
如果你项目中以前是用的log4j作为日志输出框架,想转换成jul,则需要将classpath中原来引用的log4j的jar文件移除,然后添加log4j-over-slf4j-xxx.jar、slf4j-api-xxx.jar、slf4j-jdk14-xxx.jar(xxx指版本号)等三个jar文件即可,项目中的原来的代码都不需要改动,下面简要说一下这三个包的作用:
log4j-over-slf4j-xxx.jar 此包重新实现了log4j.jar包的一些接口,作为桥接器
slf4j-api-xxx.jar 此包是slf4j的api
slf4j-jdk14-xxx.jar 此包是最终选择的日志输出框架
如果原项目中使用的是log4j输出,则使用slf4j桥接之后的最终日志输出框架不能是log4j,源代码中有限制,代码如下:
static { try { Class.forName("org.slf4j.impl.Log4jLoggerFactory"); String part1 = "Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. "; String part2 = "See also " + LOG4J_DELEGATION_LOOP_URL + " for more details."; Util.report(part1); Util.report(part2); throw new IllegalStateException(part1 + part2); } catch (ClassNotFoundException e) { // this is the good case } } slf4j是通过静态绑定来确定最终是由哪个框架进行日志输出(每个框架都实现了org/slf4j/impl/StaticLoggerBinder.class),如果出现多个,则会将第一个加载的类作为日志输出,代码如下:
private static Set findPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves insertion order during iteration Set staticLoggerBinderPathSet = new LinkedHashSet(); try { ClassLoader loggerFactoryClassLoader = LoggerFactory.
http://gcc.gnu.org/wiki/LinkTimeOptimization
Download the appropriate ASMLib RPMs from OTN. If you are using the UEK the ASMLib kernel module is present already. For RHEL kernel we would need all three of the following:
oracleasm-support-2.1.7-1.el5.i386.rpmoracleasmlib-2.0.4-1.el5.i386.rpmoracleasm-[your-kernel-version].rpm Install the packages using the following command.
rpm -Uvh oracleasm*.rpm Configure ASMLib using the following command.
# oracleasm configure -i Configuring the Oracle ASM library driver. This will configure the on-boot properties of the Oracle ASM library driver.
1、heritrix
Heritrix是一个爬虫框架,可加如入一些可互换的组件。 它的执行是递归进行的,主要有以下几步: 1。在预定的URI中选择一个。 2。获取URI 3。分析,归档结果 4。选择已经发现的感兴趣的URI。加入预定队列。 5。标记已经处理过的URI
是IA的开放源代码,可扩展的,基于整个Web的,归档网络爬虫工程
Heritrix工程始于2003年初,IA的目的是开发一个特殊的爬虫,对网上的
资源进行归档,建立网络数字图书馆,在过去的6年里,IA已经建立了400TB的数据。
最新版本:heritrix-1.15.4
IA期望他们的crawler包含以下几种:
宽带爬虫:能够以更高的带宽去站点爬。
主题爬虫:集中于被选择的问题。
持续爬虫:不仅仅爬更当前的网页还负责爬日后更新的网页。
实验爬虫:对爬虫技术进行实验,以决定该爬什么,以及对不同协议的爬虫 爬行结果进行分析的。
Heritrix的主页是http://crawler.archive.org
Heritrix是一个爬虫框架,可加如入一些可互换的组件。
它的执行是递归进行的,主要有以下几步:
1。在预定的URI中选择一个。
2。获取URI
3。分析,归档结果
4。选择已经发现的感兴趣的URI。加入预定队列。
5。标记已经处理过的URI
2、nutch
尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降. 并且这很有可能进一步演变成为一个公司垄断了几乎所有的web搜索为其谋取商业利益.这显然不利于广大Internet用户.
Nutch为我们提供了这样一个不同的选择. 相对于那些商用的搜索引擎, Nutch作为开放源代码搜索引擎将会更加透明, 从而更值得大家信赖. 现在所有主要的搜索引擎都采用私有的排序算法, 而不会解释为什么一个网页会排在一个特定的位置. 除此之外, 有的搜索引擎依照网站所付的费用, 而不是根据它们本身的价值进行排序. 与它们不同, Nucth没有什么需要隐瞒, 也没有动机去扭曲搜索的结果. Nutch将尽自己最大的努力为用户提供最好的搜索结果.
Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到:
* 每个月取几十亿网页
* 为这些网页维护一个索引
* 对索引文件进行每秒上千次的搜索
* 提供高质量的搜索结果
* 以最小的成本运作
Nutch主要分为两个部分:爬虫crawler和查询searcher。Crawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。
Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将Crawler和Searcher分别放在两个主机上,这样可以提升性能。
爬虫,Crawler:
Crawler的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web database,一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments文件夹和index文件夹。那么三者分别存储的信息是什么呢?
Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边。
一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后Fetcher通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的segments以节省存储空间。
Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
Crawler工作流程:
在分析了Crawler工作中设计的文件之后,接下来我们研究一下Crawler的抓取流程以及这些文件在抓取中扮演的角色。Crawler的工作原理主要是:首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载线程Fetcher开始根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。然后Crawler根据抓取回来的网页WebDB进行更新,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。
首先需要jar包,下载地址:
点击下载
变量声明
private FTPClient ftpClient = new FTPClient(); (1)创建连接
/** * * java编程中用于连接到FTP服务器 * * @param hostname * 主机名 * * @param port * 端口 * * @param username * 用户名 * * @param password * 密码 * * @return 是否连接成功 * * @throws IOException */ public boolean connect(String hostname, int port, String username, String password) throws IOException { ftpClient.connect(hostname, port); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { return true; } } disconnect(); return false; } (2)获取ftp目录下载该目录下的所有文件。 public boolean download(String remote, String local,String fileFiler) throws IOException, ParseException { ftpClient.
#include "stdio.h" #include "string.h" #include "stdlib.h" char optr[256]="#"; double result[256]={0.0}; int top=0,topop=1; double gettopnd() { return result[top]; } char gettopop() { return optr[topop-1]; } void pushnd(double ch) { result[top++]=ch; } void pushop(char ch) { optr[topop++]=ch; } double popnd() { return result[--top]; } char popop() { return optr[--topop]; } char IsOprator(char m )//判断字符是否是操作符,是则返回操作符assci,否为0; { switch(m) { case '+': case '-': case '*': case '/': case '(': case ')': case '#':return m;break; default: return 0; } } int FmtStr(char msg[],int N) { int tmp=0; for (int i=0;i<N;i++)//总共循环表达式的长度那么多次; { if(msg[i]=='-'&&msg[i-1]=='(')//取当前字符并判断该字符是否是负号且它的上一个字符是左括号,确定这个符号为负而不是减; { for(int t=N+1;t!
这篇文章主要说说在进行响应式Web设计的过程中,涉及到页面的一些需要进行优化的地方:
1、 轻量级的Javascript库:
针对PC端网页当然会首选jQuery来作为前端javascript库,但是针对移动端来说,jQuery太重,而现在针对移动端来说,有很多优秀的框架可供使用,jQuery Mobile、YUI、XUI等是不错的框架,但是个人比较倾向于zepto。不过zepto预定义的一些事件,比如触屏滑动的swipe事件,在ios上完美支持,但是在android上,有些浏览器确实不支持的,这时候就需要寻求与一些第三方的javascript插件库,好在现在网上有很多优秀的第三方javascript插件库可供使用,所以各位按需索取吧。
2、 减少HTTP请求次数:
一个页面的初始加载使用HTTP请求来操作,没有任何问题,但是页面中比如翻页、筛选之类的操作,如果再使用完整的HTTP请求来处理的话,会加大网络传输的数据量,因为移动端有一个特殊的限制,就是用户的网络流量是有限的,超过之后会要交钱的。这时候针对这些页面内部的部分操作,可以使用Ajax异步请求来完成,针对短期内不会变化的一些数据,可以使用服务器端缓存、前端缓存等机制来保存这些数据,这样可以减少用户一定的数据请求量。
3、 压缩Javascript和CSS:
把页面中使用的Javascript代码和CSS代码进行压缩之后会有效地减少页面大小。
在线的Javascript代码压缩工具和在线CSS代码压缩工具有很多,而我在开发中会使用下面这两个:
Javascript压缩:http://www.jscompress.com/
CSS压缩:http://www.csscompressor.com/
4、 使用CDN来管理页面资源:
CDN的全称是Content Delivery Network,即内容分发网络。其基本思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
我们可以把一个页面上使用的外链的Javascript文件、CSS文件、固定的ICON图标和图片放在CDN上,这样在访问网页的时候可以使用户可就近取得这些资源,解决网络拥挤的状况,提高用户访问网页的相应速度。
5、 列表图片实现“懒”加载:
移动终端设备因为屏幕大小有限,没有必要将全屏中的图片一次性加载进来,在网页加载的时候,我们可以选择只加载一个可视屏幕中的图片,当用户进行滑动页面的时候,再加载后续剩下的图片。
这个方案其实就是现在大家都说的图片延迟加载技术,只是我们同事在开发的过程中戏称为图片的“懒”加载,其实说到底是按需加载。比如你用淘宝搜索产品,你的移动设备一屏其实只能显示5张图片,那在页面初始加载的时候只加载5张图片,用户滑动页面的时候再加载5张图片,依此类推,这样用户滑到哪里就显示到哪里。
目前网上有一些优秀的延迟加载插件,不过我在具体开发过程中没有使用第三方插件,而是自己开发的一个插件来实现这种图片的“懒”加载,后续我单独介绍我开发的这个插件。
6、 图片显示的优化处理:
首先先说为什么响应式Web设计的时候我们要对图片的显示进行优化处理呢?比如说现在有一张图片,如果你用低分辨率的图片,在低分辨率上显示没有问题,但是在高分辨率机器上图片就会模糊不清,影响用户视觉体验。但是如果你一开始选用一张高分辨率的图片,这样虽然可以兼顾所有机器上的视觉体验,但是针对低端机器来说是很不公平的,因为这样会白白浪费用户的网络数据流量。
那我们应该如何处理呢?解决方法就是根据用户设备的分辨率来加载不同分辨率下的不同图片,这样既能给不同终端的用户一个很好的视觉体验,又不会白白浪费用户的网络数据流量。
① 针对分辨率、屏幕大小来优化图片的显示,这里介绍两种方法:
第一种,将页面<image>标签的src属性中使用适用于低分辨率的图片地址,而将其他中、高分辨率的图片地址使用HTML5的data-自定义属性来隐藏;然后通过Javascript来获取浏览器窗口的大小决定加载哪一张图片,用Javascript把<image>标签的src属性替换成所需要的data-自定义属性中的图片。
第二种:将加载的图片地址使用CSS样式来定义,然后通过Media Queries媒体查询机制来决定加载哪一张图片。
② 针对Retina屏幕做专门的图片优化,同样介绍两种方法:
第一种,将页面<image>标签的src属性中使用普通图片的地址,而将Retina屏幕使用的图片地址使用HTML5的data-自定义属性来隐藏;然后通过Javascript来判断Ratio大小决定是否加载Retina图片,如需加载使用Javascript把<image>标签的src属性替换成所需要的data-自定义属性中的Retina图片。
第二种:将加载的图片地址使用CSS样式来定义,然后通过Media Queries媒体查询机制来决定加载Retina图片,判断Retina屏幕的媒体查询机制代码如下:
@media only screen and (-webkit-device-pixel-ratio: 2) {
// 设置Retina显示图片
}
7、 使用对SEO友好的标签:
为了让我们的网页能够让搜索引擎更好的收录,我们需要在我们的页面中尽可能低使用对SEO友好的标签,比如<h1>、<strong>、…等,关于页面标签的SEO友好化改造,后期我会专门发文介绍。
终于完成了响应式Web设计这一个系列的四篇文章,有朋友说我应该把东西写在一片博文里,没必要分开写,大有追连续剧的感觉,其实这个先说抱歉,但是允许我说一声,我平时的工作很繁琐,又不想因为这些事情来影响自己生活的乐趣,所以我只能一点一点的写。也许还有人说我这四篇博文中水货很多,那没有办法,因为关于响应式Web设计我不是原创者,我充其量算一个总结着,所以一些理论的东西我必须得参考别人的,我不寄希望于别来从我文章里面能学到多少,其实写这些技术文章,主要的是让自己对一些知识点做一个很好的总结,既然总结了,就想分享出来,也许质量很不好,但是我用心了,各位,按需索取吧。同时,我还是比较期待我个人的后续其他方面的总结和分享。
事件:c#打开SQLite 数据提示File opened that is not a database file file is encrypted or is not a databa;
原因:在sqlite3.dll的版本,与sqlite3.lib库文件版本不一致。导致无法打开文件。
解决方法:下载新版本的sqliteadmin.exe,直接在里面创建新的SQLite库。
(1)
/Test:图片所对应的程序集名称(工程名称);
component/img/close.png:component固定前缀; /后面是图片相对路径 如component/img/close.png; 这样我们在编译后的bin目录下可以看到,没有图片文件,因为上面我们是把图片做成资源文件了,图片等资源文件会自动编译到dll或者exe里面了。
<Image Margin="30,9,0,0" Name="image1" Stretch="Fill" Height="29" HorizontalAlignment="Left" VerticalAlignment="Top" Width="62" Grid.Row="1" Source="/testModel;component/img/close.png" />
不知道为什么就报了这个问题,昨天使的还好好的。解决办法很简单将报错的窗体放在一个干净新建的工程里面,如果不报错那就是你原来的工程有dll不兼容。