前言: 我一朋友做Java开发四年多的时间了,在老东家勤勤恳恳工作了四年多,工资也就是从刚开始的10K涨到了15K,天天给我吐槽他的工资低。2019年开始就一直在各种地方找资源,刷面试题,想要“骑驴找马”,所幸那时候的疫情还不是很严重,而他恰恰又是在年前找到一份心仪的工作,拿到了京东18A工作机会,薪资也是从15K到现在收入到手翻了几倍。当然这些都是包含了期权奖金的。
我给他比出了大大的羡慕,他给我说,你别看我现在薪资这么高,那几十套面试题我至少刷了七遍以上。
今天我就把这几十套的面试题免费分享给大家,希望疫情过去对大家的升职涨薪有所帮助。
2020最新BATJava必考面试题集锦 2020最新BAT大数据必考面试题集锦 Java后端面试题及答案 JVM面试题及其答案 Java面经 Spring面试题 SpringMVC面试题 SpringBoot面试题 SPringCloud面试题 Tomcat面试题 并发编程面试题 多线程面试题 MySQL55问 乐观锁和悲观锁面试题 Redis面试题 Kafka面试题 Zookeeper面试题 Linux面试题 MyBatis Nginx面试题 memcached面试题 MongoDB 面试题目录汇总 这几十套面试题小编已经为大家整理好了,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考,友情提示:帮忙点赞文章,看小编个人主页或者si xin即可。
在维护系统时经常需要实时查看系统的运行情况,比如实时的系统连接数之类的。在linux可以通过watch命令,实时监控每一条命令执行的结果动态变化。
watch命令可以实时全屏监控当前命令执行的动态变化结果。watch命令的常用参数有“-n”、“-d”、“-t”分别表示“时隔多少秒刷新”、“高亮显示动态变化”、“关闭命令顶部的时间间隔,命令显示”
格式:
# watch 【参数】 【命令】
功能:
可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令
参数:
-n或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
-h, --help 查看帮助文档
事例1:
每隔两秒显示网络链接数的变化情况:
# watch -n 2 netstat -ant
事例2:
每隔一秒高亮显示http链接数的变化情况
# watch -n 1 -d 'pstree|grep httpd'
我在用RecyclerView开发时,发现RecyclerView的Item会无法填充满宽度,问题如下:
可以看到布局没有充满宽度,出问题的代码如下。
经过不懈努力,我最终找到了两个解决方法。
第一种:
将onCreateViewHolder里的View.inflate(parent.getContext(), R.layout.xxx,null),改为LayoutInflater.from(parent.getContext()).inflate(R.layout.xxx,parent,false)
@NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_shop_cart,parent,false)); } 第二种:
将包裹item的LinearLayout改为RelativeLayout
改完以后效果图:
郁闷了几天终于搞明白了httpd2.4被访问时经常出现超时和响应慢,甚到出现服务器假死的原因
编辑httpd.conf文件,在其后面添加 AcceptFilter http none AcceptFilter https none
更改httpd的响应与超时设置,首先开启Include conf/extra/httpd-default.conf
然后更改httpd-default.conf的值 ,相关的能数可以根据自己服务器的状态进行设置
Timeout 60 (连接超时时间)建议设小些 20
KeepAlive On (开启可以提高性能,因为一个页面一般会有多个请求)
MaxKeepAliveRequests 100 (这个数目自己根据网页内容调节) 我设成了50
KeepAliveTimeout 5 (这个小于Timeout就行)
开启mpm Include conf/extra/httpd-mpm.conf
使用httpd -l查看系统使用的是哪种mpm(windows使用的是winnt)
修改其对应的模块配置
<IfModule mpm_winnt_module>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
</IfModule>
ThreadsPerChlid是Apache进程的子线程数,这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了
MaxRequestsPerChild是进程的最大的请求数目,既指网站收到请求的缓存数。设置太小了会影响服务器性能,因为会占用较多cpu时间,太大了则会占用内存资源。一般大型的网站文件个数都是成千上万,所以管理员应该根据网站情况自己设定。
MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
在mpm_netware和mpm_winnt上的默认值是"0"。
将MaxRequestsPerChild设置成非零值有两个好处:
a)可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
b)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果帮您解决了相关问题,请您帮我点个赞哦!
昨天再开发中遇到个小问题,本来不值得写的,但是最近一直没写文章,决定还是简单写一下,刷刷存在感吧。
有个需求,要从url里面获取出完整的域名。从网上找了一下,大部分都是下面这篇文章:
https://blog.csdn.net/u013217757/article/details/53838250/
我测试了一下,完全没有问题。主要就是下面这段代码:
public static URI getIP(URI uri) { URI effectiveURI = null; try { effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); } catch (Throwable var4) { effectiveURI = null; } return effectiveURI; } 普通url都正常,但是跑了几天后出毛病了,域名里如果出现了“_”(下划线)或者“-”(减号),URI就是空。
查了一下document,大概是这样描述的:
A domain name consisting of one or more labels separated by period characters '.', optionally followed by a period character. Each label consists of alphanum characters as well as hyphen characters '-', though hyphens never occur as the first or last characters in a label.
path环境变量作用:保证javac命令(编译命令)可以在任意目录下运行。
classpath环境变量作用:保证.class文件(字节码文件)可以在任意目录下被JVM运行。在没有配置classpath环境变量时,java命令在找.class文件时是默认在当前目录下寻找的。
例题:
在Java中,关于ClassPath环境变量的说法不正确的是( )。
A、 ClassPath一旦设置之后不可修改,但可以将目录添加到该环境变量中
B、 编译器用它来搜索各自的类文件
C、 ClassPath是一个由多个目录组成的列表
D、 解释器用它来搜索各自的类文件
答案:A
JVM,java解释器,java编译器的区别
JVM:负责运行字节码,JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。
Java编译器:将.java文件编译成.class文件,javac.exe是Java编译器。
Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。
所以通过classpath的作用不难看出BD是正确的
最初用opencv处理图像时,大概查过cv2.waitKey这个函数,当时查的迷迷糊糊的,只知道加上cv2.waitKey之后cv2.imshow就可以显示图像了。今天做视频逐帧截取时再次碰见了它,我盯着它想了半天也不知道这个函数有什么用,于是打开浏览器,一逛就是大半天。现在把我的收获及想法总结一下。
为什么cv2.imshow之后要跟cv2.waitkey 我们先说说它的好兄弟cv2.imshow。我们都知道imshow的作用是在GUI里显示一幅图像,但是它有个特点我们没有太注意,就是它的持续时间。看看下面的测试你就明白了。
实际上,waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。
给一段imshow源码里的注释来印证下:This function should be followed by cv::waitKey function which displays the image for specified . milliseconds. Otherwise, it won't display the image.
非官方翻译:这个函数之后应接cv2.waitKey函数来显示指定图像。否则,它不会显示图像。
为什么要这么麻烦的设计 来自官方的解释:This function is the only method in HighGUI that can fetch and handle events, so it needs to be .
非官方翻译:这个函数是HighGUI窗口中唯一的获取和处理事件的方法,因此它必须存在。
cv2.waitKey(1000) & 0xFF == ord(‘q’) 是什么意思 先解释下字面意思:
cv2.waitKey(1000):在1000ms内根据键盘输入返回一个值0xFF :一个十六进制数ord('q') :返回q的ascii码 0xFF是一个十六进制数,转换为二进制是11111111。waitKey返回值的范围为(0-255),刚好也是8个二进制位。那么我们将 cv2.waitKey(1) & 0xFF计算一下(不知怎么计算的可以百度位与运算)发现结果仍然是waitKey的返回值,那为何要多次一举呢?直接 cv2.waitKey(1) == ord('q')不就好了吗。
实际上在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象。通过cv2.waitKey(1) & 0xFF运算,当waitkey返回值正常时 cv2.
<!---title:运行caffe识别数字的模型mnist-->
<!---keywords:填写关键字, 以半角逗号分割-->
原始引用地址: [运行caffe识别数字的模型mnist](http://yangkuncn.cn/caffe_mnist.html) time: 2020.5.17 23:28
## mnist是啥?
mnist是一个运用神经网络识别数字的模型,可以识别数字0到9.
### 获取mnist模块与数据
对于mnist(就是数字识别)例子,参考以下地址,获取数据训练相关数据:
<http://caffe.berkeleyvision.org/gathered/examples/mnist.html>
准备数据:
```
cd $CAFFE_ROOT ./data/mnist/get_mnist.sh ./examples/mnist/create_mnist.sh
```
### 运用多核,加速训练
caffe在纯CPU模式下,使用多核运行
<https://blog.csdn.net/b876144622/article/details/80009877>
1. sudo apt-get install -y libopenblas-dev
2、修改caffe目录下的Makefile.config文件,将BLAS: =atlas修改为BLAS: =open
3、再编译caffe,首先make clean,清除之前的编译结果,再依次执行make all -j16, make test -j16, make runtest -j16,编译caffe。-j16是指用16个核并行编译caffe,可以大大加快编译速度。
4、编译完成后,执行训练前,需要export OPENBLAS_NUM_THREADS=4, 即使用4个核进行训练
### 开始训练
因为编译时,选择使用cpu,使用要更改文件:
examples/mnist/lenet_solver.prototxt
把:solver_mode: GPU 改为:solver_mode: CPU 训练命令:
```
export PYTHONPATH=/home/xy/works/caffe/python/
time ./examples/mnist/train_lenet.sh #vm用时17m36s j1900 42m55
```
### 进行图片识别
#### 用软件手写一个图片
在工作中难免会遇到一些接手别人做到一半的项目(并且没人讲代码的时候),这时候我们应该怎么去分析这个项目呢?(VUE) 首先拿到别人的代码的时候去分析以下几个事情。这里使用VUE项目举例,
一、首先观察package.json 看看是否是脚手架搭建,以及跑项目命令。分析是脚手架几 2 ? 3 ?4?
npm run dev || npm run serve ,其次再了解安装的一些依赖,比如,如果依赖里面有element-ui 这个UI库,但是没有babel-plugin-component 这个依赖的话,就可以判断出是使用了elementUI库而没有按需引入,而是全局引入,如果让你接受使用按需引入的话就需要进行一些配置了,配置完成并且将已经引入的组件进行注册安装。
二、安装依赖,运行命令行npm install 通常在这一步会出现大多的错误,什么缺乏Python环境呀,等等一系列看不懂的报错,这时候就需要去试一试cnpm。如果cnpm 安装依赖也报错再试一试安装一个Python环境,或者分批安装对应的依赖,比如npm i vue-router vuex -S 等。实在解决不了可以和项目负责人聊聊,试试找找帮助,这里一些解决方案也是百度查找的,就不一一列举了。
三、当依赖什么安装完成后,就可以跑起来项目先看看了,如果是后台管理系统的话,在不知道账号密码的情况下(并且后端服务挂了的前提下)可以进入axios拦截器或者路由的前置守卫里面将拦截的动作注释掉。这样就可以跳过(需要手动在地址栏输入路径)登录页面,直接进入user页面或者其他页面,当然这里还会出现一些请求超时,页面没数据等报错,这时候不用管,只需要打开router配置文件,根据配置文件的路径进行页面的一一访问,查看有的页面是否可以跳转,如果不能跳转或者直接显示空白页面就说明这些页面并没有做出来。
四、在后端服务没挂的时候,最好问后端老哥要一个账号密码进行登录,然后在页面中跳转观测,但是呢后端老哥服务是启动了,但是还是不响应的话,可以使用postman等工具对一些接口进行调试,看看是否成功,不成功的话(后端多个,但是给你接口的这个脾气不好) 可以试试去别的后端老哥要个接口,进行测试。
五、查看vue.config.js文件,这里通常配置一些代理呀 ,接口配置乱七八糟一些东西。
六、查看一些plugins里面的配置,查看里面的axios二次封装,或者一些简单的get请求是如何进行的。方便以后调用。
七、深入页面。后端服务启动的时候,可以观察一些layouts页面之间是如何存在的,这时候,去路由配置文件里面观察是最好的,根据里面的路径,找到一一对应的页面,理解上一个开发者的布局思路,可以更快的上手整个项目,因为可能留给你上手的时间并不多。
八、当然,在一个项目里面会有很多的上一个开发者自己封装的一些方法,全局变量什么的。这些文件大部分会在主入口main.js里面引入,这时候可以一一点进去观察这些模块都暴露出来什么东西,最好的情况下是自己理解,然后在引入的位置进行注释标注,有利于以后的调用。
九、项目跑起来后观察控制台里面看看有没有报错,如果有报错需要及时的去处理这些报错的原因。
总结:接手一半的项目,并且在短时间内理解是一件比较头大的事情,如果有人讲解或者带你是最好的,如果没人带的话可以试试我这个思路来分析代码,说不定会有一定的帮助,编程不易,且行且珍惜。
群晖NAS公网访问 (IP+DNSPOD+桥接+端口转发+DDNS+WebDAV) 文章更新一版,结果审核不过,只能转载了:
https://www.cnblogs.com/nomil9/articles/12924354.html
欢迎大家访问我的github:https://github.com/Iamttp 有问题一起讨论呀!
简介 不会java的小白,在使用的单片机的蓝牙功能时难道只能上百度下载别人的蓝牙app软件吗?幸运的是一个基于云端开发app的网站来了。
App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。除此之外它也正式支持乐高NXT机器人,对于Android初学者或是机器人开发者来说是一大福音。因为对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。(百度百科)
因为网上这方面的资料比较少,而自己又在这方面踩了不少坑,所以将单片机、手机常用的app蓝牙通信分享出来,希望一起学习呀!
手机发送数据到单片机实现 首先进入其网站,这需要 _ _ (你懂的),当然也可以用App Inventor广州服务器。这里可以参考其他文章。进入后可以看到Appinventor分为界面设计(Designer)以及代码逻辑块(Blocks),可以在右上角切换中英文。
首先是界面设计,不用太华丽,当然也不要像我这样难看。利用左栏的布局(Layout),可以整理按钮(Button)和标签(Label)的位置。如果要使用蓝牙还要在连接(Connectivity)里面加入蓝牙客户端(BluetoothClient)。之后是逻辑块设计,首先是选择蓝牙以及断开蓝牙的列表选择框以及按钮逻辑设计,思路就是在手机app启动时,列表选择框(选择蓝牙)的启用为真,按钮(断开)的启用为假。选择蓝牙时将蓝牙客户端的地址及名称显示出来供用户选择。 这样基本的蓝牙通信界面就出来了(先不要喷呀!)做到这里请先试试效果,程序不可能在你写好每个功能后,一运行,然后简直完美。程序需要逐渐壮大,一个功能一个功能的测试,这应该也是软件工程的一个基本思想。
在整个界面的上面有一个连接(Connect)选项,推荐使用AI伴侣,要求手机下载一个Appinventor的app,然后手机和电脑在同一个局域网下,扫描二维码就可以在线调试看效果了。是不是有点小激动呀!
上面没有错误后只需加入这类的简单代码块就可以控制单片机了(发送数据)。记得配合单片机的串口通信代码(外加蓝牙)。
单片机发送数据到手机实现 但是万一我们需要单片机发送给手机呢?这里我踩了好多坑,网上这方面的教程几乎找不到。这也是这篇文章的重点,首先我们考虑一下如果我们一直执行数据接收,数据一定会乱套的。这样我们需要先用app发送一个数据,然后手机app方面开始执行接收数据程序,单片机则根据接收到的数据发送相应的数据。这样就可以一起配合完成数据通信了,并且不会乱套。
而假如要一直更新某个数据怎么办呢?单片机方面可以在while(1)里面循环判断接收的数据,然后确认是否发送某个变量的值。而手机app则可以通过定时器在间隔指定时间执行指定函数,发送数据(相当于控制码,控制要接收什么数据),然后接收单片机的数据。(没错,我自己也迷糊了,可以看下面的代码块,一目了然)
在组件里面加入定时器,然后设置定时间隔单位ms,这样每隔500ms就会执行计时器计时函数块。 2.在代码逻辑块中加入如下图代码块,具体原理上面已经解释。
(
更新1(之前没注意这个问题):
问题:这里因为定时器设置的启用定时(启用定时指一开始就定时,一直定时是指不止定时执行一次),所以会在还没有连接蓝牙客户端时就开始运行上面的代码块。
解决方案:所以需要在”当Screen,初始化“那个代码块下添加设置定时器启用假,相应的在“当列表选择框1选择完成”那个代码快下添加设置定时器启用真。
更新2: 这里省略了全局变量的定义块,大家自己找找这个块吧!然后省略了设置标签值为全局变量的代码块,有了这个就可以显示出全局变量了。
)
3.之后是根据手机app编写单片机的串口通信程序,如果按照上面的代码块,则单片机的程序应该为:
while(1) { if(接收为1) { 发送指定变量值; } if(接收为0) { 发送另一个指定变量值; } } 到了这步就可以下载试试了。文采不好,有什么问题一起交流。
2020.5.20:
找到之前的一个麦克拉姆轮小车的蓝牙APP程序 (只有发送数据到单片机上的功能):
大家评论我都看了,大部分问题集中在App Inventor的配置与前期使用上,而这篇文章初衷是希望解决单片机发送数据到APP这个关键问题上。
同时因为作者已经很久没有接触App Inventor了,原因详见https://blog.csdn.net/qq_40515692/article/details/100639331,所以也不会再更新App Inventor的入门使用。/ w \
所以希望读者通过评论和网上其他资料解决入门问题。当然如果没有解决,作者还是很欢迎大家继续评论讨论!
常见问题汇总: 1. 打开连接控制端后是一整块黑屏 ? 在手机设置->蓝牙里面,有一个不常用类型设备可以与买来的蓝牙模块配对,密码一般是1234,配好了再重新打开弄好的app就可以与蓝牙连接了。 总之就是需要根据你手机的蓝牙设置匹配一下,这样APP才能够检测到。
实在没有成功,你可以网上随便下一个蓝牙APP,根据你手机的蓝牙设置匹配一下,然后用下的那个APP确认连接(连接成功,蓝牙模块的指示灯闪烁速度会发生变化),确认可以正常连接后(硬件基本没问题),就再自己参考参考别人的教程或上面的教程写appinventor的程序,然后用自己写的APP连接,测试程序。
2. 507 错误? 如果是和HC05通信,HC05没有修改主从模式,应该不会出现这个问题。
出现这个问题,我现在推测的原因是手机-手机,手机-电脑等可能的连接方式时,因为蓝牙连接只能在服务器与客户端之间连接,所以会出现507错误。
下载.net core sdkhttps://www.microsoft.com/net/core#macos
$ dotnet -bash: dotnet: command not found 已安装成功,肯定是环境变量设置问题。
$ cd /usr/local/share/dotnet $ ls LICENSE.txt dotnet packs shared ThirdPartyNotices.txt host sdk templates 查看~/.bash_profile环境设置
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin // 设置软链接 $ ln -s /usr/local/share/dotnet/dotnet /usr/local/bin/ // 查看dotnet位置 $ which dotnet /usr/local/bin/dotnet 参考:
https://blog.csdn.net/lscan/article/details/74279314
复习 我们想要通过自底向上文法来进行语法分析,就要使用移入-归约法不断将右串归约成左侧的非终结符最后回到开始字符。在这个过程中,遇到的问题有:何时移入?何时归约?归约时哪部分归约?归约成哪部分?
LR(k)语法 L表示从左往右扫描,R表示反向构造出一个最右推导,k表示向前看k个字符,缺省为1。
一个输入:字符串w;一个输出:分析完成的树;一个栈;一个驱动程序;一个语法分析表。分析表包括Action部分和Goto部分。
每次实现,先将初始状态S0压入栈,将串w$作为输入缓冲区内容。接着调用驱动程序。
LR表结构 两部分构成,一个语法分析动作函数Action,一个转换函数Goto。
1.Action函数
ACTION[i, a],其中i为状态,a为输入符号 (或者结束符$),有以下操作:
(1) sj:移入状态j进状态栈,将符号a移入符号栈;
(2) rj:使用第j个产生式A -> β进行归约,将状态栈的 |β| 个状态出栈,并且将新的状态移入栈 (Goto函数求新状态);将符号栈的 |β| 个符号出栈,将A移入符号栈;
(3) 接受 (acc);
(4) 报错 (error);
2.Goto函数
如果GOTO[Ii, A] = Ij, 那么GOTO把状态I和一个非终结符号A映射到状态j。
基于LR分析表的自底向下分析 分析程序如下:
对于下面的文法:
(1)E -> E + T (2) E -> T
(3) T -> T * F (4) T ->F
(5) F -> ( E ) (6) F -> id
给出了LR语法分析表:
执行id * id + id的分析。
题目描述:给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = “abc”, s2 = “bca”
输出: true
示例 2:
输入: s1 = “abc”, s2 = “bad”
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
第一种解法:
1.比较传入的字符串的长度是否相等,不相等返回false。
2.对2个字符串排序。
3.排序后比较俩个字符串是否相等,相等返回1,不相等返回0。
class Solution { public: bool CheckPermutation(string s1, string s2) { if(s1.size() != s2.size()) { return false; } sort(s1.begin(),s1.end()); sort(s2.begin(),s2.end()); return s1 == s2; } }; 第二种解法:哈希-> map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能
1.比较传入的字符串的长度是否相等,不相等返回false。
文章目录 一、下载安装包二、安装三、QT项目测试 环境
系统:ubuntu18.04 软件:qt5.12.8 一、下载安装包 下载地址http://download.qt.io/archive/qt/5.12/5.12.8/
点击需要的版本(我们这里选择.run的)会跳转到一个选择源的界面,国内选择(CN)的三者之一即可
二、安装 从终端进入下载文件夹,一般是/home/用户名/Downloads,可以找到下载好的qt-opensource-linux-x64-5.12.8.run
给所有用户赋予qt-opensource-linux-x64-5.12.8.run可执行权限
sudo chmod a+x qt-opensource-linux-x64-5.12.8.run 有权限后在该路经下执行就可以了
./qt-opensource-linux-x64-5.12.8.run 弹出安装指引窗口,按照指引填好QT Account(我记得以前有版本安装可以跳过),一路next,不建议修改默认路经。
按需安装,配置足够全选可以省事。
项目说明Desktop gcc 64-bit这是使用桌面版 GCC 64-bit 编译环境生成的 Qt 库,是 Qt 的核心,必须安装。注意,虽然名字看起来像是 GCC 编译器套件,但实际上说的是 Qt 库的编译环境。大部分 Linux 发行版都会预装 GCC 编译器套件,所以 Qt 安装包没必要附带它们。Android *这是针对安卓应用开发的 Qt 库,如果读者有安卓开发这方面需求可以自己选择安装。SourcesQt 的源代码包,按需安装。Qt *Qt 的附加模块,大部分建议安装,这些附加模块括号里的 TP 是指 Technology Preview ,技术预览模块的意思,还处在功能测试阶段,不是正式版模块;附加模块括号里的 Deprecated 是指抛弃的旧模块,兼容旧代码使用的,一般用不到。这些附加模块读者可以选择部分或都勾选了安装,占用空间不大。部分组件说明:Qt Charts 是二维图表模块,用于绘制柱状图、饼图、曲线图等常用二维图表。Qt Data Visualization 是三维数据图表模块,用于数据的三维显示,如散点的三维空间分布、三维曲面等。Qt Scritp(Deprecated)是脚本模块,已被抛弃,不建议安装。Qt Creator 4.3.0这是集成开发环境,强制安装的,以后所有的项目和代码都在 Qt Creator 里面新建和编辑。 安装完成后,在你的应用里面就可以找到Qt Creator了
配置环境变量
需要配置环境变量后才能直接使用qmake命令
ubuntu中作用于所有用户,编辑/etc/profile文件
进行Ubuntu系统手动分区的教程网上有很多,结合自己的使用进行了如下总结(个人经验,不一定正确):
(1)首先是选择手动分区。
(2)分成三个区,swap,/,/home,swap分区一般都是要有的一般设置为内存的1到1.5倍,如果内存达到了16G及以上,直接等于内存就好,/分区分100G就好,剩下的分给/home。
(3)我安装Ubuntu系统用了400G,内存是16G,swap也就分了16G,/根目录分了100G,剩下的空间分给/home用户目录,在保证根目录够用的情况下,尽量多的给/home分配空间,大部分数据和软件是可以放到用户目录下的。
使用Ubuntu系统的注意事项:
(1)不要没事乱升级内核,。
(2)Ubuntu系统一般不是用于娱乐了,无关紧要的软件不必要更新。
(3)用到哪个软件需要更新,更新哪个就好。
前言 在敲七层登录的时候,遇到了System.NullReferenceException:未将对象引用设置到对象的实例这个问题。
解决方案 后来发现出现这个错误的原因是对象为null空值,经过调试发现在下面这一行代码显示idal对象为null值。
idal接收的是工厂层中CreateUser方法的返回结果,到工厂层中发现ClassName多加了一个引号,将它去掉问题就解决了,在这里用到了反射+工厂。
笔记本上的电池容量是怎么算出来的?
终于把自己的笔记本上的电池给拆开了,看了看,有两组是两节并联的,然后串两组单个的电芯。笔记本标称的容量是47Wh.如何得出来的呢?
电池的串并联对电池总容量的影响:串联容量不变,并联容量倍增!
1、单个电池: 单个电池以一定的电流(I)放电,放电时间为t,容量为C
N个电池串联:以一定的电流(I)放电,流经每个电池电流都为I,相当于单节电池以一定的电流在放电,所以不管串联多少个电池,容量就等于一个电池的容量C。容量虽然没变,但是功率却是单个电池的N倍,因为串联后电压是原来的N倍。
例如:
电池的串联:例如用有两个容量3A.h(淘宝上查的,劲霸电池的容量为2900mah)的电池串联,负载接一个3欧的电阻。
很显然,回路的总电流是(3+3)/3=2A; 那么对这两个电池来说,都只能用1.5h的时间;则,总的容量是总电流*总时间=2A*1.5h=3A.h 即,总容量不变,仍然相当于单体电池的容量
2、N个电池并联:以一定的电流(I)(这里是指总的电流)放电,流经每个电池的电流为I/N,整体系统电流不变,但流经每个电池的电流仅为单个电池时的1/N,电流变小,单个电池容量不变的情况下,用的时间就会增倍,所以整体电池并联后的容量就会增倍。即放出的总的电量为单个电池容量的N倍。
例如:
电池的并联:还是两个两个容量3A.h的电池并联,负载接一个3欧的电阻。这时,主回路中的电流为3/3=1A;而两个支路上的电流为1/2=0.5A。那么,对两个电池而言,都可以使用6h的时间;这样,总的容量为1A*6h=6A.h 即,总容量提高,相当于单体电池容量的2倍。
扩展,算笔记本标称的44Wh,如何得出来的
首先明白两个概念:
我们所说的电池容量(或者叫额定容量),就是指的是电池的电荷容量。使用的单位是电流和时间的乘积,用A.h或者mA.h表示。其实我觉得这是库仑的单位的转化。(电荷单位库伦,简称库,符号C,定义为1A电流在1s内输运的电量,即1C=1A•S)。
电池能量,是指电池所储存的总能量,用电压与电池容量的乘积来表示V.A.h。而我们知道功率的单位W瓦等于V.A,而功率乘以时间就是功率单位J焦。
电池能量密度是指电池平均单位质量或体积能够输出的能量。电池能量密度=电池容量×放电平台/电池厚度/电池宽度/电池长度,基本单位为Wh/kg(瓦时/千克)
根据这些概念的定义:就可以知道笔记本电池47Wh,额定电压是10.8V.
用根据电池能量的公式:电池能量/额定电压=电池容量,即47/10.8=4.35AH
打开后,可以知道电池是两并+两并+两并,实测,单节电池电压为4.0+3.8+3.88=11.68V,但实测也是11.68V,中间除接到保护板外,没有再连接其他地方。
回归正题:计算笔记本的电量。
假设电池串联后的电压是12V,而47wh/12=3.91Ah,相当于整体电池组的容量是3.91Ah.根据以上的分析,也就是串联每个电池的容量是3931mah,但由于两组是并起来的,3931应该算是平均的容量,设每个电池的容量为X,则并起来的电池容量为2X,所以
(2X+2X+X+X)/3=3931,得到每个电池容量为1965maH.相当于只要买容量为1965mah的电池就可以满足要求。
综合,市面上18650电池,一般标称的容量都在2000mah以上,所以一般电池就能满足需要,同时需要注意的是,有些电池是可以带感性器件(也就是常说的动力电池),有些是不可以的。
一个机器人玩抛硬币的游戏,一直不停的抛一枚不均匀的硬币,硬币有A,B两面,A面的概率为3/4,B面的概率为1/4。问第一次出现连续的两个A年的时候,机器人抛硬币的次数的期望是多少?
假设T为扔的次数(期望)。 那么如果扔到B,则重新开始扔,即再扔T次。
第一次扔到B,则重新扔,即1/4*(1+T);这时1+T是结束游戏所扔次数;
第一次扔到A,第二次扔到B,重新扔,即3/41/4(2+T);2+T是结束游戏所仍次数;
第一次扔到A,第二次扔到A,结束游戏。3/43/42;2为结束游戏所仍次数;
所以T=1/4*(1+T)+3/4 1/4(2+T)+3/4 *3/4 *2;算得T为28/9
目录
1.Scala中的函数
2.匿名函数:没有名字的函数
3.带函数参数的函数,即:高阶函数
4.高阶函数示例
5.闭包
6.柯里化:Currying
1.Scala中的函数 在Scala中,函数是“头等公民”,就和数字一样。可以在变量中存放函数,即:将函数作为变量的值(值函数)
举例:使用Spark来执行WordCount
var result = sc.textFile("hdfs://....").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect 2.匿名函数:没有名字的函数 //普通函数 def fun1(x:Int):Int = x*3 //匿名函数 (x:Int)=>x*3 注:匿名函数:一个普通的函数,把返回值去掉,再把函数名和“def”去掉,再在"=“后面的加一个”>"
调用匿名函数作为函数参数
3.带函数参数的函数,即:高阶函数 (1)示例1: (a)首先,定义一个最普通的函数 (b)再定义一个高阶函数 (c )分析这个高阶函数调用的过程 (2)示例2: 在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunction;myFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。
4.高阶函数示例 (1)map:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),返回一个新的集合 //map //在列表中的每个元素上计算一个函数,并且返回一个包含相同数目元素的列表 val numbers = List(1,2,3,4,5,6,7,8,9,10) numbers.map((i:Int)=>i*2) numbers.map(_*2) //map函数不改变numbers值 numbers _ 相当于循环变量 i _*2 与 (i:Int)=>i*2 功能相同 _+_ 与 (i:Int,j:Int)=>i+j (2)foreach:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),不返回结果。 //foreach //foreach和map相似,只不过它没有返回值,foreach主要是为了对参数进行作用 numbers.foreach((i:Int) => i * 2) numbers.foreach(_*2) numbers numbers.foreach(println(_)) numbers.map(_*2).foreach(println) (3)filter:过滤,选择满足的数据 举例:查询能够被2整除的数字