由于之前没有用过7.0的系统,所有一直不知道居然还有这么一个兼容问题,我这里用的是严苛模式处理兼容,一下是处理代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); } 将上面的代码放在Application里面的onCreate里面执行就可以了,由于是严苛模式,怕有其他的问题影响低版本的,所以就只处理7.0以上的版本就好了
转自:http://ju.outofmemory.cn/entry/201812
用x-www-form-urlencoded方式提交表单就可以正常绑定数据,但是用form-data方式提交就绑定不了:
@Controller @RequestMapping("/tag") public class TagController { @Autowired private NanTianMenFacade nanTianMenFacade; @RequestMapping(value = "/uploadTags") @ResponseBody public TagUploadResult uploadTags(TagParams params) { String tagIds = params.getTagIds(); String uuid = params.getUuid(); TagUploadResult result = null; try { result = nanTianMenFacade.uploadTags(tagIds, uuid); } catch (Exception e) { result = new TagUploadResult(); result.setS(0); } return result; } } 对于我来说,一直都是用x-www-form-urlencoded提交表单数据,除非是要上传文件,才会使用form-data方式。也一直以为Spring对不同的提交方式应该是透明的。不过确实用form-data提交普通表单,确实是拿不到提交的数据。DEBUG发现, request.getParameterMap() 返回的就是空的!
然后发现 org.apache.commons.io.IOUtils.toString(request.getInputStream()); 其实是有返回提交的数据的:
------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name="uuid" 56 ------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name="tagIds" ------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name="
内容,视频和代码在我的个人博客中,链接如下: flask建站实践笔记001-基本结构
非调试状态下有几个API可供使用: (windows.h) 1.GetModuleFileName 2.GetCurrentDirectory
(direct.h) 3._getcwd
这里简要说一下区别,GetModuleFileName是获取绝对路径,GetCurrentDirectory和_getcwd是获取当前进程的当前目录,比较坑爹的是,这个不是“当前进程”的目录,而是启动当前进程的进程的目录,譬如说用vs调试的时候,是由vs启动的进程,所以获取到的目录其实不是Debug目录,而是VS的目录。
vue实现ajax获取后台数据是通过vue-resource,首先通过npm安装vue-resource
npm install vue-resource --save安装完成以后,把vue-resource引入到main.js文件中 src/main.js
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' import router from './router' import VueResource from 'vue-resource' import Layout from './components/layout' Vue.use(VueResource); /* eslint-disable no-new */ new Vue({ el: '#app', router, template: '<Layout/>', components: { Layout } })把vue-resource引入项目以后,就可以在任何组件里面直接用了 <template> <div class="index-wrap"> <div class="
再见OI 最后一次在学校电脑上插上自己的键盘……
已经通过学军的山寨数据得到自己的大概成绩,我退役是板上钉钉的了。整体来说考得很差,day1考挂了后day2就全部求稳了,最后分数也就一般般。 没有意外模拟题写挂了,这可能是我最大的心结。简单的模拟,就因为两个细节而爆炸。千算万算也没有想到弄死自己的竟然是模拟。 想到自己学习的算法在同伴中也算数一数二的,不免有些唏嘘与遗憾。是什么导致了我的失败?不够努力还是不够专心? 不存在了,根据rp守恒原理,可能我平时花在其他上的rp太多了。
day1t1的数论?我打表找规律了。呵呵……我问了一个数竞的,他没做出来。
t2的模拟就不说了,枉我平时那么在意时间复杂度,居然死在模拟上,排名表上,我上下的人没有一个在这道题目上失分。。。我也真是够了。
t3弃弃弃,模拟写完心态炸。图上DP静不下心来写了。
Day1 结束 整个人就废掉了,老爸一个劲地在旁边劝,说,考差了就算了,大不了去学文化课。
day2t1是并查集做的,不出意外,并查集不会背叛我,也不枉我花掉几个小时去证明只有路径压缩的并查集的复杂度带 log .
第二题的状压DP我对不起你了,为了求稳,我选择了暴力。
最后一题平衡树可以得很多分,但是想了想,即使我得到了那么几十分,也逆转不了我退役的事实了。就让我最擅长的平衡树给我的信竞生涯埋下最后的曲调吧。
Day2 结束 知道wys与Doggu考得很好,知道自己没有机会走下去了。 吃完散伙火锅,就各奔学校了。
NOIP退役3天后 文化课补成死狗,意外感觉自己人生也就那样了。不好不坏。 竞赛与高考对我来说都一样了。
只不过那场梦我一定会记得!! 我存在过,一个偏科的OIer!一个热爱平衡树的OIer!一个学习了许多树上黑科技的OIer!一个成功但是输给自己的OIer!一个平凡的OIer……
一切都结束了,结束在2017.11.15.17:11,CDQZ科技三楼,我梦想开始的地方。
善恶终有报,天道好轮回。不信抬头看,苍天绕过谁?
P.S. 想起来我居然是第一届7GOJ的维护人员?还给BZOJ出过题……NOIP退役……
得知成绩 哈哈(无力的微笑),数据水涨了40,仍然逃不了退役(因为都很高啊~),蒟蒻努力后成为了失败的蒟蒻。 省一到手,退役大吉! (这几天立志成才,感觉高考对我更加友善啊)。
预祝CDQZ在NOI的路上取得好成绩,本蒟蒻不能再陪着你们了。
如何让excel单元格同时显示日期和时间 20
conang0112 | 浏览 9707 次 问题未开放回答 |举报
2015-07-23 最佳答案
1、打开excel,单元格右键-->设置单元格格式-->自定义-->yyyy/m/d/aaa。
2、确认后显示。
3、自定义选择yyyy-mm-dd,即为同时显示日期和时间。
本回答由电脑网络分类达人 李孝忠推荐
本文转自9pc9com博客,原文链接: http://blog.51cto.com/215363/2059282 如需转载请自行联系原作者
在64系统里执行32位程序如果出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory,安装下glic即可 [root@localhost bin]# yum install glibc.i686 。。。。。。。。。。。。。。。。 已安装: glibc.i686 0:2.17-196.el7 作为依赖被安装: nss-softokn-freebl.i686 0:3.28.3-8.el7_4 作为依赖被升级: glibc.x86_64 0:2.17-196.el7 glibc-common.x86_64 0:2.17-196.el7 glibc-devel.x86_64 0:2.17-196.el7 glibc-headers.x86_64 0:2.17-196.el7 nspr.x86_64 0:4.13.1-1.0.el7_3 nss-softokn-freebl.x86_64 0:3.28.3-8.el7_4 完毕!
页面显示:
“Failed to create the part's controls" 这时: 在打不开的jsp页面上右键>openwith>myeclispe jsp editor
import java.awt.BorderLayout; import java.awt.EventQueue; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.ProgressMonitorInputStream; import javax.swing.border.EmptyBorder; public class test1 extends JFrame { /** * */ private static final long serialVersionUID = 1L; private static String fileName = "sdk-tools-windows-3859397.zip"; private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { test1 frame = new test1(); frame.
一,ehcache缓存 在这里,我们首先讨论一个问题,什么是缓存,我们为什么要使用缓存?缓存实际上是为了减轻数据库服务器的负载,使用缓存,我们可以将一些常用的数据放入缓存,因为这些数据经常性的使用,大大增加了服务器的负载,但是当放入缓存后,在使用这些数据的时候,首先会从缓存中查找,如果缓存中有就读取,不会再到数据库中查找,如果缓存中没有,才会到数据库中查询,在这里,需要注意的是,ehcache的是将数据放入jvm内存中,也就是说当次缓存在本次服务器启动期间有效,下次服务器启动将会失效。
二,如何使用ehcache技术进行缓存? 使用ehcache进行缓存其实非常简单,在这里简要介绍一下,然后我们通过一个实例来介绍具体怎么使用。
Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。
ehcache的刷新策略 ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较
ehcache缓存的3种清空策略: 1 FIFO,先进先出 2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
事件处理 可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。 可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
ehcache参数配置: maxInMemory - 设定内存中创建对象的最大值。 eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。 timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。 如果该值是 0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。 overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。
好了,经过上面的介绍,下面我们来看一个简单的实例。我们将会查询一条数据后然后删除这条数据再次查询任然能查询到该结果,因为它已经存入到缓存中了,即使数据库中不存在该数据。 首先,要引入pom。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ehcache.xml文件
<ehcache> <!-- 磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存 path:指定在硬盘上存储对象的路径 --> <diskStore path="java.io.tmpdir" /> <!-- defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理 maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象 eternal:代表对象是否永不过期 timeToIdleSeconds:最大的发呆时间 timeToLiveSeconds:最大的存活时间 overflowToDisk:是否允许对象被写入到磁盘 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> <!-- cache:为指定名称的对象进行缓存的特殊配置 name:指定对象的完整名 --> <cache name="
一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数;
一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵,
假设和b分别是一个行向量和一个列向量,那么内积、外积分别记作和,,为了讨论方便,假设每个向量的长度为2。
注意:外积在不同的地方定义方式不太一样,这里不详细讨论
定义了内积和外积以后,我们讨论矩阵的乘法。矩阵是由向量组成的,因此对矩阵不同角度的抽象,将矩阵乘法转换为向量乘法,可以使我们从不同的角度去理解矩阵的乘法。首先我们可以对于一个矩阵A(假设行和列的大小都是2),我们可以即可以把它看作由两个行向量组成的列向量,
,又可以看作是由两个列向量组成的行量,我们表示列向量,表示行向量
这样矩阵A和矩阵B的乘积按照不同的角度就可以组成四种理解方式。
一、 A是由行向量组成的列向量,B是由列向量组成的行向量
此时AB乘积变为了两个新的向量的外积形式,按照外积定义,我们有
注意到这里面每一个都是一个向量,因此就是一个内积,计算结果就是AB矩阵第i行第j列中的元素。因此,我们可以看到,矩阵乘积是两个向量的外积,并且外积矩阵中的每一个元素是一个内积。这种方式是最直接的理解方式。
二、 A是由列向量组成的行向量,B也是由列向量组成的行向量
令C = AB, 我们考虑C的每一个列向量:
同理:
因此,矩阵C的每一个列向量,是A的列向量的一个线性组合,该线性组合中的系数是的各个元素。从这个角度说C的每一列都存在于A的列向量空间内。
三、 A是由行向量组成的列向量,B也是由行向量组成的列向量
类似于上面的情况,不过我们现在考虑C的每一个行向量:
同理: 因此,矩阵C的每一个行向量,是B的行向量的一个线性组合,该线性组合中的系数是的各个元素。从这个角度说C的每一个行向量都存在于B的行向量空间内。 四、 A是由列向量组成的行向量,B也是由行向量组成的列向量 此时AB乘积变为了两个新的向量的内积形式。按照内积定义我们有:
注意到是一个外积形式,因为是一个列向量,是一个行向量,因此C是由各个外积矩阵相加得到的。
根据以上分析,我们可以将第一种和第四种方式放到一起,第二种和第三种放到一起分别进行理解。第一种方式先将A抽象为列向量,将B抽象为行向量,从而将矩阵乘法变为了一种外积的形式,而外积矩阵中的每一个元素是一个行向量和一个列向量的内积。这种方式每次得到C的一个元素。
第四种理解方式先将A抽象为行向量,将B抽象为列向量,从而将矩阵乘法变为了一种内积形式,内积的各个组成部分又是一个外积。这种方式每次不是得到C的一个元素,而是将C看作是多个矩阵相加组成的,每次计算得到一个加数矩阵。
第二种方式将矩阵A、B都抽象为行向量,行向量的每个组成是一个列向量,A乘以B的每一个列向量得到一个新的列向量,并且该列向量存在于A的列向量空间内,A乘以B相当于是对A进行了列变换。第三种方式则将A乘以B看作是对B进行了行变换。
如果想对一个矩阵进行行变换,可以左乘一个矩阵;相应的如果想对矩阵进行列变换,可以右乘一个矩阵。这种思想被应用到高斯消元的过程中。
最后我们总结一下矩阵C(C=AB)到底是什么,C是一个矩阵,是一个多面孔的矩阵。它既是列向量组成的行向量,每个列向量是A的列空间的线性组合,又是行向量组成的列向量,每个行向量是B的行空间的线性组合;它是一个内积,内积的每个成分是一个外积,同时它又是一个外积,外积矩阵的每一个元素是一个内积。
向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组;
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
点乘公式 对于向量a和向量b:
a和b的点积公式为:
要求一维向量a和向量b的行列数相同。
点乘几何意义 点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,有公式:
推导过程如下,首先看一下向量组成:
定义向量:
根据三角形余弦定理有:
根据关系c=a-b(a、b、c均为向量)有:
即:
向量a,b的长度都是可以计算的已知量,从而有a和b间的夹角θ:
根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系,具体对应关系为:
a·b>0 方向基本相同,夹角在0°到90°之间
a·b=0 正交,相互垂直 a·b<0 方向基本相反,夹角在90°到180°之间 叉乘公式
两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。 对于向量a和向量b:
a和b的叉乘公式为:
其中:
根据i、j、k间关系,有:
叉乘几何意义 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示: 在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积。
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1.定义 slew rate 就是电压转换速率(Slew Rate),简称压摆率。其定义是在1微秒时间里电压升高的幅度,就是方波来测量时就是电压由波谷升到波峰所需时间,单位通常有V/s,V/ms和V/μs三种。如果电压转换速率不高,在信号来了时不能准确及时跟上,信号消失后放大器只能跟上了原信号电平的一半或更低,令信号的幅度比信号缩小,分析力也就差了。
2.解释 压摆率可认为,当输入运放一个阶跃信号时,运放输出信号的最大变化速度,如下图:
计算表达式:
压摆率SR的来源:
运放的SR主要限制在内部第二级的Cc电容上。这个电容同时也决定着运放的带宽。那运放的压摆率,主要是由于对第二级的密勒电容充电过程的快慢所决定的。这个电容的大小会影响到运放的压摆率,同时充电电流的大小也会影响到充电的快慢。这也就解释了,为什么一般超低功耗的运放压摆率都不会太高。好比水流流速小,池子又大。只能花更长的时间充满池子。
SR对放大电路的影响了。它的直接影响,就是使输出信号的上升时间或下降时间过慢,从而引起失真。
上图是测试的OPA333增益G=10时波形。由于OPA333的增益带宽积为350kHz,理论上增益为10的时候的带宽为35kHz。但上图是24kHz时测试的结果。显然输出波形已经失真,原因就是压摆率不够了。带宽也变成了27kHz左右。
压摆是产生建立时间原因,也是限制运放速率的重要因素!
参考:
1.运放的转换速率(压摆率)SR的意义和如何选取
2.运放参数的详细解释和分析-part18,压摆率(SR)
3.运放压摆率-2
4.运放的速率、建立时间和压摆率的关系
1 pip install M2Crypto 报错信息:
1 2 3 4 5 6 swig -python -I /usr/local/include/python2 .7 -I /usr/include -includeall -o SWIG /_m2crypto_wrap .c SWIG /_m2crypto .i /usr/include/openssl/opensslconf .h:31: Error: CPP #error ""This openssl-devel package does not work your architecture?"". Use the -cpperraswarn option to continue swig processing. error: command 'swig' failed with exit status 1 ---------------------------------------- Command "/usr/local/bin/python -c " import setuptools, tokenize;__file__= '/tmp/pip-build-_WW9OZ/M2Crypto/setup.py' ; exec (compile(getattr(tokenize, 'open' , open )(__file__).
近日发现有一台服务器在桌面运行的程序不知何故没有了 一开始以为是服务器自动重启了,但是使用w命令看了下,系统并没有重启,反而 从上面的图中可以看到当前系统时间是11:33:23,系统已经运行了79天,系统有7个用户,平均负载 既然没有重启那为什么桌面上什么也没有了呢? 正常情况系我都是在桌面打开终端窗口后在里面执行的程序。 既然想知道为什么会这样,那么就需要知道当时系统做了什么操作。 查看如下 两个日志对我们了解系统当时做了什么操作有帮助。 /var/log/messages 记录系统整体信息,一般来讲各类报错信息都会在这个日志中记录。 /var/log/cron 记录系统定制任务的日志。 首先我要定位系统异常的时间点,很简单,我打开我的程序的目录,找到运行日志打开一看 可以直接看出来到7:20就没有了,这说明程序运行到这个时间点之后就没有在运行,基本上就是这个时间点异常了。 那么系统日志我们就按着这个时间点去看。 首先打开cron日志找到对应的时间点,看了下似乎没什么异常之处。 接下来看messages日志,找到对应的时间点之后发现了异常。 从7:20开始系统发生异常,然后桌面终端的情况被记录到/var/spool/abrt/ccp-2017-11-09-07:20:02-5142.new/coredump 然后被程序调用的网卡被卸载掉,紧接着系统写了一个mail。 上面的日志中有一个error,根据这个报错百度了下(这里我要吐槽百度,怀念google),大概意思是error 4的意思是用户态程序内存访问越界。 error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7。 bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界 bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界 bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址 error number是4, 转成二进制就是100, 即bit2=1, bit1=0, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。 但是具体是什么程序造成的我还没弄清楚,但是用户态程序也就是我运行的程序也就那么几个,逐个排查后应该可以得到结论。后续在慢慢弄。 本文的重点是学习了如何根据系统日志分析问题所在。
F2:快速定位到报错地方。 alt+4:调出控制台console Esc:让鼠标光标在project时切换到java代码里 ctrl+鼠标悬浮方法上/形参上:以javadoc形式展示,显示形参上的类型。 ctrl+B:快速打开光标处的类或方法。反向:查看方法被哪些类引用了。 Ctrl+L:下一个word ctrl+shift+F4:关闭console相当于close tab Ctrl+Shift+Alt+N查找类中的方法或变量 ALT+←/→切换代码视图 CTRL+ALT←/→返回上次编辑的位置 ALT+↑/↓在方法间快速移动定位 shift+Enter:可以会直接跳到方法内部,自动生成{},例如while(true){}在true后直接摁下shift+Enter ctrl+shift+m:移动到方法体外面,{}一对 ctrl+F4:关闭当前窗口 shift+F4:复制当前窗口 ctrl+shift+F4:收缩左侧工程面板,中间代码块区域呈现最大化 shift+Esc:隐藏console面板 Alt+回车导入包,自动修正 ctrl+shift+l格式化代码 ctrl+alt+F7:方法引用所在位置 alt+F1快速定位 Ctrl+F12,可以显示当前文件的结构 Ctrl+Q,显示注释文档 F3,查找下一个 Shift+F3,查找上一个 compile:ctrl+shift+f9 断点: http://blog.csdn.net/u010084868/article/details/52711787 ctrl+g:快速定位行 Ctrl+W,可以选择单词继而语句继而行继而函数 ctrl+shift+t:创建单元测试
虚拟机设备存储空间不足,新加了一块硬盘,分区之后使用mount挂载到一个目录下 mount /dev/sdb1 /guazai 当时显示有效,但是重启之后发现自己新建的目录是存在的,但是硬盘没有挂载到该目录下 使用df -h查看没有sdb1硬盘的挂载信息
解决办法: vi /etc/fstab 在最后面加上/dev/sdb1 /guazai ext3 defaults 0 0 保存之后重启
10月书讯中奖名单: wudalang_gd《精通Git(第2版)》chszs《CCNA学习指南:路由和交换认证(第2版)》sujun10《同构JavaScript应用开发》dongfeng9ge《学习JavaScript数据结构与算法(第2版)》dotnetstudio《精通Git(第2版)》u010850027《精通Git(第2版)》guwei4037《CCNA学习指南:路由和交换认证(第2版)fay462298322《深入理解SVG》 中奖的小伙伴记得私信turingbooks(点击我头像就可以私信),你的邮寄信息哦~ PS:私信前请记得关注turingbooks,方便在私信中对话~~ 留言参与赠书活动: 在图灵书讯中选出你想要的那本书并写上你想要的理由,在文末评论里回复。下期书讯更新时,会在本期的书讯评论中随机选出5~15名小伙伴赠书,获奖者可选择图灵书讯中图书任一本。 本月7本新书,书虽然不多,却都相当重点,也非常特别,相信小伙伴们会喜欢。
特别推荐 《单核工作法图解:事多到事少,拖延变高效》【有电子版】 《时间旅行简史》【有电子版】
《Kafka技术内幕:图文详解Kafka源码设计与实现》《Ruby on Rails 教程(第4版)》【有电子版】《修改软件的艺术:构建易维护代码的9条最佳实践》【有电子版】《精通Metasploit渗透测试(第2版)》《算法小时代:从数学到生活的历变》 特别推荐 ○ 单核工作法图解:事多到事少,拖延变高效 Monotasking: From Procrastination to Productivity by Cutting Down on Tasks to Do 作者:Staffan Nöteberg 译者:大胖 定价:39.00元
销量30万册的《番茄工作法图解》姊妹篇 大忙人、拖延症患者的又一时间管理利器 简单、灵活、高效,让你成为时间的主人 本书的主题是管理时间,战胜拖延。作者通过自身多年的经验,首创了一套简单、灵活而又强大的单核工作法,能行之有效地帮助你加强自制力、集中精力。 全书分为6章,从削减待办任务、现在专注一件事、永不拖延、循序渐进、简化协作和给创意充电等方面详述这一方法,助你在日常生活中轻松完成各项任务。 更多自我管理好书:https://mp.weixin.qq.com/s/3ABr4AQ8Le7nftebzHxIrw 特别推荐 ○ 时间旅行简史 Time Travel 作者:詹姆斯·格雷克 译者:楼伟珊 定价:49.00元 / 电子书24.99元
《信息简史》《混沌》《牛顿传》《费曼传》作者新作! 一段关于时间旅行的时间之旅:起源、演化和影响极富启迪,精彩纷呈:科幻、悖论、永恒、穿越、时间舱、博尔赫斯……陈学雷、苟利军、刘钢、王桥、张双南、DeepTech深科技联合推荐“烧脑”、“宏大的叙事”、“引人入胜”、“当中有哲学,有科学,有艺术,有猜测,有幻想,有人性” 在能够帮助我们更深入地理解作为一种大众文化的时间旅行之余,这段旅程还能够帮助我们更好地理解那个古老而深刻的问题:时间是什么? IT人文书单:http://mp.weixin.qq.com/s/RsK8sfZNWimlHR1Aj5fiJQ 1. Kafka技术内幕:图文详解Kafka源码设计与实现 图灵原创 作者:郑奇煌 定价:119.00元
图文详解Kafka的内部原理、设计与实现 全面分析以Kafka为中心的分布式流平台 Kafka新特性详解,包括连接器、流处理 Kafka自LinkedIn开源以来就以高性能、高吞吐量、分布式的特性著称,本书以0.10版本的源码为基础,深入分析了Kafka的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者和控制器如何确保Kafka集群的分布式和容错特性,两种同步集群工具MirrorMaker和uReplicator,流处理的两种API以及Kafka的一些高级特性等。 2. Ruby on Rails 教程(第4版) Ruby on Rails Tutorial: Learn Web Development with Rails,4E 作者:Michael Hartl 译者:安道 定价:129.
从IT时代进入DT时代,高校在大数据方向上设置了哪些专业,具体学什么,就业怎么样,作为新兴专业,考生如何报考?
专业名称:数据科学与大数据技术;
人才培养目标:以大数据为核心研究对象,利用大数据的方法解决具体行业应用问题;
学制:四年;
学位:工学或理学学位。
目前已有35所高校申报了大数据专业:
第一批(3所):北京大学、对外经济贸易大学、中南大学;
第二批(32所):中国人民大学、复旦大学、北京邮电大学、华东师范大学、电子科技大学、北京信息科技大学、中北大学、长春理工大学、上海工程技术大学、上海纽约大学、浙江财经大学、广西科技大学、昆明理工大学、云南师范大学、云南财经大学、重庆理工大学、晋中学院、福建工程学院、黄河科技学院、湖北经济学院、佛山科学技术学院、广东白云学院、北京师范大学-香港浸会大学联合国际学院、成都东软学院、电子科技大学成都学院、贵州大学、贵州师范大学、安顺学院、贵州商学院、贵州理工学院、宁夏理工学、宿州学院。
数据科学与大数据技术专业都学些什么?
属于交叉学科:以统计学、数学、计算机为三大支撑性学科;生物、医学、环境科学、经济学、社会学、管理学为应用拓展性学科。此外还需学习数据采集、分析、处理软件,学习数学建模软件及计算机编程语言等,知识结构是二专多能复合的跨界人才(有专业知识、有数据思维)。
以中国人民大学为例:
基础课程(38学分):数学分析、高等代数、普通物理数学与信息科学概论、数据结构、数据科学导论、程序设计导论、程序设计实践。
必修课(37学分):离散数学、概率与统计、算法分析与设计、数据计算智能、数据库系统概论、计算机系统基础、并行体系结构与编程、非结构化大数据分析。
选修课:数据科学算法导论、数据科学专题、数据科学实践、互联网实用开发技术、抽样技术、统计学习、回归分析、随机过程。
数据科学与大数据技术专业人才需求情况怎样?
根据领英发布的《2016年中国互联网最热职位人才报告》显示,研发工程师、产品经理、人力资源、市场营销、运营和数据分析是中国护理万网行业需求最旺盛的职位。
目前国内有30万数据人才,预计2018年,大数据人才需求将有大幅增长,高端人才如大数据科学家的缺口在14万至19万之间;懂得利用大数据做决策的分析师和经理缺口达到150万,数据分析师现在需求就很旺盛了,2年工作经验的月薪可达到8K,硕士学历的数据分析师月薪可达到12K,5年工作经验的可达到40万至60万元。
数据科学与大数据技术专业可以从事的工作有哪些?
重视数据的机构已经越来越多,上到国防部,下到互联网创业公司、金融机构需要通过大数据项目来做创新驱动,需要数据分析或处理岗位也很多;常见的食品制造、零售电商、医疗制造、交通检测等也需要数据分析与处理,如优化库存,降低成本,预测需求等。人才主要分成三大类:大数据系统研发类、大数据应用开发类、大数据分析类,热门岗位有:
1、数据挖掘师/算法工程师
做数据挖掘要从海量数据中发现规律, 这就需要一定的数学知识,最基本的比如线性代数、高等代数、凸优化、概率论等。有实际建模经验、机器学习算法的实现,对业务理解、熟悉数据挖掘算法、掌握数据库和精通计算机编程。经常会用到的语言包括Python、Java、C或者R。
2、数据分析师
数据分析师指的是不同行业中,专门从事行业数据搜集、整理、分析,并依据数据做出行业研究、评估和预测的专业人员。在工作中通过运用工具,提取、分析、呈现数据,实现数据的商业意义。 作为一名数据分析师,必须要掌握数据分析基本原理与一些有效的数据分析方法,熟练使用SPSS、STATISTIC、Eviews、SAS等数据分析软件中的一门,懂设计运用图表有效表达数据分析师的分析观点,还需能用Acess等进行数据库开发,并掌握一门编程语言。总之,一个优秀的数据分析师,应该业务、管理、分析、工具、设计都不落下。
3、数据工程师
大数据工程师主要从事数据挖掘工作,运用算法来解决和分析问题,让数据显露出真相,同时,他们还推动数据解决方案的不断更新。分析历史、预测未来、优化选择,这是大数据工程师在“玩数据”时最重要的三大任务。通过这三个工作方向,他们帮助企业做出更好的商业决策。 要求具备一定的统计学、数学理论知识,有实际开发能力和大规模的数据处理能力,对行业有认知。
4、数据产品经理
数据产品经理必须了解不同的公司,在不同的阶段,需要哪些数据产品,并能够制作出来,这是此职位的核心要求。其次,数据产品经理必须有足够的数据分析能力,如果有了数据分析的思维,再跟公司业务结合就会比较容易。最后,数据产品经理是产品经理的一种,所以要同时具备产品经理的能力:了解用户,需求调研,方案设计,协调技术、测试、设计等。
5、大数据可视化工程师
随着大数据在人们工作及日常生活中的应用,大数据可视化也改变着人类的对信息的阅读和理解方式。从百度迁徙到谷歌流感趋势,再到阿里云推出县域经济可视化产品,大数据技术和大数据可视化都是幕后的英雄。
岗位职责:
1)依据产品业务功能,设计符合需求的可视化方案。
2)依据可视化场景不同及性能要求,选择合适的可视化技术。
3)依据方案和技术选型制作可视化样例。
4)配合视觉设计人员完善可视化样例。
5)配合前端开发人员将样例组件化。
6、数据科学家
这一职位过去也被称为数据架构研究,数据科学家是一个全新的工种,能够将企业的数据和技术转化为企业的商业价值。数据科学家是指能采用科学方法、运用数据挖掘工具对复杂多量的数字、符号、文字、网址、音频或视频等信息进行数字化重现与认识,并能寻找新的数据洞察的工程师或专家(不同于统计学家或分析师)。
随着数据学的进展,越来越多的实际工作将会直接针对数据进行,这将使人类认识数据,从而认识自然和行为。因此,数据科学家首先应当具备优秀的沟通技能,能够同时将数据分析结果解释给IT部门和业务部门领导。总的来说,数据科学家是分析师、艺术家的合体,需要具备多种交叉科学和商业技能。
中国人民大学与人大、北大、中科院大学、中财、首经贸五校联合培养数据分析硕士第一届毕业生就业情况:
腾讯、百度等IT公司:22人;金融、银行等:21人;出国、读博等:5人;国家事业单位:6人;其它:2人;共55人。
数据科学与大数据技术专业报考建议
当下企业用人现象:一个专业集群对应一个行业热点。大数据是交叉学科,走的是“复合型”培养路线,行业内从事相关职能的人专业背景各异。大数据作为人才培养方向在探索中,如果直接从各专业人才中遴选学苗开展硕士研究生阶段的教育会更适合一些,直接开设本科阶段的教育还相对不够成熟。
人才培养与行业发展存在差距。由于教学大纲更新不会太及时,大数据人才7年毕业(本科四年、硕士研究生三年)后,所学恐怕落后于行业发展。
大数据人才的典型胜任特征:善于做需求分析、写代码;善于与人沟通,喜欢探索未知;需要根据数据推演、分析、提出解决方案,有数据思维;需要持续保持学习状态;内性格上能动能静。
不同办学层次的院校开设此专业,培养模式会有差异。例如,高职类院校学生由于数学基础相对薄弱,会跟多偏向于工具的使用,如数据清洗、数据存储以及数据可视化等相关工具的使用;本科院校会倾向于大数据相关基础知识全面覆盖性教学,在研究生段则会专攻某一技术领域,比如数据挖掘、数据分析、商业智能、人工智能等。
报考建议
1.注意规避如上缺点,制定、执行相应的解决方案。
2.例如:报考前评估从目标院校毕业后能否在大数据行业中找到理想的职位,各高校一般会根据服务地区经济发展需求开设专业,前几届毕业生一般都有对口的就业机会;
3.根据未来职业规划初步定为初始职位,在大学期间通过选修、培训等方式精修相关学科,夯实基础;
4.对开设院校开设专业的实力进行评估,有些看似平凡的院校和大数据行业企业联合办学,实力不容小觑,例如贵州理工学院与阿里云合建的“贵州理工学院——阿里巴巴大数据学院”,计划在5年内为贵州省培养1万名大数据专业技术人才,黄河科技学是与中科院、云和数据以及中国科普开等知名大数据相关研究机构及公司开展交流合作,在学校建立联合实验室、在企业设立学生实训基地,实现更好地培养人才;
5.考生也可从相关专业(如应用统计学专业)跨考此专业的研究生,可实现快速切入,但还应注意关注行业发展最新状况并着重弥补能力差距。
6.大数据类专业有很多,不同院校开设情况不同,应注意比较择选,例如:
清华大学数据科学研究院开设大数据专业,2014年开始招生;
北大、人大等五校大数据分析硕士培养协同创新平台开设大数据分析专业,2014年开始招生;
复旦大学计算机科学技术学院开设数据交通专业,2015年开始招生;
北航交通科学与工程学院开设计量经济学大数据分析方向,2014年开始招生;
上海财经大学经济学院开设计量经济学大数据分析方向,2014年开始招生;
2018年将会有更多的大学开设大数据类专业。
摘自:http://www.shcpda.com/xingyezixun/854.html
1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。 Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
2、使用Spring框架能带来哪些好处? 下面列举了一些使用Spring框架带来的主要好处:
Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。要测试一项用Spring开发的应用程序十分简单,因为测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。Spring提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单DB的环境下)和复杂的共同事物处理(比如利用JTA的复杂DB环境)。 3、什么是控制反转(IOC)?什么是依赖注入? 控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
在Java中依然注入有以下三种实现方式:
构造器注入Setter方法注入接口注入 4、请解释下Spring框架中的IoC? Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。
BeanFactory 接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与Spring的AOP更容易集成,也提供了处理message resource的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。 IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。
5、BeanFactory和ApplicationContext有什么区别? BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但applicationcontext在此基础上还提供了其他的功能。
提供了支持国际化的文本消息统一的资源文件读取方式已在监听器中注册的bean的事件 以下是三种较常见的 ApplicationContext 实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
[html] view plain copy ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”); 2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。 [html] view plain copy ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”); 3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
文件->首选项->用户设置,配置 Settings.json 文件,例如: //将设置放入此文件中以覆盖默认设置 {
// 在一定数量的等宽字符后显示垂直标尺。输入多个值,显示多个标尺。若数组为空,则不绘制标尺。 "editor.rulers": [], //一个制表符等于的空格数。该设置在`editor.detectIndentation` 启用时根据文件内容进行重写。 "editor.tabSize": 4, }
python以遵循每行不超过79字符的建议将”editor.rulers”改为[80]
上一篇,我们已经学习了如何使用 Three.js 提供的几种常用的几何对象及网格。今天,我们来重点学习一下,如何通过自定义顶点和面来构建自己的几何体,并用它来创建网格。我们先来一个完整的例子,代码如下:
<!DOCTYPE html> <html> <head> <title>示例 02.03 - 自定义形状</title> <script src="../build/three.js"></script> <script src="../build/js/controls/OrbitControls.js"></script> <script src="../build/js/libs/stats.min.js"></script> <script src="../build/js/libs/dat.gui.min.js"></script> <script src="../jquery/jquery-3.2.1.min.js"></script> <style> body { /* 设置 margin 为 0,并且 overflow 为 hidden,来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } </style> </head> <body> <!-- 用于 WebGL 输出的 Div --> <div id="WebGL-output"></div> <!-- 用于统计 FPS 输出的 Div --> <div id="Stats-output"></div> <!
有很多朋友在注册CSDN的时候采用的是邮箱注册,但是一段时间不用给忘记了。有使用手机注册一个账号,当自己想关联邮箱的时候,发现已经注册了,不能让被绑定。想注销又不能注销,感觉很无奈。
其实手机注册的账号是能够被解绑的,小编找了好久,终于找到了,登录CSDN的官网http://www.csdn.net/company/contact.html
可以拨打这个电话,让她帮你解绑,要提供手机号及用户名进行核对,接电话的是一个妹子,声音很好听,态度也不错。
1.临时修改,只作用于当前打开的窗口
进入cmd窗口后,直接执行“chcp 65001”
执行完后,cmd的编码格式就是UTF-8
2.永久修改,修改注册表。
在运行中输入"regedit",找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
然后“右键-新建”,选择“字符串值”,“名称”列填写“autorun”, 数值数据填写“chcp65001”
添加成功后
再次在运行中输入cmd,就会自动把编码格式设置为UTF-8
IObit Malware Fighter 6Pro 破解: 打开软件安装位置,下载替换dll文件
链接: https://pan.baidu.com/s/1Euz87MCANuCnRqZsMQ_w4w 密码: jjai
IObit Smart Defrag 6 pro 破解: 打开软件安装位置,下载替换dll文件
链接:https://pan.baidu.com/s/1B8qtRkNO3jx-xBQ6Kuq73g 密码:cvsr
最近更新:
Advanced SystemCare 12 PRO:
DA824-3A1B0-1FB0A-37954 有效期:2019-5-23
Advanced SystemCare Pro 11.5------------
注册码: BA88B-BA8DA-A6F9C-62D64
过期日期: 2019-04-09
IObit Uninstaller 8.0------------
注册码: 0AE63-73B95-4965D-7C9B8
过期日期: 2019-02-22
Driver Booster 5.5 -----
注册码 : EB16D-7496D-14B9A-DCFB5
过期时间 : 2019-08-08
Smart Defrag 6 pro
License Code: 45C13-2C872-378EA-5C3B9
Expiration Date: 2019-05-25
License Code: 3048C-E2656-9FE4E-90EB9
Expiration Date: 2019-03-30 半年激活码(2019年5月到期):
8B91D-18E7C-3E2F4-6D4B6
解决Latex 引用、索引不跳转的问题 使用Latex编辑文章,发现生成的pdf文档的引用、索引不响应鼠标事件,也就是不跳转。
解决方法 按原先的Latex->BibTex->Latex->Latex编译,完成后不要直接点击dvi->pdf,而是点击 dvi->ps,再点击 ps->dvi。ok。
开宗明义,很关键的一个配置processdata:
它会调用返回值:StringjQuery.param把{ width:1680, height:1050 }参数对象序列化为width=1680&height=1050这样的字符串。 如果你要发送的是个xmlDocument,当然就不希望能这么发送了,必须得设置processData=false,且以POST方式发送才行。
之前在设置ajxa请求时都没有习惯去设置下面这些参数:
async: false, cache: false, contentType: false, processData: false, 而processData就是和传文件有关的参数,不设置每次ajax请求都到不了后台直接前台报错。
最后附上成功请求的代码:
$.ajax({ type: 'POST', url: 'uploadFile', data: formData, dateType:'JSON', async: false, cache: false, contentType: false, processData: false, success: function(result){ console.info("upload success"+result.result); }, error: function(XMLHttpRequest, textStatus, errorThrown) { console.info(XMLHttpRequest.status); console.info(XMLHttpRequest.readyState); console.info(textStatus); }, complete: function(XMLHttpRequest, textStatus) { this; // 调用本次AJAX请求时传递的options参数 } }); 补充必须设置contentType 为false:
这就是因为当我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。而我们在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件。
最近在使用支付宝、财付通这样的第三方支付,在使用支付宝过程中需要引入官方SDK方便开发,使用以下命令来将本地的jar装载到maven仓库中。
这里有几点需要注意点,我使用Windows10时,使用powershell 死活不可以,报错误:
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory 无奈使用cmd 就没问题了
另外需要注意的是-Dfile的参数中不要有空格等特殊字符。
运行以下命令(前提你已经将maven加入环境变量中)
mvn install:install-file -DgroupId=alipay -DartifactId=alipay-trade-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=F:\支付宝SDKJARlongguo\alipay-trade-sdk.jar
mvn install:install-file -DgroupId=alipay -DartifactId=alipay-sdk-java20151021120052 -Dversion=1.0 -Dpackaging=jar -Dfile=F:\支付宝SDKJARlongguo\alipay-sdk-java20151021120052.jar
build success!
然后使用时,在pom中添加
<dependency> <groupId>alipay</groupId> <artifactId>alipay-trade-sdk</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>alipay</groupId> <artifactId>alipay-sdk-java20151021120052</artifactId> <version>1.0</version> </dependency> bingo!
使用patch安装和卸载补丁包的命令格式: 安装:patch -p(n) < [补丁包路径] patch_name 卸载:patch -p(n) -R < [补丁包路径] patch_name
当n=0时,从当前目录查找目的文件(夹)(直接使用补丁文件里面指定的路径) 当n=1时,忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第1个’/’及前面所有内容)
用C#写代码去获取网页内容。
其中request的header中,设置Accept-Encoding为gzip,deflate:
req = (HttpWebRequest)WebRequest.Create(gSkydriveUrl);
req.Headers.Add("Accept-Encoding", "gzip,deflate");
结果始终返回是乱码:
其中,此处之所以加此header,是因为看到网页分析工具中所得到的浏览器浏览该网页,对应的http的header的内容中,就是这样设置的。
所以,代码中,也是模拟浏览器去访问网页,就设置了对应的Accept-Encoding为gzip,deflate了。
【解决过程】
1.刚开始以为是编码的问题,所以去尝试了不同的编码:
req.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
req.Headers["Accept-Charset"] = "utf-8";
结果始终无法解决问题。
2.后来无意间,把Accept-Encoding取消了,没有设置为gzip,deflate:
//req.Headers.Add("Accept-Encoding", "gzip,deflate");
结果,获得的网页,就正常了。
3.后来网上找到了具体的解释,那就是,
普通浏览器访问网页,之所以添加:
"Accept-Encoding" = "gzip,deflate"
那是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以,其request的时候,添加对应的头,表明自己接受压缩后的数据。
而此代码中,如果也添加此头信息,结果就是,返回的压缩后的数据,没有解码,而将压缩后的数据当做普通的html文本来处理,当前显示出来的内容,是乱码了。
【后记 2012-02-14】
后来调试过程中,突然发现,原来对于HttpWebRequest的参数设置中,还有一个选项是AutomaticDecompression,对于新创建的HttpWebRequest:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 其默认值是None,然后去试了试,该设置为Gzip,然后同时Accept-Encoding为对应的gzip:
req.Headers["Accept-Encoding"] = "gzip,deflate"; req.AutomaticDecompression = DecompressionMethods.GZip; 结果证明,这样也是可以获得对应的格式正确的数据,而不是乱码的。
这就意味着,如果你获取网页内容太大的话,那么还是可以用这个办法的,这样就可以让HttpWebRequest自动帮你实现对应的解压缩了,可以减少数据数据传输量,节省时间,提高效率。
需要注意的是,我这里的实测结果,如果是请求的网页返回的内容不多的话,比如只有几K,那么用了此自动解压缩的设置,也没啥效率的提高,因为毕竟自动解压,也是要花时间的。所以,就是个权衡问题了。自己以实测结果为准,觉得是否采用自动解压。
【总结】
想要获得正确网页内容,而非乱码的话,就有两种方式了:
1.不要设置Accept-Encoding的Header
//req.Headers.Add("Accept-Encoding", "gzip,deflate");
2.设置Accept-Encoding的Header,同时设置对应的自动解压缩的模式
req.Headers["Accept-Encoding"] = "gzip,deflate"; req.AutomaticDecompression = DecompressionMethods.GZip;
具体采用哪种方法,自己根据需要选择。
从IT时代进入DT时代,高校在大数据方向上设置了哪些专业,具体学什么,就业怎么样,作为新兴专业,考生如何报考?
具体内容
专业名称:数据科学与大数据技术;
人才培养目标:以大数据为核心研究对象,利用大数据的方法解决具体行业应用问题。
学制:四年;学位:工学或理学学位。
目前已有35所高校申报了大数据专业:
第一批(3所):北京大学、对外经济贸易大学、中南大学;
第二批(32所):中国人民大学、复旦大学、北京邮电大学、华东师范大学、电子科技大学、北京信息科技大学、中北大学、长春理工大学、上海工程技术大学、上海纽约大学、浙江财经大学、广西科技大学、昆明理工大学、云南师范大学、云南财经大学、重庆理工大学、晋中学院、福建工程学院、黄河科技学院、湖北经济学院、佛山科学技术学院、广东白云学院、北京师范大学-香港浸会大学联合国际学院、成都东软学院、电子科技大学成都学院、贵州大学、贵州师范大学、安顺学院、贵州商学院、贵州理工学院、宁夏理工学、宿州学院。
数据科学与大数据技术专业都学些什么?
属于交叉学科:以统计学、数学、计算机为三大支撑性学科;生物、医学、环境科学、经济学、社会学、管理学为应用拓展性学科。此外还需学习数据采集、分析、处理软件,学习数学建模软件及计算机编程语言等,知识结构是二专多能复合的跨界人才(有专业知识、有数据思维)。
以中国人民大学为例:
基础课程(38学分):数学分析、高等代数、普通物理数学与信息科学概论、数据结构、数据科学导论、程序设计导论、程序设计实践。
必修课(37学分):离散数学、概率与统计、算法分析与设计、数据计算智能、数据库系统概论、计算机系统基础、并行体系结构与编程、非结构化大数据分析。
选修课:数据科学算法导论、数据科学专题、数据科学实践、互联网实用开发技术、抽样技术、统计学习、回归分析、随机过程。
数据科学与大数据技术专业人才需求情况怎样?
根据领英发布的《2016年中国互联网最热职位人才报告》显示,研发工程师、产品经理、人力资源、市场营销、运营和数据分析是中国护理万网行业需求最旺盛的职位。
目前国内有30万数据人才,预计2018年,大数据人才需求将有大幅增长,高端人才如大数据科学家的缺口在14万至19万之间;懂得利用大数据做决策的分析师和经理缺口达到150万,数据分析师现在需求就很旺盛了,2年工作经验的月薪可达到8K,硕士学历的数据分析师月薪可达到12K,5年工作经验的可达到40万至60万元。
数据科学与大数据技术专业可以从事的工作有哪些?
重视数据的机构已经越来越多,上到国防部,下到互联网创业公司、金融机构需要通过大数据项目来做创新驱动,需要数据分析或处理岗位也很多;常见的食品制造、零售电商、医疗制造、交通检测等也需要数据分析与处理,如优化库存,降低成本,预测需求等。人才主要分成三大类:大数据系统研发类、大数据应用开发类、大数据分析类,热门岗位有:
1.大数据系统架构师
大数据平台搭建、系统设计、基础设施。
技能:计算机体系结构、网络架构、编程范式、文件系统、分布并行处理等。
2.大数据系统分析师
面向实际行业领域,利用大数据技术进行数据安全生命周期管理、分析和应用。
技能:人工智能、机器学习、数理统计、矩阵计算、优化方法。
3.hadoop开发工程师。
解决大数据存储问题。
4.数据分析师
不同行业中,专门从事行业数据搜集、整理、分析,并依据数据做出行业研究、评估和预测的专业人员。在工作中通过运用工具,提取、分析、呈现数据,实现数据的商业意义。
作为一名数据分析师,至少需要熟练SPSS、STATISTIC、Eviews、SAS、大数据魔镜等数据分析软件中的一门,至少能用Acess等进行数据库开发,至少掌握一门数学软件如matalab、mathmatics进行新模型的构建,至少掌握一门编程语言。总之,一个优秀的数据分析师,应该业务、管理、分析、工具、设计都不落下。
5.数据挖掘工程师
做数据挖掘要从海量数据中发现规律,这就需要一定的数学知识,最基本的比如线性代数、高等代数、凸优化、概率论等。经常会用到的语言包括Python、Java、C或者C++,我自己用Python或者Java比较多。有时用MapReduce写程序,再用Hadoop或者Hyp来处理数据,如果用Python的话会和Spark相结合。
6.大数据可视化工程师
随着大数据在人们工作及日常生活中的应用,大数据可视化也改变着人类的对信息的阅读和理解方式。从百度迁徙到谷歌流感趋势,再到阿里云推出县域经济可视化产品,大数据技术和大数据可视化都是幕后的英雄。
大数据可视化工程师岗位职责:
1、 依据产品业务功能,设计符合需求的可视化方案。2、 依据可视化场景不同及性能要求,选择合适的可视化技术。3、 依据方案和技术选型制作可视化样例。4、 配合视觉设计人员完善可视化样例。5、 配合前端开发人员将样例组件化。
中国人民大学与人大、北大、中科院大学、中财、首经贸五校联合培养数据分析硕士第一届毕业生就业情况:
腾讯、百度等IT公司:22人;金融、银行等:21人;出国、读博等:5人;国家事业单位:6人;其它:2人;
共55人。
数据科学与大数据技术专业报考建议
当下企业用人现象:一个专业集群对应一个行业热点。大数据是交叉学科,走的是“复合型”培养路线,行业内从事相关职能的人专业背景各异。大数据作为人才培养方向在探索中,如果直接从各专业人才中遴选学苗开展硕士研究生阶段的教育会更适合一些,直接开设本科阶段的教育还相对不够成熟。
人才培养与行业发展存在差距。由于教学大纲更新不会太及时,大数据人才7年毕业(本科四年、硕士研究生三年)后,所学恐怕落后于行业发展。
大数据人才的典型胜任特征:善于做需求分析、写代码;善于与人沟通,喜欢探索未知;需要根据数据推演、分析、提出解决方案,有数据思维;需要持续保持学习状态;内性格上能动能静。
不同办学层次的院校开设此专业,培养模式会有差异。例如,高职类院校学生由于数学基础相对薄弱,会跟多偏向于工具的使用,如数据清洗、数据存储以及数据可视化等相关工具的使用;本科院校会倾向于大数据相关基础知识全面覆盖性教学,在研究生段则会专攻某一技术领域,比如数据挖掘、数据分析、商业智能、人工智能等。
报考建议
注意规避如上缺点,制定、执行相应的解决方案。例如:报考前评估从目标院校毕业后能否在大数据行业中找到理想的职位,各高校一般会根据服务地区经济发展需求开设专业,前几届毕业生一般都有对口的就业机会;根据未来职业规划初步定为初始职位,在大学期间通过选修、培训等方式精修相关学科,夯实基础;对开设院校开设专业的实力进行评估,有些看似平凡的院校和大数据行业企业联合办学,实力不容小觑,例如贵州理工学院与阿里云合建的“贵州理工学院——阿里巴巴大数据学院”,计划在5年内为贵州省培养1万名大数据专业技术人才,黄河科技学是与中科院、云和数据以及中国科普开等知名大数据相关研究机构及公司开展交流合作,在学校建立联合实验室、在企业设立学生实训基地,实现更好地培养人才;考生也可从相关专业(如应用统计学专业)跨考此专业的研究生,可实现快速切入,但还应注意关注行业发展最新状况并着重弥补能力差距。
大数据类专业有很多,不同院校开设情况不同,应注意比较择选,例如:
清华大学数据科学研究院开设大数据专业,2014年开始招生;
北大、人大等五校大数据分析硕士培养协同创新平台开设大数据分析专业,2014年开始招生;
复旦大学计算机科学技术学院开设数据交通专业,2015年开始招生;
北航交通科学与工程学院开设计量经济学大数据分析方向,2014年开始招生;
上海财经大学经济学院开设计量经济学大数据分析方向,2014年开始招生;
2018年将会有更多的大学开设大数据类专业。 来源:钱塘大数据
摘自:http://www.shcpda.com/xingyezixun/814.html
参考自:
http://blog.csdn.net/zbc1090549839/article/details/44103801
http://blog.csdn.net/junmuzi/article/details/48917361
归一化方法(Normalization Method) 1。 把数变为(0,1)之间的小数 主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。 2 。把有量纲表达式变为无量纲表达式 归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。 比如,复数阻抗可以归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。 另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。 标准化方法(Normalization Method) 数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。由于信用指标体系的各个指标度量单位是不同的,为了能够将指标参与评价计算,需要对指标进行规范化处理,通过函数变换将其数值映射到某个数值区间。 (1) 最小-最大规范化对原始数据进行线性变换。假定MaxA与MinA分别表示属性A的最大与最小值。最小最大规范化通过计算将属性A的值映射到区间[a, b]上的v。一般来说,将最小-最大规范化在用于信用指标数据上,常用的有以下两种函数形式: a) 效益型指标(越大越好型)的隶属函数: b) 成本型指标(越小越好型)的隶属函数: (2) z-score规范化也称零-均值规范化。属性A的值是基于A的平均值与标准差规范化。(Ref:http://blog.csdn.net/zbc1090549839/article/details/44103801中的2) (3) 小数定标规范化是通过移动属性A的小数点位置来实现的。小数点的移动位数依赖于A的最大绝对值。(ref:http://wenku.baidu.com/link?url=mpUUobm4WGiisLfEGxI10JSzYara-Tb2ZybL__QTj9VOUwcoEaYKdIEP9CJ5JPk5Dm6OTZQ_dn4LrZQ0KaHNWhNelAU4Xt_MMwEbWN3oxb3) ==========================================================================================================
Ok! The following just for ref. The main content is over!
///
在这里主要讨论两种归一化方法:
1、线性函数归一化(Min-Max scaling) 线性函数将原始数据线性化的方法转换到[0 1]的范围,归一化公式如下:
该方法实现对原始数据的等比例缩放,其中Xnorm为归一化后的数据,X为原始数据,Xmax、Xmin分别为原始数据集的最大值和最小值。 2、0均值标准化(Z-score standardization) 0均值归一化方法将原始数据集归一化为均值为0、方差1的数据集,归一化公式如下: 其中,μ、σ分别为原始数据集的均值和方法。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。 以上为两种比较普通但是常用的归一化技术,那这两种归一化的应用场景是怎么样的呢?什么时候第一种方法比较好、什么时候第二种方法比较好呢?下面做一个简要的分析概括: 1、在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。 2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。 /// 关于神经网络归一化方法的整理 由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:(by james) 1、线性函数转换,表达式如下: y=(x-MinValue)/(MaxValue-MinValue) 说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。 2、对数函数转换,表达式如下: y=log10(x) 说明:以10为底的对数函数转换。 3、反余切函数转换,表达式如下: y=atan(x)*2/PI 归一化是为了加快训练网络的收敛性,可以不进行归一化处理 归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1–+1之间是统计的坐标分布。归一化有同一、 统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一 化是同一在0-1之间的统计概率分布; 当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。 归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.
转载请注明出处:http://blog.csdn.net/microlyc
由 http://blog.csdn.net/ibelievefly/article/details/47955473 旅行商问题改写;
function ant() Q=400;%Q表示信息素增强的系数 %nc_now表示当前的迭代次数 nc_max=9999; %nc_max表示自主设置的最大迭代时间 表示终止条件 %first_address表示测试数据中的城市坐标 %RouteOfBest表示各代的最佳路线 %LengthOfBest表示每次迭代的最佳路线的长度 a = 3;%a=0.7表示启发因子,表示信息素的相对重要程度!!!!!!!!!!!很重要 p = 0.1;%p表示信息素的蒸发系数,(1-p)表示信息素持久性系数 %%第一步:变量初始化 SumOfant=30;%SumOfant表示蚂蚁数量 first_address = [%第一个为家,最后一个是食物源 0 3 0 2 -10 0 1 0 6 0 0 -2 0 -3 ];%first_address表示测试数据中的城市坐标 target = [1,length(first_address)]; SumOfCity = size(first_address,1); length_address =inf.*ones(SumOfCity,SumOfCity);%length_address表示两两城市间的距离 length_address(1,2)= Calculation_length(first_address,1,2); length_address(2,3)= Calculation_length(first_address,2,3); length_address(3,6)= Calculation_length(first_address,3,6); length_address(6,7)= Calculation_length(first_address,6,7); length_address(4,6)= Calculation_length(first_address,4,6); length_address(2,4)= Calculation_length(first_address,2,4); length_address(5,6)= Calculation_length(first_address,5,6); length_address(2,5)= Calculation_length(first_address,2,5); for n=1:size(first_address) for m=1:size(first_address) if length_address(n,m)~=inf length_address(m,n)=length_address(n,m); %对称矩阵 end end end info_pre=ones(SumOfCity,SumOfCity); %info_pre为信息素矩阵,可以理解为在蚂蚁还没有被放入城市前,每条道路上就已经存在了一定含量的信息素(只是为了方便计算) EachOfRoute=zeros(SumOfant,SumOfCity); %存储并记录每次迭代时每只蚂蚁经历的路径生成; nc_now=1; %迭代计数器,记录迭代次数 target_i=target(2).
1、在springmvc配置加上两个bean:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 2、在controller注入RequestMappingHandlerAdapter:
@Autowired RequestMappingHandlerMapping requestMappingHandlerMapping; 3、controller添加mapping:
@RequestMapping("/index.action") @ResponseBody public Object index(HttpServletRequest request) { List<HashMap<String, String>> urlList = new ArrayList<HashMap<String, String>>(); Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods(); for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) { HashMap<String, String> hashMap = new HashMap<String, String>(); RequestMappingInfo info = m.getKey(); HandlerMethod method = m.getValue(); PatternsRequestCondition p = info.getPatternsCondition(); for (String url : p.getPatterns()) { hashMap.put("url", url); } hashMap.put("className", method.getMethod().getDeclaringClass().getName()); // 类名 hashMap.put("method", method.
转载 http://blog.csdn.net/haiwil/article/details/6691854/
本文主要详细讨论了返回返回局部变量的几种情况,值得大家注意。
准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
下面以函数返回局部变量的指针举几个典型的例子来说明:
1:
[cpp] view plain copy #include <stdio.h> char *returnStr() { char *p="hello world!"; return p; } int main() { char *str; str=returnStr(); printf("%s\n", str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。
2:
[html] view plain copy #include <stdio.h> char *returnStr() { char p[]="hello world!"; return p; } int main() { char *str; str=returnStr(); printf("%s\n", str); return 0; } "hello world!"是局部变量存放在栈中。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。 3:
[html] view plain copy int func() { int a; .
1 虚拟机用nat方式连接,开始dns死活设置不了
2 系统设置中删除以太网再重新添加,dns终于自动出来了
3选择手动,设置后ip后,以太网都已连接,竟然见鬼还是上不了网
4后来重启,选择 使用DHCP(手动设置地址),再设置ip地址子网掩码网关
5然后终于可以上网了
在上一个示例中,我们仅在场景里添加了一个坐标轴,本篇我们将在上一个示例中,继续添加几个图形进去。我们仍然以上一个示例为范本,找到其中的第40行代码如下:
scene.add(new THREE.AxisHelper(20));// 加入坐标轴
然后我们继续在其后追加以下代码行:
// 加入一个几何平面 var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1); var planeMaterial = new THREE.MeshBasicMaterial( {color: 0xCCCCCC, side: THREE.DoubleSide, wireframe: false} ); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = -0.5 * Math.PI; // 沿着 X轴旋转-90° plane.position.x = 15; // 几何平面位置沿着 x轴右移 15个单位 plane.position.y = 0; // 几何平面位置 y轴为 0 plane.position.z = 0; // 几何平面位置 z轴为 0 scene.add(plane); // 加入一个立方体 var cubeGeometry = new THREE.
类似easyui 的formatter
网上没找到方法,最后看的官方文档自己试着可以用了,时间 超链接 同理
分页返回blog list blogType对象无法直接在表格中显示 需要使用 ,templet:
js
<script th:inline="javascript" type="text/javascript" id="blogType"> {{# if( d.blogType != null){ }} {{ d.blogType.typeName }} {{# } }} </script>表格 <thead> <tr> <th lay-data="{checkbox:true, fixed: true}"></th> <th lay-data="{field:'id', width:'50', sort: true, fixed: true}">编号</th> <th lay-data="{field:'title', width:'250'}">标题</th> <th lay-data="{field:'releaseDate', width:'200', sort: true}">发布日期</th>类型 <th id="blogType" lay-data="{field:'blogType', width:'200',templet: '#blogType'}">博客类型</th> <th lay-data="{fixed: 'right', width:'250', align:'center', toolbar: '#barDemo'}"></th> </tr> </thead> 这样就可以显示了 补:如果显示正常但是浏览器报错在{ {}} 可以选择修改layui的默认模板标签({{ }}) 可能是和thymeleaf冲突,而且不同浏览器对这个处理不同。
需求背景: 集群中,每一台服务器都有自己的Nginx, 转发请求到本机的应用. 应用与Nginx都通过Docker部署.随之而来的一个问题是,应用是无状态的,可以通过一个镜像在所有的机器上运行,而Nginx需要转发到本机的应用,在每台服务器的Nginx配置文件中不可避免地需要写上本机的内网IP,也就是镜像似乎不能通用. 在此,我想到的一种方法是,启动Nginx Docker容器时, 通过 –env 参数,传入一个自定义的环境变量到容器中,比如变量叫 HOST_IP, 通过 $ ifconfig eth0|grep inet|awk '{print $2}'获取本机内网IP赋值给HOST_IP,那么容器中的nginx.conf又如何才能读取到这个环境变量呢? 于是我查看了一些方法,其中有一种方法可供参考 - https://segmentfault.com/q/1010000006124117
查看Nginx的官方镜像,可以找到下面这段话
Using environment variables in nginx configuration Out-of-the-box, nginx doesn’t support environment variables inside most configuration blocks. But envsubst may be used as a workaround if you need to generate your nginx configuration dynamically before nginx starts.
Here is an example using docker-compose.yml:
web: image: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - “8080:80” environment: - NGINX_HOST=foobar.
进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。 其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。 其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。 使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。 2. 什么是TCP/IP、UDP TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。如图: TCP/IP协议族包括运输层、网络层、链路层, 而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。 3. Socket是什么 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭). 说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 注意:其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。 4. 基本的SOCKET接口函数 在生活中,A要电话给B,A拨号,B听到电话铃声后提起电话,这时A和B就建立起了连接,A和B就可以讲话了。等交流结束,挂断电话结束此次交谈。 打电话很简单解释了这工作原理:“open—write/read—close”模式。 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。 4.1、socket()函数 intsocket(int domain,int type,int protocol);//返回sockfd socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 正如可以给fopen的传入不同参数值,以打开不同的文件。创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为: domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。 type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。 protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。 注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。 当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。 4.2、bind()函数 正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。 intbind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 函数的三个参数分别为: sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。 addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是: struct in_addr { unsigned long s_addr; }; struct sockaddr结构用来保存套接字地址信息,其定义如下: struct sockaddr { unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14字节的协议地址*/ }; struct sockaddr结构中sa_family成员说明的是地址族类型,一般为“AF_INET”;而sa_data则包含远程主机的IP地址和端口等信息。 struct sockaddr结构类型使用在socket的相关系统调用函数中,但这个结构sa_data字段可以包含较多信息,不利于方便编程和对其进行赋值,因此建立了struct sockaddr_in结构,该结构与struct sockaddr结构大小相等,能更好处理struct sockaddr结构中的数据。对struct sockaddr_in结构变量进行赋值完成后,在进行socket相关系统调用时,再将struct sockaddr_in结构变量强制转换为struct sockaddr结构类型。 struct sockaddr_in结构定义如下: struct sockaddr_in { /*“in” 代表“Internet”*/ short int sin_family; /* Internet地址族*/ unsigned short int sin_port; /* 端口号*/ struct in_addr sin_addr; /* Internet地址*/ unsigned char sin_zero[8]; /* 填充0(为了保持和struct sockaddr一样大小)*/ }; 在实际应用编程中,对套接字地址结构使用方法和流程如下: ① 首先,定义一个sockaddr_in结构变量,并将它初始化为0,代码如下: struct sockaddr_in myad; memset(&myad,0,sizeof(struct sockaddr_in)); ② 然后,给这个结构变量赋值,代码如下: myad.
由于JavaScript不支持多线程,所以无法去像Java一样用代码控制和创建一个后台进程。因此,在项目的优化时候就遇到了很难解决的问题。
AJAX与webWorker结合 在项目中,我需要在用户进到某个账号时需要同时展示聊天列表和好友列表! 问题分析: 如果好友数量比较少的话,那么问题很简单!直接ajax加载就好了! 但是!这个人际关系复杂的社会怎么可能没有好友上万的人呢!所以,直接加载显然是不行的! 先说说某web聊天网页的做法!分页加载,在用户滚动滑轮或滚动条时候加载之后的一段好友列表。这也是最常用的方法。 而面对这个问题,如果先加载聊天列表,再点击好友列表再加载好友列表的话就会出现两次加载的现象! 因此,需要在加载聊天列表同时加载一段好友列表,这样就不会出现两次加载的现象! 这样就会有另一个问题!两个请求需要最快的请求回来! 首先,看一下两种方法的请求速度! 这是两个ajax先后同时请求! 这是webworker实现两个请求! 好吧!看下代码!
index.js worker = new Worker("/static/js/worker.js"); //最好先判断浏览器是否支持worker,我的项目用的是谷歌,所以就不判断了! //最好不要反复创建worker 因为worker是开辟了一个新空间 worker.postMessage({ type:"all", id:id }); //发送消息到worker.js中 worker.addEventListener("message",function(e){ console.log("接收消息",e.data.content); }) //监听worker发回来的消息! worker.js onmessage = function (event){//监听消息 console.log("worker.event.data:",event.data); var postStr ="par_ser="+event.data.id; var url =""; if(event.data.type == "all"){ url = "/api/getwxinfo/getCustomer"; }else if(event.data.type == "char"){ url = "/api/getwxinfo/getchating"; postStr = postStr+"&num="+event.data.num; } var xmlhttp=new XMLHttpRequest(); var content = ""; xmlhttp.open('POST',url,true); xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlhttp.
先来前端代码
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>大文件分割上传</title> <script src="~/js/jquery.min.js"></script> <script> var page = { init: function () { $("#subUpload").click($.proxy(this.upload, this)); }, upload: function () { var file = $("#fileUpload")[0].files[0], //文件对象 name = file.name, //文件名 size = file.size, //总大小 succeed = 0; var shardSize = 290 * 1024, //以290kb为一个分片,换算1MB=1 * 1024 * 1024 shardCount = Math.ceil(size / shardSize); //总片数 for (var i = 0; i < shardCount; ++i) { //计算每一片的起始与结束位置 var start = i * shardSize, end = Math.
作者新建了QQ群:460430320,供大家交流测试心得(培训机构勿进)。另外,还会不定期上传测试资料,也欢迎您共享测试资料。
今天帮朋友写自动化脚本,又需要用格式化日期,又忘记怎么写了,还是写到自己博客里面,方便日后需要的时候看一眼吧。So,临时加一篇 Python 的文章。
1、Python的time模块
import time print(time.time()) #输出的是时间戳 print(time.localtime(time.time())) #作用是格式化时间戳为本地的时间 # 最后用time.strftime()方法,把刚才的一大串信息格式化成我们想要的东西 print(time.strftime('%Y-%m-%d',time.localtime(time.time()))) 运行结果:
C:\Python36\python.exe E:/python/test1/day1/test10.py
1508229738.234413
time.struct_time(tm_year=2017, tm_mon=10, tm_mday=17, tm_hour=16, tm_min=42, tm_sec=18, tm_wday=1, tm_yday=290, tm_isdst=0)
2017-10-17
2、time.strftime()方法参数
time.strftime里面有很多参数,可以让你能够更随意的输出自己想要的东西:
下面是time.strftime的参数:
strftime(format[, tuple]) -> string
将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12) %M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变
左移:
当左移的位数不超过该数值类型的最大位数时:逻辑左移(补0,丢弃最高位)
当左移的位数超过该数值类型的最大位数时:编译器会用左移的位数去模类型的最大位数,然后按余数进行移位(只是执行:左移 所得的余数 个位数)
int i = 1, j = 0x80000000; //设int为32位 i = i << 33; // 33 % 32 = 1 只左移1位,i变成2 j = j << 33; // 33 % 32 = 1 只左移1位,j变成0,最高位1被丢弃 右移:>>
算术右移:保持符号位不变,正数的话补0,负数补1,(补符号位)
int i = 0x80000000; i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000 当移动的位数超过类型的长度时,会取余数,然后移动余数个位. >>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>
参考:http://blog.csdn.net/tdcs111/article/details/61929445.
2种解决方式
方式1 ----修改gradle 版本为 2.14.1 修改plugin Version版本为2.2.3
方式2 -----升级到 classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4',Gradle用3.3的就能解决这个问题
java让2个线程交替执行,每个线程执行1秒:
package tf56.SpringBoot.Annotation; /** * Created by Administrator on 2017/10/17. */ public class Test2 { private static int state = 1; public static void main(String[] args) { final Test2 t=new Test2(); new Thread(new Runnable() { @Override public void run() { while (true) { synchronized (t) { if (state != 1) { try { t.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { System.out.println("轮到线程一开始执行"); Thread.sleep(1000); } catch (InterruptedException e) { e.
通过Xshell连接linux——安装Redis
一、 创建目录 mkdir redis
二、 下载安装包 wget -chttps://github.com/antirez/redis/archive/4.0.2.tar.gz -O redis-4.0.2.tar.gz
三、 解压安装包 tar xzf redis-4.0.2.tar.gz
四、 编译 make 编译全部
五、 安装 make install 安装
六、 启动 src/redis-server
七、 测试 开启一个命令行窗口 进入Redis目录进行测试:
src/redis-cli
set name value
get name
shutdown 关闭Redis Server
八、 配置(redis.conf) 1. 修改服务绑定ip地址
找到bind127.0.0.1 修改为#127.0.0.1,注释该绑定,使用redis服务器绑定本机所有ip
2. 添加访问密码
为了安全。对redis添加密码要求,在protected-mode yes下面插入
#设置密码
requirepass 123456
3.修改为后台服务方式运行
找到daemonize no 将其修改为daemonize ye,表示以后台服务运行。
前言:随着深度学习近几年来的突破性进展,无人驾驶汽车也在这些年开始不断向商用化推进。很显然,无人驾驶汽车已经不是遥不可及的“未来技术”了,未来10年必将成为一个巨大的市场。本系列博客将围绕当前使用的最先进的无人驾驶汽车相关技术,一步一步地带领大家学习并且掌握无人驾驶系统的每一个模块的理论基础和实现细节。由于无人驾驶汽车系统构成及其复杂,本系列博客仅讨论软件部分的内容,关于汽车,传感器和底层的硬件,不是我们关注的重点。至于连载的顺序和技术路线,本人其实是同时开始的,先完成哪一节就先发那一节。
我一直反感国内的一些中文水书,这些书的产生的根源就是国内浮躁的技术氛围,我希望能够系统详细的以中文总结无人驾驶汽车的整个技术基础,本系列博客将详细展开无人汽车的基础理论和和这些理论的实现的小例子,编写不易,转载请附来源:http://blog.csdn.net/AdamShan/article/details/78248421
首先我将带大家了解无人驾驶汽车系统感知模块的重要技术——卡尔曼滤波,卡尔曼滤波部分我打算分三节(三次博客的内容):
卡尔曼滤波与行人状态估计扩展卡尔曼滤波(EKF)与传感器融合过程模型,无损卡尔曼滤波(UKF)与车辆状态轨迹 本节为卡尔曼滤波,主要讲解卡尔曼滤波的具体推导,卡尔曼滤波在行人状态估计中的一个小例子。
为什么要学卡尔曼滤波? 卡尔曼滤波以及其扩展算法能够应用于目标状态估计,如果这个目标是行人,那么就是行人状态估计(或者说行人追踪),如果这个目标是自身,那么就是车辆自身的追踪(结合一些地图的先验,GPS等数据的话就是自身的定位)。在很多的无人驾驶汽车项目中,都能找到卡尔曼滤波的扩展算法的身影(比如说EKF,UKF等等)。本节我们从最简单的卡尔曼滤波出发,完整的理解一遍卡尔曼滤波的推导过程,并实现一个简单的状态估计Python程序。
卡尔曼滤波是什么? 我们通常要对一些事物的状态去做估计,为什么要做估计呢?因为我们通常无法精确的知道物体当前的状态。为了估计一个事物的状态,我们往往会去测量它,但是我们不能完全相信我们的测量,因为我们的测量是不精准的,它往往会存在一定的噪声,这个时候我们就要去估计我们的状态。卡尔曼滤波就是一种结合预测(先验分布)和测量更新(似然)的状态估计算法。
一些概率论的知识基础 下面是一些概率论的基础知识,如果之前有这方面的知识储备那当然是最好的,很有利于我们理解整个博客内容,如果没有这方面的基础而且也看不懂下面的内容也没关系,我会以一个相对直观的方式来展现整个理论部分。
先验概率 P ( X ) P(X) P(X):仅仅依赖主观上的经验,事先根据已有的只是的推断 后验概率 P ( X ∣ Z ) P(X|Z) P(X∣Z):是在相关证据或者背景给定并纳入考虑以后的条件概率似然 P ( Z ∣ X ) P(Z|X) P(Z∣X):已知结果区推测固有性质的可能性 贝叶斯公式:
P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) P(A|B) = \frac{P(A) \times P(B|A)}{P(B)} P(A∣B)=P(B)P(A)×P(B∣A)
后验分布正比于先验分布乘以似然。
卡尔曼滤波完整推导 一个简单的例子 若干年后,我们的可回收火箭要降落到地球,我们比较关心的状态就是我们的飞行器的高度了,飞行器的高度就是我们想要估计的状态,我们会通过一些传感器去测量我们当前的高度信息,比如说使用气压计。假如我们每一次测量,当前高度都变成上一次测量的 95 % 95\% 95%,那么我们就可以得到如下关系:
写在前面:云计算在服务器端提供集中的物理计算资源,然后将这些物理资源进行虚拟化,为用户提供一个隔离、安全、可信的虚拟工作环境。因此在学习云计算和openstack之前应先了解下虚拟化技术。
1.what is 虚拟化 本质上,虚拟化就是由位于下层的软件模块,根据上一层软件模块的期待,抽象出一个虚拟的软件或硬件接口,使上一层软件可以直接运行在与自己所期待的运行环境完全一致的虚拟环境上。
在云计算中的虚拟化一般是指硬件抽象层上的虚拟化,是指将一台物理计算机系统虚拟化为一台或多台虚拟计算机系统。一台物理的服务器上可以跑多台虚拟机,每个虚拟计算系统都拥有自己的虚拟硬件,如CPU、内存和设备等,并提供一个独立的虚拟机执行环境。虚拟机的实现是通过虚拟机监控器(Virtual Machine Monitor,VMM,也可称为Hypervisor)实现的。
虚拟化环境具体结构如下图所示:
2.虚拟化的实现方式 根据虚拟化的实现方式可分为两种:
(1)1型虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。如下图所示:
(2)2型虚拟化
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。如下图所示:
比较:
1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
根据VMM所提供的虚拟平台类型又可将VMM分为两种:
(1)完全虚拟化
VMM虚拟的是现实存在的平台,并且在客户机操作系统看来,虚拟平台和现实平台是一样的,客户机操作系统感觉不到运行在一个虚拟平台上,现有的操作系统无需进行任何修改就可以运行在这样的虚拟平台上。
(2)类虚拟化
第二类VMM虚拟出的平台是现实中不存在的,而是经过VMM重新定义的。虚拟平台需要对所运行的客户机操作系统进行或多或少的修改使之适应虚拟环境,客户机操作系统也就知道自己运行在虚拟平台上,并且会去主动适应。
3.虚拟化相关 虚拟化中核心技术:CPU虚拟化,内存虚拟化,I/O虚拟化,网络虚拟化
虚拟化引入的新特性:动态迁移、虚拟机快照、虚拟机克隆、P2V(Physical to Virtual Machine)
典型的虚拟化产品:VMware(包括VMware ESX Server、VMware Workstation、Vmware Fusion),Microsoft(Virtual PC和Virtual Server),Xen,KVM
高层管理工具:XenAPI,Libvirt
在执行http://localhost:15672/ 提示该页无法访问,因为这是rabbitmq安装后的一个web管理平台入口。当安装后就能访问了。需要在cmd窗口执行一个命令:
rabbitmq-plugins enable rabbitmq_management
此命令执行要先定位到rabbitmq的安装目录下的sbin文件夹下。
执行后仍然不能访问,通过cmd中的提示,说是需要执行rabbitmqctl start_app
但是执行后提示:
starting node rabbit@jrms2UT6R8IVNHb
Error: unable to connect to node rabbit@jrms2UT6R8IVNHb: nodedown
网上搜索说出现这种情况是因为更改了计算机的名,再改回去就可以解决此问题。
这确实在安装完rabbitmq后更改过计算机名。但是要改回去却也不可能。因为这个计算机名有用。
在cmd窗口也看到了相关rabbitmq配置文件位置的相关信息。通过定位。找到了配置文件目录:
C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
在这个文件夹下发现3个文件夹。
第一个:rabbit@IRQ9I0LGSTKH5CP-mnesia
第二个:rabbit@IRQ9I0LGSTKH5CP-plugins-expand
第三个:rabbit@jrms2UT6R8IVNHb-mnesia
IRQ9I0LGSTKH5CP这是我第一次安装rabbitmq的时候计算机名。jrms2UT6R8IVNHb是我更改的计算机名。而且我发现前两个文件夹下有文件,而第三个文件夹下什么也没有。怀疑改了名后没有自动生成相应的文件夹及下面的文件。当时我首先想的是是不是创建相应的文件夹,并把第一,第二文件夹下的文件复制过去就可以解决此问题。最终没尝试,而是选择重装rabbitmq。因为是由于更改计算机名造成的,那就重装一次。重装后,在这个C:\Users\Administrator\AppData\Roaming\RabbitMQ\db发觉又多了个文件夹rabbit@jrms2UT6R8IVNHb-plugins-expand 并且包含现在我计算机名的文件夹下都有了文件。这时再访问http://localhost:15672/ 已经可以正常访问了。