一.webdriver简介 Selenium是ThroughtWorks公司开发的一套Web自动化测试工具。
它分为三个组件:
Selenium IDE
Selenium RC (Remote Control)
Selenium Webdriver
Selenium IDE是firefox的一个插件,允许测试人员录制脚本并回放。
Selenium RC和Selenium Webdriver是测试框架,提供多种语言的API。不同的是,Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。以及,Selenium Webdriver不需要本地服务器。
Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。
主要是来解决https的加密问题
二.使用 Webdriver在使用之前,需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:
这里使用的是谷歌浏览器,可以在网上进行搜索下载,并把chromdriver放在google.exe那个当前目录下面。
1.例子:打开某网址 #导入模块import os import time from selenium import webdriver #指定下载插件的位置 chromedriver = "c:\/users\youjianjun\AppData\Local\Google\Chrome\Application\chromedriver.exe" os.environ["webdriver.chrome.driver"] = chromedriver driver = webdriver.Chrome(chromedriver) #定义要访问的页面 url = "http://www.python.org"#打开 driver.get(url)#打开页面后停止3秒 time.sleep(3)#关闭页面 driver.quit() 运行之后会自动打开浏览器并访问填写的URL,在停止3秒后,页面自动关闭。
2.当能够自动打开页面后,下一步需要做的就是登陆了,那么这时候就要用到‘选择器‘了,它可以定位到页面上的输入框,然后进行操作。
八种选择器:
1. find_elements_by_name(“test”)
页面:
<input type="text" name="passwd" id="passwd-id" class=”input-class”/>
代码:
element = driver.find_elements_by_name(“passwd”)
2. find_elements_by_id()
element = driver.
就是调用类中的方法,最简单的用法是可以把方法参数化。invoke(class, method);
Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法
该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
person.getClass().getMethod("Speak", null);
//获得person对象的Speak方法,因为Speak方法没有形参,所以parameterTypes为null
person.getClass().getMethod("run", String.class);
//获得person对象的run方法,因为run方法的形参是String类型的,所以parameterTypes为String.class
如果对象内的方法的形参是int类型的,则parameterTypes是int.class
//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
Method method = XXX.getClass().getMethod(methodName,new Class[0]);
//第一个参数是具体调用该方法的对象
//第二个参数是执行该方法的具体参数 如一个函数 int Test(int a, String str);
对应的getMethod方法:
1. getMethod("Test",int.class,String.class);
2. getMethod("Test",new Class[]{int.class,String.class});
//Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,返回值总是对象。
//如果参数为基本类型数据,必须转换为相应的包装类型的对象。
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException InvokeObj.java:
public class InvokeObj {
public void show(){
System.out.println("无参show()方法");
}
public void show(String name){
System.out.println("show方法:"+name);
}
public String[] arrayShow(String[] arr){
收盘价的分析常常是基于股票收益率的。股票收益率又可以分为简单收益率和对数收益率。
简单收益率:是指相邻两个价格之间的变化率。
对数收益率:是指所有价格取对数后两两之间的差值。
简单收益率的计算
NumPy中的diff函数可以返回一个由相邻数组元素的差值构成的数组。不过需要注意的是,diff返回的数组比收盘价数组少一个元素。
对数收益率的计算 对数收益率计算起来甚至更简单一些。我们先用log函数得到每一个收盘价的对数,再对结果使用diff函数即可。一般情况下,我们应该检查输入数组以确保不含有零和负数。
我们有时只对交易日的收益率为正值感兴趣。我们可以用where函数,指定判断条件,where函数会返回满足条件的数组元素的索引值。
股票波动率的计算 股票波动率是对价格变动的一种衡量。计算波动率(年波动率和月波动率)时,需要用到对数波动率。 年波动率等于对数波动率的标准差除以其均值,再除以交易日倒数的平方根,通常交易日取252天。
实例: #NumPy常用函数:计算股票收益率和波动率 from numpy import * #简单收益率:相邻两个价格之间的变化率 #20 30 50 45 (30 - 20)/20,(50 - 30)/30,(45 - 50)/45 #对数收益率:所有价格取对数后两两之间的差值 #(log(30) - log(20) = log(30/20)) #log(a) - log(b) = log(a/b) #diff std where log sqrt #diff:返回由相邻数组元素的差值组成的数组 #std:计算标准差,sqrt(((x1 - a)^2 + (x2 - a)^2 + (x3 - a)^2 ...+ (xn - a)^2))/n) #标准差可以反映一个数据集的离散程度 #where:可以根据设置的条件过滤数组中值的索引 #计算简单收益率 a = array([4,7,10,4]) print(diff(a)) c = loadtxt('data.
Q:简述计算机三大变换的联系和区别 (傅里叶变换 拉普拉斯变换 z变换)
(1) 傅里叶变换定义:
表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。傅立叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅立叶变换用正弦波作为信号的成分。
f(t)是t的周期函数,如果t满足狄里赫莱条件:在一个以2T为周期内f(X)连续或只有有限个第一类间断点,附f(x)单调或可划分成有限个单调区间,则F(x)以2T为周期的傅里叶级数收敛,和函数S(x)也是以2T为周期的周期函数,且在这些间断点上,函数是有限值;在一个周期内具有有限个极值点;绝对可积。则有下图①式成立。称为积分运算f(t)的傅立叶变换,
②式的积分运算叫做F(ω)的傅立叶逆变换。F(ω)叫做f(t)的像函数,f(t)叫做F(ω)的像原函数。F(ω)是f(t)的像。f(t)是F(ω)原像。
①傅立叶变换
②傅立叶逆变换
(2)拉普拉斯变换定义:
拉普拉斯变换是工程数学中常用的一种积分变换,又名拉氏变换。 拉氏变换是一个线性变换,可将一个有参数实数t(t≥ 0)的函数转换为一个参数为复数s的函数。拉普拉斯变换在许多工程技术和科学研究领域中有着广泛的应用,特别是在力学系统、电学系统、自动控制系统、可靠性系统以及随机服务系统等系统科学中都起着重要作用。
拉普拉斯变换的公式:
拉普拉斯变换是对于t>=0函数值不为零的连续时间函数x(t)通过关系式
(式中-st为自然对数底e的指数)变换为复变量s的函数X(s)。它也是时间函数x(t)的“复频域”表示方式。
(3)Z变换定义:
Z变换(英文:z-transformation)可将时域信号(即:离散时间序列)变换为在复频域的表达式。它在离散时间信号处理中的地位,如同拉普拉斯变换在连续时间信号处理中的地位。离散时间信号的Z变换是分析线性时不变离散时间系统问题的重要工具,在数字信号处理、计算机控制系统等领域有着广泛的应用。
双边Z变换
离散时间序列x[n]的Z变换定义为:
式中 ,σ为实变数,ω为实变量,所以Z是一个幅度为 ,相位为ω的复变量。x[n]和X(Z)构成一个Z变换对。
单边Z变换
通常意义下的Z变换指双边Z变换,单边Z变换只对右边序列( 部分)进行Z变换。单边Z变换可以看成是双边Z变换的一种特例,对于因果序列双边Z变换与单边Z变换相同。
单边Z变换定义为 :
(4)关系和区别:
傅立叶变换是最基本得变换,由傅里叶级数推导出。傅立叶级数只适用于周期信号,把非周期信号看成周期T趋于无穷的周期信号,就推导出傅里叶变换,能很好的处理非周期信号的频谱。但是傅立叶变换的弱点是必须原信号必须绝对可积,因此适用范围不广。
拉普拉斯变换是傅立叶变换的推广,傅立叶变换不适用于指数级增长的函数,而拉氏变换相当于是带有一个指数收敛因子的傅立叶变换,把频域推广到复频域,能分析的信号更广。然而缺点是从拉普拉斯变换的式子中,只能看到变量s,没有频率f的概念,要看幅频响应和相频响应,还得令s=j2πf
Z变换的本质是离散时间傅里叶变换(DTFT),如果说拉普拉斯变换专门分析模拟信号,那Z变换就是专门分析数字信号,Z变换可以把离散卷积变成多项式乘法,对离散数字系统能发挥很好的作用。Z变换看系统频率响应,就是令Z在复频域的单位圆上跑一圈,即Z=e^(j2πf),即可得到频率响应。由于傅里叶变换的特性“时域离散,则频域周期”,因此离散信号的频谱必定是周期的,就是以这个单位圆为周期,Z在单位圆上不停的绕圈,就是周期重复。单位圆0°位置是实际频率0HZ,单位圆180度的实际频率就是采样频率的一般,fs/2.
总结一下:拉普拉斯变换是傅里叶变换的扩展,傅里叶变换是拉普拉斯变换的特例,z变换是离散的傅里叶变换在复平面上的扩展。
相关阅读:
杀死傅里叶变换
表达式控制标签——out标签使用总结 1.功能----主要是用来输出数据对象(字符串、表达式)的内容或结果。 2.语法 【语法1】:<c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]/> 【语法2】:<c:out value=”要显示的数据对象” [escapeXml=”true|false”]>默认值</c:out>
3.属性 属性名 是否支持EL 属性类型 属性描述
Value true object 指定要输出的内容
escapeXm1 true Boolean 指定是否将〉、〈、&、’、”等特殊字符进行HTL编码转换后再进行输出。默认值为true default true object 指定如果value属性的值为nu11时所输出的默认值 表达式控制标签——set标签使用总结 1.功能---用于把某一个对象存在指定的域范围内,或者将某一个对象存储到Map或者JavaBean对象中。
2.语法 语法1:存值,把一个值放在指定的域范围内。 <c:set value=”值1” var=”name1” [scope=”page|request|session|application”]/> 含义:把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。 语法2: <c:set var=”name2” [scope=”page|request|session|application”]> 值2 </c:set> 含义:把一个变量名为name2,值为值2的变量存储在指定的scope范围内。 语法3: <c:set value=”值3” target=”JavaBean对象” property=”属性名”/> 含义:把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。 语法4: <c:set target=”JavaBean对象” property=”属性名”> 值4 </c:set> 表达式控制标签——remove标签使用总结 1.功能-----主要用来从指定的JSP范围内移除指定的变量。 2.语法 <c:remove var=”变量名” [scope=”page|request|session|application”]/> 其中var属性是必须的,scope可以以省略。 表达式控制标签——catch标签使用总结 1.功能----用于捕获嵌套在标签体中的内容抛出的异常。 2.语法 其语法格式如下:<c:catch [var="varName"]>容易产生异常的代码</c:catch> var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个Web域中。 流程控制标签——if标签使用总结 1.
https://www.bilibili.com/video/av23546891/?p=2
http://www.docin.com/p-2080563523.html
今天整合ehcache时发现一个很重要的问题,就是程序关闭(硬关闭)之后,持久化到磁盘的缓存数据没能正确写入加载,问题还是硬关闭的问题,所以就使用actuator 进行监听
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> application.properties中添加(这里使用的是springboot2.x,所以management.endpoint替换了1.x的endpoints)
#启用shutdown
management.endpoint.shutdown.enabled=true 重启之后(/actuator 查看添加的监听接口)发现是没有需要的(/shutdown)
{ "_links": { "self": { "href": "http://localhost:8082/actuator", "templated": false }, "health": { "href": "http://localhost:8082/actuator/health", "templated": false }, "info": { "href": "http://localhost:8082/actuator/info", "templated": false } } } application.properties中添加
management.endpoints.web.exposure.include=* (/actuator/shutdown)正常返回
{ "message": "Shutting down, bye..." } 修改默认(/actuator)前缀路径)application.properties中添加
management.endpoints.web.base-path=/system/actuator 转载于:https://www.cnblogs.com/skyLogin/p/9214575.html
前提: list以及array是python中经常会用到的数据类型,当需要对list以及array进行文件的读写操作的时候,由于write函数参数需要的是一个str,所以这时就需要对list或者array进行str的转换了。
list和array的不同:
在进行转换之间先研究下python中list和array(np.array)的不同:
1、list是python中内置的数据类型,其中的数据的类型可以不相同,如java中List也可以不用相同的数据,但是为了格式的统一,就要用到泛型或者ArrayList。array中的数据类型必须是一样的。
2、list中保存的数据的存放地址,而不是数据,会增加内存的占用,所以存放数据还是尽量使用array。
3、list中有append的方法,可以进行追加,而array没有追加的方法,只能通过np.append来实现追加。
4、在print的时候,打印的结果不同。list元素之间有","分割,而array之间是空格。
list = [1,2,3,4] arr = np.array(list) print(list) print(arr) [1, 2, 3, 4] [1 2 3 4] 1、list转换为str 当list中存放的数据是字符串时,一般是通过str中的join函数进行转换:
list = ['a','b','c','d'] str1 = ''.join(list) str2 = ' '.join(list) str3 = '.'.join(list) print(str1) print(str2) print(str3) abcd a b c d a.b.c.d 但是当list中存放的数据是整型数据或者数字的话,需要先将数据转换为字符串再进行转换:
list = [1, 2, 3, 4] str1 = ''.join([str(x) for x in list]) str2 = ' '.join([str(x) for x in list]) str3 = '.
最近,公司有个做聚合SDK的老铁要离职了,然后它的锅就甩给我了,话说,本来开会的时候说和另一个同事一人负责半个月
哎,我是一个落魄的小开发 那好吧,App这边目前也没有啥需求,然后就接手了这位老铁的聚合SDK的项目,本来是一个月的项目交接时间,非常奇葩的一个礼拜就走人了,一点都不夸张的,代码都还没有看完就已经要去和CP对接游戏了,直接上手开干,啰嗦了这么多,还没有扯到正题,好吧,我的锅,必须通过文字来小小的抱怨一下。
由于这个Bug是在对接聚合SDK时发生的,但是很多小伙伴对SDK其实接触的不多,这里就先简单的介绍一下什么是SDK,什么是聚合SDK。SDK的英文全名是:software development kit,翻译成中文的意思就是“软件开发工具包”。SDK通俗点说就是第三方提供了一个实现了某些功能的工具包提供给你调用这里面的代码,然后就可以实现功能,以下是传统的接入SDK的缺点。
1,已经接入的渠道不定期的升级、更新
2,和其他公司的技术、商务的沟通协调
3,重复的动作,无限循环
主流渠道SDK有 AnySDK、易接、棱镜,这些SDK已经接入了主流的几十家SDK,但是缺陷也很大。他们的技术原理就是安卓反编译、回编,利用apktool.jar
1,收费,渠道一方要收大头,第三方也要收,那么留给游戏公司的利润就非常低了
2,安全,数据要通过第三方SDK的服务器
3,死板不自由,他们只接入了主流的,如果游戏公司和一些小的渠道有合作,这就需要重复的工作
客户端解决方案
1,一个抽象的SDK接入层
2,一键自动化打包工具
3,多个平台支持,Java、Unity3D、Cocos2D
服务器解决方案
1,统一的登陆认证中心
2,统一的支付中心
3,支持多款游戏
聚合SDK就相当于一个工具,通过这个工具可以一次性批量接入大量游戏,然后快速分发给更多渠道,比一款一款游戏接入渠道,省去了大量时间、人力、财力。渠道的意思就是指可以上线应用和游戏的平台,比如奇虎360、华为、小米、魅族等等。聚合SDK的实现原理是游戏母包集成一个抽象的SDK框架,并且把一些常见的动作比如初始化、支付、登陆、切换登陆、分享等等实现放到框架的回调方法里,然后聚合这边再写一个AndroidLib项目,它实现了这个抽象框架,在这个抽象框架内实现具体的渠道SDK所需要去实现的方法。但是CP那边集成实现抽象框架后生成的apk文件怎么和渠道的资源进行合并呢,答案就是反编译和汇编原理,这里简单的说下会用到的一些技术。
1,apktool.jar
编译和反编译的工具
apktool d -f <file.apk> <dir>
--->将apk文件反编译到指定文件夹
apktool b -f <dir> <newFile.apk>
--->将修改后的反编译资源文件夹编译成新的apk文件
2,dx.bat
将class文件转换成dex文件
3,smali.jar
用apktool.jar对apk文件进行反编译的时候会生成一个smali目录,smali是安卓虚拟机Dalvik所使用的一种.dex文件的汇编和反汇编器
baksmaki 可以将dex文件转换成smali的形式
4,java运行环境
5,python2.7
用py写的脚本来自动化打包,本质就是用这些工具去一步步反编译和回编,避免开发人员去敲命令行
6,aapt.exe
可以对压缩文件内的资源进行操作
7,jarsigner
签名工具
8,zipalign
对安卓项目中的资源进行优化读取,将项目资源映射成4个字节方便读取,避免显式读取。
好的,关于SDK介绍到这里,下面开始介绍遇到的Bug。
天启 2018/06/21 15:18:34 qihoo360_{buildNum}.apk 2,检测出SDK错误,请修正后重新提交。 sdk帮助文档和自检工具,点击查看。 错误信息: (文件 qihoo_game_sdk_sync_adapter.xml中的android:contentAuthority属性必须为包名+.cx.accounts.syncprovider -- c523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/ liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/ libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/ libqhsdk.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/ mips64/liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/ mips64/libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/ mips64/libqhsdk.
前言 最近有些朋友在面试阿里,加上 Java-Interview 项目的原因也有小伙伴和我讨论,近期也在负责部门的招牌,这让我想起年初那段长达三个月的奇葩面试经历?。
本来没想拿出来说的,毕竟最后也没成。
但由于那几个月的经历让我了解到了大厂的工作方式、对候选同学的考察重点以及面试官的套路等都有了全新的认识。
当然最重要的是这段时间的查漏补缺也让自己精进不少。
先交代下背景吧:
从去年 12 月到今年三月底,我前前后后面了阿里三个部门。
其中两个部门通过了技术面试,还有一个跪在了三面。
光看结果还不错,但整个流程堪称曲折。
下面我会尽量描述流程以及大致的面试题目大纲,希望对想要跳槽、正在面试的同学带来点灵感,帮助可能谈不上,但启发还是能有。
以下内容较长,请再次备好瓜子板凳。
A 部门 首先是第一次机会,去年 12 月份有位大佬加我,后来才知道是一个部门的技术 Leader 在网上看到我的博客,问我想不想来阿里试试。
这时距离上次面阿里也过去一年多了,也想看看现在几斤几两,于是便同意了。
在推荐一周之后收到了杭州打来的电话,说来也巧,那时候我正在机场候机,距离登记还有大概一个小时,心想时间肯定够了。
那是我时隔一年多第一次面试,还是在机场这样嘈杂的环境里。多多少少还是有些紧张。
一面 以下是我印象比较深刻的内容:
面试官:
谈谈你做过项目中印象较深或自认为做的比较好的地方?
博主:
我觉得我在 XX 做的不错,用了 XX 需求实现 XX 功能,性能提高了 N 倍。
面试官:
你说使用到了 AOP ,能谈谈它的实现原理嘛?
博主:
它是依靠动态代理实现的,动态代理又分为 JDK 自身的以及 CGLIB 。。。。
面试官:
嗯,能说说他们的不同及优缺点嘛?
博主:
JDK 是基于接口实现,而 CGLIB 继承代理类。。。
就是这样会一直问下去,如果聊的差不多了就开始问一些零散的问题:
JMM 内存模型,如何划分的?分别存储什么内容?线程安全与否?类加载机制,谈到双亲委派模型后会问到哪些违反了双亲委派模型?为什么?为什么要双亲委派?好处是什么?平时怎么使用多线程?有哪些好处?线程池的几个核心参数的意义?线程间通信的方式?HashMap 的原理?当谈到线程不安全时自然引申出 ConcurrentHashMap ,它的实现原理?分库分表如何设计?垂直拆分、水平拆分?业务 ID 的生成规则,有哪些方式?SQL 调优?平时使用数据库有哪些注意点?当一个应用启动缓慢如何优化? 大概是以上这些,当聊到倒数第二个时我已经登机了。最后不得不提前挂断,结束之前告诉我之后会换一个同事和我沟通,听到这样的回复一面应该是过了,
后面也确实证实了这点。
二面 大概过了一周,二面如期而至。
Spring boot 版本为 2.0.2.RELEASE
Spring Cloud 版本为 Finchley.RC2
启动报错信息如下(查看控制台最下面):
2018-06-14 09:09:19.104 INFO 10436 --- [ Thread-16] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ...
2018-06-14 09:09:19.139 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU - registration status: 204
2018-06-14 09:09:19.140 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU: registering service...
2018-06-14 09:09:19.148 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU - registration status: 204
2018-06-14 09:09:19.149 INFO 10436 --- [ Thread-16] com.netflix.discovery.DiscoveryClient : Unregistering .
亚信是来学校招人的,很惊讶,还有什么大公司来我们双非师范类招人【虽然是传统行业,或者可以说外包,但毕竟体量大】
好像是5月吧,太久了,现在只是补充一下面试经历。【3月在线笔试投过,也很简单,但是还是没有收到面试通知,很奇怪,后来问了来学校的hr,他们说部门不同,不清楚。。】
下午2点的时候提前半小时来了教师,【学校的一个特别大的教室】可能名气小,而且师范类吧,来的人估计20几个人左右,
他们很惊讶,【实际上后面有次泛微公司来的时候比这人还少】
一开始当然是企业介绍了,然后问我们谁有带简历,放ppt,说待遇【3000包住宿,有点低,加班到晚上9点才有交通补餐补,一个月100至多的话费补贴,带薪培训一个月】
我是招聘会前台邮箱投递的,所有面试是最快的,第一面的,有两个男的,估计都是做技术的,一个是大数据,一个是java负责人,我面的是java,一共估计20分钟不到吧,一开始先做个自己介绍,看着简历问你的项目用了什么技术,是不是自己做的【后来想想亚信貌似不用springboot难怪项目没有继续问了】,然后就是问什么面向对象,面向过程的区别,封装继承多态等等一些java基础,数据库的#和$等等简单问题,问linux,我说不会,只会基础命令,他就问了vim了解吗?linux怎么关闭进程 ?最后就是手写一个稍微复杂的sql,用了group by 。。 having count 【没想起来他提示我了,后来我想起来了,他说让我过了】,时间过太久了,只记得这些题目了。总之都是比较容易的基础。
感觉好简单,,几天后发了offer,只有一面。。offer是大数据部门的java开发,签了但是跑路了,感觉好对不起面试官,面试官人很好,如果技术不够进大公司,作为实习经验感觉还是可以接受的。
在linux安装完oracle时,当你遇到lsnrctl command not found等问题都不能用时,会有几种情况
1,首先你先查看下环境变量里面有没有加入oracle的配置
执行 echo $ORACLE_HOME 没有的话,你执行
export ORACLE_HOME=<your Oracle Home> . 比如your orcal home是/db/product/11.2.0/dbhome_1
然后再执行
export PATH=$ORACLE_HOME/bin;$PATH
重起profile
source profile
2,当配置完环境变量后,还是不行,可以执行如下操作
cd /
su - root
su - oracle
这样基本上是可以解决了,如果还不行的话,把电脑搬到楼顶,你懂的. source /home/oracle/.bash_profile
原文地址:https://blog.csdn.net/xiangrong530/article/details/7465023
这是个bug。
具体表现为:只能给瑟拉娜没有重量的物品,如箭矢。所有有重量的物品都无法交换给她,而且是灰色的。看起来是超过负重了。
解决方法:
首先启动控制台(按~键,一般在数字1左边),然后用鼠标点一下瑟拉娜,如果屏幕中间的的id的结尾是“2B6C”,则表示已经选中了瑟拉娜。输入命令 showinventory,会显示瑟拉娜身上携带的所有东西,包括:数量(第一个数字),名字,代码等等。
有一个物品是”瑟拉娜的兜帽“,代码是”0200e6a0“。bug时,这个物品的数量会有很多,把负重用完了。那么,解决的话,只要删掉多余的就行了。比如数量是300个,那么用下面的命令:
removeitem 0200E6A0 299
这样就删掉了299个。
当然,全部删除了也可以。瑟拉娜身上有一些缺省物品,包括:盔甲、帽子、靴子。这些即使删掉,只要切换场景就会自动添加回来。
解决方法参考了这个:http://bbs.3dmgame.com/thread-4145257-1-1.html
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。
一. org.apache.commons.io.IOUtils
closeQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块toString:转换IO流、 Uri、 byte[]为Stringcopy:IO流数据复制,从输入流写到输出流中,最大支持2GBtoByteArray:从输入流、URI获取byte[]write:把字节. 字符等写入输出流toInputStream:把字符转换为输入流readLines:从输入流中读取多行数据,返回List<String>copyLarge:同copy,支持2GB以上数据的复制lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部读取,如果数据不够,则失败 二. org.apache.commons.io.FileUtils
deleteDirectory:删除文件夹readFileToString:以字符形式读取文件内容deleteQueitly:删除文件或文件夹且不会抛出异常copyFile:复制文件writeStringToFile:把字符写到目标文件,如果文件不存在,则创建forceMkdir:强制创建文件夹,如果该文件夹父级目录不存在,则创建父级write:把字符写到指定文件中listFiles:列举某个目录下的文件(根据过滤器)copyDirectory:复制文件夹forceDelete:强制删除文件 三. org.apache.commons.lang.StringUtils
isBlank:字符串是否为空 (trim后判断)isEmpty:字符串是否为空 (不trim并判断)equals:字符串是否相等join:合并数组为单一字符串,可传分隔符split:分割字符串EMPTY:返回空字符串trimToNull:trim后为空字符串则转换为nullreplace:替换字符串 四. org.apache.http.util.EntityUtils
toString:把Entity转换为字符串consume:确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容,假如用户没有消费,那调用Entity时候将会把它消费掉toByteArray:把Entity转换为字节流consumeQuietly:和consume一样,但不抛异常getContentCharset:获取内容的编码 五. org.apache.commons.lang3.StringUtils
isBlank:字符串是否为空 (trim后判断)isEmpty:字符串是否为空 (不trim并判断)equals:字符串是否相等join:合并数组为单一字符串,可传分隔符split:分割字符串EMPTY:返回空字符串replace:替换字符串capitalize:首字符大写 六. org.apache.commons.io.FilenameUtils
getExtension:返回文件后缀名getBaseName:返回文件名,不包含后缀名getName:返回文件全名concat:按命令行风格组合文件路径(详见方法注释)removeExtension:删除后缀名normalize:使路径正常化wildcardMatch:匹配通配符seperatorToUnix:路径分隔符改成unix系统格式的,即/getFullPath:获取文件路径,不包括文件名isExtension:检查文件后缀名是不是传入参数(List<String>)中的一个 七. org.springframework.util.StringUtils
hasText:检查字符串中是否包含文本hasLength:检测字符串是否长度大于0isEmpty:检测字符串是否为空(若传入为对象,则判断对象是否为null)commaDelimitedStringToArray:逗号分隔的String转换为数组collectionToDelimitedString:把集合转为CSV格式字符串replace 替换字符串delimitedListToStringArray:相当于splituncapitalize:首字母小写collectionToDelimitedCommaString:把集合转为CSV格式字符串tokenizeToStringArray:和split基本一样,但能自动去掉空白的单词 八. org.apache.commons.lang.ArrayUtils
contains:是否包含某字符串addAll:添加整个数组clone:克隆一个数组isEmpty:是否空数组add:向数组添加元素subarray:截取数组indexOf:查找某个元素的下标isEquals:比较数组是否相等toObject:基础类型数据数组转换为对应的Object数组 九. org.apache.commons.lang.StringEscapeUtils
参考十五:org.apache.commons.lang3.StringEscapeUtils 十. org.apache.http.client.utils.URLEncodedUtils
format:格式化参数,返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串parse:把String或者URI等转换为List<NameValuePair> 十一. org.apache.commons.codec.digest.DigestUtils
md5Hex:MD5加密,返回32位字符串sha1Hex:SHA-1加密sha256Hex:SHA-256加密sha512Hex:SHA-512加密md5:MD5加密,返回16位字符串 十二. org.apache.commons.collections.CollectionUtils
isEmpty:是否为空select:根据条件筛选集合元素transform:根据指定方法处理集合元素,类似List的map()filter:过滤元素,雷瑟List的filter()find:基本和select一样collect:和transform 差不多一样,但是返回新数组forAllDo:调用每个元素的指定方法isEqualCollection:判断两个集合是否一致 十三. org.apache.commons.lang3.ArrayUtils
contains:是否包含某个字符串addAll:添加整个数组clone:克隆一个数组isEmpty:是否空数组add:向数组添加元素subarray:截取数组indexOf:查找某个元素的下标isEquals:比较数组是否相等toObject:基础类型数据数组转换为对应的Object数组 十四. org.apache.commons.beanutils.PropertyUtils
getProperty:获取对象属性值setProperty:设置对象属性值getPropertyDiscriptor:获取属性描述器isReadable:检查属性是否可访问copyProperties:复制属性值,从一个对象到另一个对象getPropertyDiscriptors:获取所有属性描述器isWriteable:检查属性是否可写getPropertyType:获取对象属性类型 十五. org.apache.commons.lang3.StringEscapeUtils
unescapeHtml4:转义htmlescapeHtml4:反转义htmlescapeXml:转义xmlunescapeXml:反转义xmlescapeJava:转义unicode编码escapeEcmaScript:转义EcmaScript字符unescapeJava:反转义unicode编码escapeJson:转义json字符escapeXml10:转义Xml10这个现在已经废弃了,建议使用commons-text包里面的方法。 十六. org.apache.commons.beanutils.BeanUtils
copyPeoperties:复制属性值,从一个对象到另一个对象getProperty:获取对象属性值setProperty:设置对象属性值populate:根据Map给属性复制copyPeoperty:复制单个值,从一个对象到另一个对象cloneBean:克隆bean实例 现在你只要了解了以上16种最流行的工具类方法,你就不必要再自己写工具类了,不必重复造轮子。大部分工具类方法通过其名字就能明白其用途,如果不清楚的,可以看下别人是怎么用的,或者去网上查询其用法。
另外,工具类,根据阿里开发手册,包名如果要使用util不能带s,工具类命名为XxxUtils。
1. 下载 下载地址为:https://packages.gitlab.com/gitlab/gitlab-ce
下载需要版本:gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm
Linux系统:CentOS7
2. 配置必要的依赖关系 1). 防火墙打开HTTP和SSH访问 sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent--add-service=http
sudo systemctl reload firewalld
2). 安装Postfix来发送通知邮件 如果您想使用另一个解决方案发送电子邮件,请跳过这一步,并在安装GitLab之后配置一个外部SMTP服务器。
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
3). 其他linux发行版配置参考gitlab官网:https://about.gitlab.com/installation/ 3. 安装 [liuyh@bogon ~]$ sudo rpm -i gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm
4. 配置域名访问 为使用户可以正确的获取到GitLab上显示的当前仓库的clone地址,GitLab需要你设置好哪个url才是用户可以访问到GitLab, 比如http://192.168.153.131:28080。你需要编辑下面这个文件/etc/gitlab/gitlab.rb
external_url "http://192.168.153.131:28080"
运行 sudo gitlab-ctl reconfigure 使修改生效。
gitlab其他配置参考gitlab中文文档:https://docs.gitlab.com.cn/omnibus/
5. gitlab的使用 1).
NumPy中可以通过median函数计算中位数;通过var函数计算方差。方差是指各个数据与所有数据算术平均数的离差平方和除以数据个数所得到的值。
计算中位数和方差实例: #NumPy常用函数:计算中位数和方差 from numpy import * #1,2,3,4,5 a = array([4,5,2,3,1]) print(median(a)) price=loadtxt('data.csv',delimiter=',',usecols=(6,),unpack=True) print(price) print(median(price)) #验证刚才求的中位数是否正确 #1、将数组进行排序 sorted = msort(price) print(sorted) #2、计算数组的元素个数 n = len(sorted) print(n) #print('middle', '=', sorted[n - 1]//2) #n为奇数 print('middle', '=', (sorted[n // 2] + sorted[(n - 1) // 2]) / 2) #n为偶数 #方差:假设数组元素的算数平均数是a,元素个数是n,x1、x2、x3...xn #((x1 - a)^2 + (x2 - a)^2 + (x3 - a)^2 ... + (xn - a)^2) / n print('方差:', var(price)) 输出结果:
3.0 [ 336.
1.先来一个demo
public static void main(String[] args) { Map<String, String> map1 = new HashMap<String, String>(){{ put("1", "a"); put("2", "b"); put("3", "c"); }}; Map<String, String> map2 = new HashMap<String, String>(){{ put("test1", "张三"); put("test2", "李四"); put("test3", "王五"); }}; Map<String, String> resultMap = new HashMap<String, String>(){{ putAll(map1); putAll(map2); }}; System.out.println(resultMap); } 2.下面将以上操作改写成工具方法
import java.util.Map; public class MapUtil { /** * 合并多个map * @param maps * @param <K> * @param <V> * @return * @throws Exception */ public static <K, V> Map mergeMaps(Map<K, V>.
可以利用tolist函数将Numpy中的数组转换为Python中的列表,还可以用astype指定转换数组的数据类型。
from numpy import * #tolist astype a = array([1,2,3,4,5,6]) print(a) print(a.tolist()) #将numpy中的数组转换为python中的列表 print("-----------------------1111--------------------------") b = a.reshape(2,3) print(b) print(b.tolist()) print("-----------------------2222--------------------------") a = array([1,2,3,4,5,'6']) print(a.astype(int)) #astype 能够指定数据类型 print("-----------------------3333--------------------------") a = array([1,2,3,4,5,'x']) #print(a.astype(int)) #因为数组a中有字符串x,不能转换为int型,所以会抛出异常 输出结果:
[1 2 3 4 5 6] [1, 2, 3, 4, 5, 6] -----------------------1111-------------------------- [[1 2 3] [4 5 6]] [[1, 2, 3], [4, 5, 6]] -----------------------2222-------------------------- [1 2 3 4 5 6] -----------------------3333--------------------------
小引 很多网站都有给用户发 email 的设置,很常规的一个目的是解决 authentication 相关的问题。本节将添加 email support,基于此添加 password reset feature。当 user 忘掉 password 时,可以选择 reset,app 据此会给 user 发送一封带有 crafted link 的 email,user 点击链接,转到 reset 页面,进行 reset。 Introduction to Flask-Mail 1、引入两个 extension,分别是 Flask-Mail 和 pyjwt。
Flask-Mail, 用于发送邮件pyjwt, JSON Web Tokens 的一个package,用于生成 secure token,此 token 将被添加到邮件中的 password reset link 中 (venv) $ pip install flask-mail (venv) $ pip install pyjwt
2、配置 Flask-Mail
和其他 Flask extensions 一样,需要在 flask application instance 后,创建对应的 instance: app/__init__.
Qt的PushButton的常用的三种响应有pressed,released和clicked。
优先级:pressed>released>clicked
按下按钮pressed函数的内容,释放按钮先执行released函数的内容,再执行clicked函数的内容。
当鼠标光标在按钮上时,鼠标左键被按下时,pressed()被发送;当鼠标左键被释放时,released()被发送;
当按钮首先被按下然后又被释放或者快捷键被按下,或者当animateClick()被调用时,clicked()被发送。
转载于:https://www.cnblogs.com/pupilLZT/p/9190926.html
1、Teamvier使用过程中不建议使用账号登录,关联多个电脑,容易被认定为商业用途,在家连公司电脑也算商业用途,所以不用登录teamvier账号,设置轻松访问密码,记住分配的ID即可。
2、已经被认定为商业用途的限制只能使用5分钟即强制断开,解决方案为卸载teamvier,修改网卡Mac地址,然后重装teamvier,即可重新获得分配的新ID。之后正常使用即可。
3、操作步骤:
桌面网络右键属性,如图:
更改适配器设置,如图:
本地连接右键属性,如图:
网路->配置,如图
高级->网络地址->值,如图:
值为Mac地址,在cmd里ipconfig /all之后可查看原Mac地址,如图:
但是值中填写的需要去掉-,然后修改之后保存即可。
VS2017配置QT5.9 1. 首先需要电脑你电脑上正确安装VS+QT
2. 目前VS2017已经内置支持QT了,
步骤 a.点击工具-->拓展和更新-->联机-->搜索QT-->选择Qt Visual studio tools 下载完关闭VS,插件会自动安装。
关闭重启VS2017
B.再次打开会多出这么一个选项
会弹出这么一个界面,第一次安装应该都是空的,需要自己添加
点击Add按钮
选择这个文件夹。
选择刚才添加的那个,现在我们已经基本配置完毕了。
接下来是运行时需要注意的了。
1.我们随意打开一个pro工程
然后构建发现报了这么多错误,这是因为vs2017包含头文件不是
#Include <stdio.h>
而是
#include<stdio>
Using namespace std;
解决方法:
“包含目录” 添加:C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt
“库目录” 添加:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x64 然后点击保存;
然后我们发现刚才的那些数据错误都消失了,但是出现了一个新的错误
解决方法:
右击项目名称,然后点击重定向项目。
直接点确定就好。
完美,没有错误了。
运行一下。
此时我们会遇到这么一个问题,就是我们的debug打印的日志在哪里显示呢?
解决方法:
我们再运行一下
当然打开新建项目,我们也可以创建QT项目了。
接下来我们可以很好的运用我们vs的调试器等功能了。
代码如下:
hello.go文件
package main import "fmt" func hello() { fmt.Print("go =======") } main.go文件
package main func main() { hello() } 编译过程报错:
# command-line-arguments
test\main.go:10:3: undefined: hello
Process finished with exit code 2
出现这样的原因是hello.go文件并未编译
解决方式大致有两种
第一个:通过go命令编译,go run *.go 或 (go bulid . ,. run) 第二个 :通过单元测试调用函数
小引 社交网往往有相互关注的特性,本节即添加“Followers”特性。 重点是调整 db,使之能够追踪 who is following whom。
Database Relationships Revisited 理想的情况是,对每个 user 都能维护一个 list,里面包括它的两类 users (即 followers 和 followed),但 Relational Database 没有这种 list 类型。Database 只储存 users 的表,所以须找到一种 relationship 类型,能够表征(model) User 的 followers / followed 之间的 link。 Representing Followers Relationship Many-to-Many: followers - followed Self-referential: followers & followed belong to the same class User. Association Table: followers followers 表中,只存储了两类 ForeignKey,都指向 User 。 Database Model Representation 1、创建辅助表 followers
app / models.
Grub2菜单背景 红帽企业版 Linux 7 的引导装载程序是“GRUB 2”。您可以更改“GRUB 2”外观的几个部分。以下几小节将向您展示如何改变 Linux 发行版名称、菜单颜色,和背景图片。
10.3.1. 发行版名称 默认情况下,“GRUB 2”显示含有发行版名称的标题。您可以通过自定义 /etc/default/grub 文件中的 GRUB_DISTRIBUTOR 变量,从而更改标题。
过程 10.3. 设置发行版名称
以 root 身份,打开 /etc/default/grub 文件。 使用 GRUB_DISTRIBUTOR 变量,来指定您自己的发行版名称。以下是 /etc/default/grub 文件的摘录。使用 GRUB_DISTRIBUTOR 变量来更新第二行: GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=Our Corporate Distro V1.2 GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true ... 3.以 root 身份运行以下命令,以确定更改生效:
grub2-mkconfig -o /boot/grub2/grub.cfg 注意
您需要在每次做更改后更新 /etc/default/grub 目录。 同时,您可以通过更改 /etc/grub.d/40_custom 纯文字档,或者通过在 /etc/grub.d/ 目录中添加其他文件,来改变“ GRUB 2”屏幕中显示的文本颜色或字体。您可以从以下指令中选择: set color_normal=foreground/background set color_highlight=foreground/background set menu_color_normal=foreground/background set menu_color_highlight=foreground/background 10.3.2. GRUB 2 背景 在默认设置中并没有配置“ GRUB”背景。然而,您依然可以添加图片到引导程序屏幕。 在您为“ GRUB 2”配置背景图片前,必须为“ gfxterm” 图形终端安装一个“ GRUB 2”Unicode 字体。因为没有默认提供的字体,所以前提是将现有的 TTF 或者 OTF 文件转换成“ GRUB 2”使用的 PF2 格式: 通过运行 grub2-mkfont 命令,来将现有的 TTF 或者 OTF 文件转换成 PF2 格式。为输出文件 unicode.
要一张图片接着一张图片的写,中间不能有换行。如果换行的话则图片也换行 正确的写法:
 实例: 错误的写法:换行
   实例: 居中并排: 正确写法:注意两个<img>之间不要换行,如果图片太大的的话可以设置图片的宽度或者高度,这样图片就会缩放。注意不要同时设置宽度和高度,这样的话不好把握宽度和高度的比例,可能会是图像变形。
<center class="half"> <img src="图片链接" width="200"/><img src="图片链接" width="200"/><img src="图片链接" width="200"/> </center> 实例:
<center class="half"> <img src="https://img-blog.csdn.net/2018061215200776?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/><img src="https://img-blog.csdn.net/20180612152032532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/><img src="https://img-blog.csdn.net/20180612152100203?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/> </center> 显示结果: 左对齐并排: 还是注意所有的<img>标签写在一行中不要换行。
<figure class="third"> <img src="https://img-blog.csdn.net/2018061215200776?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/><img src="https://img-blog.csdn.net/20180612152032532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/><img src="https://img-blog.csdn.net/20180612152100203?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" width="200"/> </figure> 显示效果: 参考博客: (https://blog.csdn.net/WMN7Q/article/details/73138326
问题描述:
在项目开发的过程中,使用Hibernate的ORM进行建表时,出现 “ Could not retrieve transation read-only status server ”的异常,无法进行表的创建的操作,具体异常内容如下:
org.activiti.engine.ActivitiException: couldn't create db schema: create table ACT_GE_PROPERTY ( NAME_ varchar(64), VALUE_ varchar(300), REV_ integer, primary key (NAME_) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin
at org.activiti.engine.impl.db.DbSqlSession.executeSchemaResource(DbSqlSession.java:1242)
at org.activiti.engine.impl.db.DbSqlSession.executeSchemaResource(DbSqlSession.java:1138)
at org.activiti.engine.impl.db.DbSqlSession.executeMandatorySchemaResource(DbSqlSession.java:897)
at org.activiti.engine.impl.db.DbSqlSession.dbSchemaCreateEngine(DbSqlSession.java:874)
at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:952)
at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1318)
at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:28)
at org.activiti.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:37)
at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)
at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)
at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:35)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44)
at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:81)
at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:665)
针对之前的php+apache安装,未进行ini的设置,普通使用并无问题,但一些函数方法需要进行拓展才可使用,故需要进行php.ini配置 1.要配置php.ini。 首先打开php目录,复制1个php.ini-development ,修改为php.ini。
打开php.ini, 找到 ;extension_dir = "ext" ,把前面的分号去掉,或者复制一份,在复制的基础上修改,这里修改如下
2.解锁需要使用的插件,例如这里我们打开mbstring,打开后才可使用mb_strlen()等功能。
3.在apache中加入php.ini的路径
至此,我们就配置完毕了,别忘了重启apache才能生效哦,重启后用phpinfo(),就能看到mbstring这扩展了
一.合并多个PDF文件 实例: #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍历该目录下的所有文件 for filename in os.listdir("C:\Python27\第二十八课 数据处理"): #如果是以.pdf结尾的文件,则追加到数组中 if filename.endswith(".pdf"): files.append(filename) #以数字进行排序(数组中的排列顺序默认是以ASCII码排序,当以数字进行排序时会不成功) newfiles = sorted(files,key=lambda d: int(d.split(".pdf")[0])) #进入该目录 os.chdir("C:\Python27\第二十八课 数据处理")#生成一个空白的PDF文件 pdfwriter = PyPDF2.PdfFileWriter() for item in newfiles: ##以只读方式依次打开pdf文件 pdfreader = PyPDF2.PdfFileReader(open(item,"rb")) for page in range(pdfreader.numPages): # #将打开的pdf文件内容一页一页的复制到新建的空白pdf里 pdfwriter.addPage(pdfreader.getPage(page)) #生成all.pdf文件 with codecs.open("all.pdf","wb") as f: #将复制的内容全部写入all.pdf文件中 pdfwriter.write(f) 二.图片处理 图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,如果你是python2.x,可以通过以下地址进行下载:http://www.pythonware.com/products/pil/index.htm,找到相对应的版本进行下载就可以了。
注意:PIL模块在python3.x中已经替换成pillow模块,直接使用pip3 install pillow即可安装模块,导入时使用from PIL import Image
从数据库到本地: pg_dump 数据库_name -U 用户_name -t 表_name -f 输出.sql
从本地到另一数据库: psql -h ip地址 -d 数据库_name -U 用户_name -password -f 输入.sql
数据表 test_table,目前有字段id,name,想增加sex字段
sql语句:
ALTER TABLE `test_table` ADD COLUMN `sex` tinyint(2) NOT NULL DEFAULT 0 AFTER `name`; 设置默认值的时候一定要注意新增加字段的类型,否则会出错
【PHP】配置PHP7+Apache2.4 环境 首先讲一下电脑环境与版本: 电脑:window10-X64 Apache: httpd-2.4.33-o102o-x64-vc14-r2.zip (官网下载http://www.apachelounge.com/download/)
PHP: php-7.2.6-Win32-VC15-x64.zip) (官网下载https://windows.php.net/download/)
电脑32位系统的请下载X84的。
两个版本都为免装版,解压即可,为了方便管理,我们在C盘根目录建立Develop文件夹,将apache和php都解压到此处,如图:
故本次安装路径如下:
C:\Develop\Apache24
C:\Develop\Php
D:\www (存放php网站脚本的目录,DocumentRoot.)
好了,资源准备就绪,可以开始安装了。
首先配置Apache
1.以管理员身份运行cmd----进入安装目录的bin文件夹(cd C:\Develop\Apache24\bin)
2.# 安装 Apache 服务,‐n 参数是指定服务名称
httpd.exe ‐k install ‐n "Apache"
# 如果需要卸载 Apache,可以执行以下命令
httpd.exe ‐k uninstall ‐n "Apache"
执行安装命令过后会报一个错,原因是默认的配置文件有问题,需要先调整一下配置文件 conf/httpd.conf ,才能
正常启动服务。
找到 Apache 解压目录中的 conf 目录下的 httpd.conf 文件,定位到 37 行,将 c:/Apache24 改为解压目录,我这
里解压到路径是 C:/Develop/Apache24 ,(http.conf文件中路径都为反斜杠/,而不是\)所以我这里修改
修改完以后,执行以下命令重新测试配置文件是否通过。
这里任然报错:
通过错误信息得知,这里是因为另外一个地方配置的目录不存在导致的,所以接着调整 248 行的 DocumentRoot
选项:
默认 Apache 的网站根目录是安装目录中的 htdocs 文件夹,为了方便对网站文件的管理,一般我们会将其设置在
维数灾难 高维数据 何谓高维数据?高维数据指数据的维度很高,甚至远大于样本量的个数。高维数据的明显的表现是:在空间中数据是非常稀疏的,与空间的维数相比样本量总是显得非常少。 在分析高维数据过程中碰到最大的问题就是维数的膨胀,也就是通常所说的“维数灾难”问题。研究表明,随着维数的增长,分析所需的空间样本数会呈指数增长。 如下所示,当数据空间维度由1增加为3,最明显的变化是其所需样本增加;换言之,当样本量确定时,样本密度将会降低,从而样本呈稀疏状态。假设样本量n=12,单个维度宽度为3,那在一维空间下,样本密度为12/3=4,在二维空间下,样本分布空间大小为3*3,则样本密度为12/9=1.33,在三维空间下样本密度为12/27=0.44。 设想一下,当数据空间为更高维时,X=[ x1 x 1 , x2 x 2 ,…., xn x n ]会怎么样? 需要更多的样本,样本随着数据维度的增加呈指数型增长;数据变得更稀疏,导致数据灾难;在高维数据空间,预测将变得不再容易;导致模型过拟合。 维数灾难在分类问题中的体现 具体例子可以参考 机器学习:分类问题中的“维数灾难”
数据降维 对于高维数据,维数灾难所带来的过拟合问题,其解决思路是:1)增加样本量;2)减少样本特征,而对于现实情况,会存在所能获取到的样本数据量有限的情况,甚至远小于数据维度,即:d>>n。如证券市场交易数据、多媒体图形图像视频数据、航天航空采集数据、生物特征数据等。 主成分分析作为一种数据降维方法,其出发点是通过整合原本的单一变量来得到一组新的综合变量,综合变量所代表的意义丰富且变量间互不相关,综合变量包含了原变量大部分的信息,这些综合变量称为主成分。主成分分析是在保留所有原变量的基础上,通过原变量的线性组合得到主成分,选取少数主成分就可保留原变量的绝大部分信息,这样就可用这几个主成分来代替原变量,从而达到降维的目的。
但是,主成分分析法只适用于数据空间维度小于样本量的情况,当数据空间维度很高时,将不再适用。
Lasso是另一种数据降维方法,该方法不仅适用于线性情况,也适用于非线性情况。Lasso是基于惩罚方法对样本数据进行变量选择,通过对原本的系数进行压缩,将原本很小的系数直接压缩至0,从而将这部分系数所对应的变量视为非显著性变量,将不显著的变量直接舍弃。
Lasso回归 普通线性模型 惩罚方法 Lasso方法 Ridge方法 图形比较 以二维数据空间为例,说明lasso和Ridge两种方法的差异,左图对应于Lasso方法,右图对应于Ridge方法。 如上图所示,两个图是对应于两种方法的等高线与约束域。红色的椭圆代表的是随着 λ λ 的变化所得到的残差平方和, βˆ β ^ 为椭圆的中心点,为对应普通线性模型的最小二乘估计。左右两个图的区别在于约束域,即对应的蓝色区域。 等高线和约束域的切点就是目标函数的最优解,Ridge方法对应的约束域是圆,其切点只会存在于圆周上,不会与坐标轴相切,则在任一维度上的取值都不为0,因此没有稀疏;对于Lasso方法,其约束域是正方形,会存在与坐标轴的切点,使得部分维度特征权重为0,因此很容易产生稀疏的结果。 所以,Lasso方法可以达到变量选择的效果,将不显著的变量系数压缩至0,而Ridge方法虽然也对原本的系数进行了一定程度的压缩,但是任一系数都不会压缩至0,最终模型保留了所有的变量。
代码块 #加载模块 import numpy as np import matplotlib.pyplot as plt import time from sklearn.linear_model import Lasso from sklearn.metrics import r2_score from sklearn.linear_model import LassoCV from sklearn.
明天就是嵌入式大赛的预选赛了,今晚加班写个博客 1、安装环境
下载了官方的安装包之后,官方给出了详细的安装说明,下载请看百度网盘地址: 链接:https://pan.baidu.com/s/1ngYQK3c2P1e367SFC3Q__A 密码:dwud
1.1、首先安装VSDP,具体的文件名为:
vspdxp_install.exe 1.2、配置虚拟串口 运行
vspdconfig.exe 在弹出来的软件页面中选择
COM5 COM6 这两个串口 1.3、安装ETest软件
ETest2018大赛专版-Setup.exe 1.4、运行Etest软件-进程调度服务 1.5、运行测试设计台 1.6、打开给定的测试项目文件 1.7、在“设备规划”上点击右键,选择“编辑”,打开设备规划 1.8、.选中“物理通道”下面的“232”,打开“属性”标签页,选择“端口名”为一对虚拟串口 中的一个 1.9、运行被测软件,启动服务,选择端口号 1.10、打开测试项目中的测试“功能 2” 1.11、首先进行“环境设置” 1.12、点击“运行” 1.13、使用对话框判断测试结果 1.14、查看界面输出结果
2、例题一 题目分享:链接:https://pan.baidu.com/s/1uPS_y3bo_OLRc0FFZqpvkw 密码:rsjg
题目由一个需求文档和测试要求给出,这是关于模拟水流监控计费器的题目 2.1、定义协议: 如仿真图所示,这里定义了Protocol_1和Protocol_2以及CH_232_1三种自定义通信类型。具体的实现如下
//协议Protocol_1 Protocol Main Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big Segment 阀门控制器ID StandardUInt8 Default=0 Segment 水流监控计费器ID StandardUInt8 Default=0X20 Segment 瞬时流量 StandardFloat Default=0.0 Segment 计费标志 StandardUInt8 Default=0 Segment 管道压力 StandardFloat Default=0.0 Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=16 Range=(16,0) Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big End //协议Protocol_2 Protocol Main Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big Segment 水流监控计费器ID StandardUInt8 Default=0X20 Segment 阀门控制器ID StandardUInt8 Default=0 Segment 瞬时流量报警标志 StandardUInt8 Default=0 Segment 管道压力控制指令 StandardUInt8 Default=0 Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=8 Range=(16,0) Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big End //协议CH_232_1似乎是系统定义的 遇到了一个报错 提示我协议没有定义,但是实际上协议是定义了的,只不过这两个东西没有嵌入起来 3、例题二 题目分享:链接:https://pan.
参考网站
STM32中单独设置GPIO端口高8位/低8位的方法
操作STM32的IO可以使用库函数,但这样一次只能操作一位IO,对于需要同时操作8位IO,如使用无符号八位数由按键控制递增或递减控制8个开关的情况,则必须使用位带操作。常用的方法是使用GPIOx->ODR=0xXXXX;的方法。但如果高八位IO已被占用,如用作输入,那么这个寄存器操作会直接导致输入失效。为此,使用BSRR寄存器操作来实现只对低八位IO的操作。
代码如下
#define GPIO_WriteLow(GPIOx,a) GPIOx->BSRR=(((uint32_t)(uint8_t)~(a))<<16)|((uint32_t)(uint8_t)(a)) #define GPIO_WriteHigh(GPIOx,a) GPIOx->BSRR=(((uint8_t)(uint8_t)~(a))<<24)|(((uint32_t)(uint8_t)(a))<<8) 对低位操作由参考网站BSRR寄存器图可以看到,BSRR高16位为复位,第十六位为置位,这样,程序就很好理解。(uint8_t)~(a)为对a取反,<<16表示左移十六位至BSRR高16位,(uint32_t)表示BSRR为32位寄存器。(uint32_t)(uint8_t)(a)为BSRR低16位寄存器操作,两者取或,就是对高16位的清零和低16位的置位进行操作,影响低八位的同时不影响高八位。对高八位操作同理,只是将a左移至高八位。
参考链接:https://zhidao.baidu.com/question/402775303.html
直流隔离电源就是输出某个电压值的一个电源,输入端和输出端是隔离的。1、在一些实验室或高要求场合,为了实验人员的安全,一般将实验的输入电源采用1:1的工频变压器与市电进行隔离,这样一来,实验室实验人员无论碰到线路的哪一根线都不会有触电的危险,因为隔离电源与大地是没有连接的。2、在工业控制设备中,有时候要求两个系统之间的电源地线隔离,如隔离地线噪声、隔离高共模电压等,采用带变压器的直流变换器,将两个电源之间隔开,使他们相互独立,从而实现以上目的。3、每个模块单独供电,防止一个模块因受高压放电或其他原因导致损坏后殃及其他模块。这样做的目的可以保证每个模块独立工作,不受干扰。 原文链接:http://www.elecfans.com/dianyuan/540962.html
一、电源隔离与非隔离的概念
电源的隔离与非隔离,主要是针对开关电源而言,业内比较通用的看法是:
1、隔离电源:电源的输入回路和输出回路之间没有直接的电气连接,输入和输出之间是绝缘的高阻态,没有电流回路。
2、非隔离电源:输入和输出之间有直接的电流回路,例如,输入和输出之间是共地的。
隔离电源示意图如图所示。
二、隔离电源与非隔离电源的优缺点
由上述概念可知,对于常用的电源拓扑而言,非隔离电源主要有:Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。
结合常用的隔离与非隔离电源,我们从直观上就可得出它们的一些优缺点,两者的优缺点几乎是相反的。
使用隔离或非隔离的电源,需了解实际项目对电源的需求是怎样的,但在此之前,可了解下隔离和非隔离电源的主要差别:
1、隔离模块的可靠性高,但成本高,效率差点。
2、非隔离模块的结构很简单,成本低,效率高,安全性能差。
因此,在如下几个场合,建议用隔离电源:
1、涉及可能触电的场合,如从电网取电,转成低压直流的场合,需用隔离的AC-DC电源;
2、串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据,这些相互连接的系统每个都配备有自己的电源,而且各系统之间往往间隔较远,因此,我们通常需要隔离电源进行电气隔离来确保系统的物理安全,且通过隔离切断接地回路,来保护系统免受瞬态高电压冲击,同时减少信号失真;
3、对外的I/O端口,为保证系统的可靠运行,也建议对I/O端口做电源隔离。
三、隔离与非隔离电源的应用场合
通过了解隔离与非隔离电源的优缺点可知,它们各有优势,对于一些常用的嵌入式供电选择,我们已可做成准确的判断:
1、系统前级的电源,为提高抗干扰性能,保证可靠性,一般用隔离电源。
2、电路板内的IC或部分电路供电,从性价比和体积出发,优先选用非隔离的方案。
3、对安全有要求的场合,如需接市电的AC-DC,或医疗用的电源,为保证人身的安全,必须用隔离电源,有些场合还必须用加强隔离的电源。
4、 对于远程工业通信的供电,为有效降低地电势差和导线耦合干扰的影响,一般用隔离电源为每个通信节点单独供电。
5、 对于采用电池供电,对续航力要求严苛的场合,采用非隔离供电。
Node.js Redis 基本功能:
缓存系统数据存储消息中介 基本工具
服务启动工具命令行GUI PS:在之前,需要安装redis对Nodejs的支持
https://redis.io/clients#nodejs
$ npm install redis 连接redis代码
var redis = require('redis'); var client = redis.createClient(6379,'localhost'); client.set('hello','This is a value'); 代码改造一下,利用程序获取redis中的值
var redis = require('redis'); var client = redis.createClient(6379,'localhost'); client.set('hello','This is a value'); client.get('hello',function (err,v) { console.log("redis get hello err,v",err,v); }) 其输出结果
假设我们把存储对象改成JSON对象,将会发生什么样的结果呢?
var redis = require('redis'); var client = redis.createClient(6379,'localhost'); client.set('hello',{name:"jacky",age:22}); client.get('hello',function (err,v) { console.log("redis get hello err,v",err,v); }) 程序将会报错,因为redis中存储的是字符串对象
我们需要重写toString方法
Object.prototype.toString = function(){ return JSON.
在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数类型即可。parameterType有基本数据类型和复杂的数据类型配置。
1. MyBatis的传入参数parameterType类型分两种 1. 1. 基本数据类型:int、string、long、Date; 1. 2. 复杂数据类型:类(JavaBean、Integer等)和Map
2. 如何获取参数中的值: 2.1 基本数据类型:#{参数} 获取参数中的值 2.2 复杂数据类型:#{属性名} ,map中则是#{key}
3.案例: 3.1 传入Long型
mapper接口代码:
public User findUserById(Long id); xml代码:
<select id="findUserById" parameterType="java.lang.Long" resultType="User"> select * from user where id = #{id}; </select> 3.2 传入List
mapper接口代码:
public List<User> findUserListByIdList(List<Long> idList); xml代码:
<select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User"> select * from user user <where> user.ID in ( <foreach collection="list" item="id" index="index" separator=","> #{id} </foreach> ) </where> </select> 在使用foreach的时候最关键的也是最容易出错的就是collection属性。
命令
:e
第一种方法: 打勾表示在启动的时候可以选择自己默认的工作空间路径。
然后我们重启eclipse,可以看到如下
这样就可以修改默认工作空间的目录啦。
第二种方法: 首先,关闭Eclipse并打开eclipse的安装目录,依次打开以下目录,configuration\.settings
文件夹下有一个文件 org.eclipse.ui.ide.prefs, 用记事本打开,里面的内容格式如下:
修改上面红色方框内的路径即可,然后保存,重启eclipse即可。
路由选择算法 1、路由算法概述
路由算法(协议)确定去往目的网络的最佳路径
转发表确定在本路由器如何转发分组。
网络抽象:图
图:G=(N,E)
N=路由器集合,E=链路集合
关键问题:源到目的的最小费用路径是什么?
路由算法:寻找最小费用路径的算法。
2、路由算法分类
分类方式一:
静态路由:手工配置、路由更新慢、优先级高
动态路由:路由更新快(定期更新、及时响应链路费用或网络拓扑变化)
分类方式二:
全局式路由选择算法:所有路由器掌握完整的网络拓扑和链路费用信息。例如链路状态算法(LS,Link State)。
分散式路由选择算法:路由器值掌握物理相连的邻居以及链路费用,邻居间信息交换、运算的迭代过程。例如距离向量算法(DV,Distance-Vector)。
3、链路状态路由算法
Dijkstra算法
所有结点(路由器)掌握网络拓扑和链路费用。
通过链路状态广播。
所有结点拥有相同信息。
计算从一个结点(源)到达所有其他结点的最短路径。
获得该结点的转发表
迭代:K次迭代后得到到达K个目的结点的最短路径。
符号:
c(x,y) 结点x到y的链路费用,不直接相连为记为无穷大
D(v) 从源到目的v的当前路径费用值
p(v) 沿从源到v的当前路径,v的前序结点
N' 已经找到最小费用路径的结点集合
★算法描述:
1 Initialization: 2 N' = {u} 3 for all nodes v 4 if v adjacent to u 5 then D(v) = c(u,v) 6 else D(v) = ∞ 7 8 Loop 9 find w not in N' such that D(w) is a minimum 10 add w to N' 11 update D(v) for all v adjacent to w and not in N' : 12 D(v) = min( D(v), D(w) + c(w,v) ) 13 /* new cost to v is either old cost to v or known 14 shortest path cost to w plus cost from w to v */ 15 until all nodes in N' ★算法复杂性:n个结点
问题:
有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。若区间[si, fi]与区间[sj, fj]不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。若区间[si, fi]与区间[sj, fj]不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。
代码:
#include<iostream> #include<time.h> #include<iomanip> #include<fstream> #include<algorithm> using namespace std; struct a{ int si;//开始时间 int fi;//结束时间 int ii;//编号 }; bool compare(a x,a y){ return x.fi<=y.fi; } int main(){ cout<<"输入活动数:"; int m; cin>>m; a action[m]; for(int i = 0; i < m; i++){ cout<<"输入第"<<i<<"活动的开始时间和结束时间"; cin>>action[i].si>>action[i].fi; action[i].ii = i+1; } int num=1; int b[m]; sort(action,action+m,compare); b[num++]=action[0].ii; int k=0; for(int i=1;i<m;i++){ if(action[i].
package ch2; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Timer extends JFrame implements Runnable{ private JButton start,stop,pause; //三个按钮 private JLabel minisec,minute,second; //三个时间点 private JLabel fen,miao;//两个字 private Font font=new Font("Consolas",Font.BOLD,50);//字体 private Font font2=new Font("宋体",Font.BOLD,35); Container c; private Thread thread=null; Timer(){ init();//初始化 setVisible(true);//窗口可见 setResizable(false);//false窗口固定大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭 } public void init() { this.setTitle("秒表");//设置标题 this.setBounds(400, 200, 500, 300);//窗口大小 c = getContentPane(); c.setLayout(null);//自定义布局 /*开始按钮*/ start=new JButton("开始"); start.setBounds(new Rectangle(50,180,80,30)); c.add(start); start.addActionListener(new ActionListener() {/*添加按钮的事件*/ public void actionPerformed(ActionEvent evt) { start.
同向:vo = vin*(1+Rf/R1)
反向:Vo= -Vin*Rf/R1
1、相位
2、放大比例,同向只能>1,反向可以任意0~无穷
3、输入阻抗:反向=‘-’端的输入电阻R1的大小,比较小
同向 = ‘+’端即放大器的输入阻抗,即无穷大,比较大
4、干扰:反向:放大器‘+’端接地‘-’虚地,所以输入,只存在差模信号,抗干扰性强
同向:放大器‘+’端输入,‘-’端=‘+端’电压,存在共模信号,抗干扰性差
电阻配合:小电阻,可以减小 输入偏置电流的影响和分布电容的影响
大电阻,可以减小功耗
所以取值要适中
有点久了,有些题目想不起来了,简历曾经再网上投过,但是简历没过,后来是由学长内推才得到面试机会的。这还是自己简历不会包装的问题没办法。应聘是岗位是Java岗的实习生。
邦盛是一家做风控,金融,大数据的创业型公司,互联网知名度很低,今年刚刚完成C【pre-c】轮融资,说实话,不是学长在那,我都没听过,甚至不知道自己在拉钩曾经有去海投过。在第一面之前,学长说面试是挺简单的基础,毕竟实习生,但是实际基本是项目和框架。没问我基础。如果非要说基础那就是JVM了。接下来就说说吧。
在面试之前,也就是前一天,HR-A和我说,你的简历我们收到多次,这次有人推荐你,你是认识我们这什么人吗?我说了XXX,我是他的直系学弟,HR-A接着,说了公司对技术实习生有一点要求,还是需要经过技术面试的,然后问了我什么时候有空,我也想快点,所以就定在第二天11点。HR-A人很好,语气很好。因为HR太多,所以用ABC.......
大概在11点10分左右收到电话面试了,比预料的晚了10几分钟,可能HR太忙吧,也能理解,毕竟需要面试的可能很多。
这个HR-B,好像不像一个专业的HR,估计是搞技术的,第一句是说我们随便聊聊。【QAQ】
接下来就是一系列面试题了。
简历是准备的比较早的,只有一个权限系统和个人博客,【还好项目简单,少,不然更GG】
1、你用过SpringBoot,版本是多少?你知道我们公司做什么的吗?你的Shiro权限管理是怎么设计的?对于权限修改后,你是用AOP进行清空权限,具体怎么实现的?你的权限管理支持分布式权限吗?你的权限使用什么缓存?登陆密码次数限制具体怎么实现的?权限分配具体怎么实现的?Ehcache和redis有什么区别或者各有的优缺点?Ehcache缓存在哪里?redis用过哪些技术?redis集群用过吗?你的SpringBoot的多数据具体怎么配置的,说具体代码?怎么指定主副数据源,具体代码?怎么在运行时动态修改数据源,具体代码?你对JVM了解吗?说说你了解的JVM知识?你用过JDK的什么工具?性能调优,内存分析工具?具体怎么用?JVM可以配置哪些参数?Mybatis #和$有什么区别?mybatis怎么实现模糊查询,说具体代码?mysql了解吗?说说有哪些存储引擎?比较一下innodb,myisam?索引了解吗?【但是没继续问索引,我也不懂什么意思】你有什么想问我的吗?可能因为我说话快,仅仅20分钟就结束了。可见难度不大,但是都是需要说具体实现的,包装简历基本没戏,如实写比较可靠,是自己做的项目,则答起来比较容易
第二周的第1天HR-A通知我晚上8点总监面【给他命名HR-S】
我准备找个好地方,下午还复习了一下innodb,jvm,线程,这些基础,因为一面问的少嘛。
我早早的来了图书馆,终于到时间了,HR-A叫我加了HR-S。
这次是微信视频面【本来是要去杭州,报销路费,但是考虑还要请假,且高铁不便宜,最后商量了视频】
HR-S很和蔼,看得出很忙,问我你这是在哪里,我说图书馆,他说你还在学习啊,哈哈哈,我说是怕寝室吵。
基本就算闲聊了会,没任何技术性问题。
同样,1、你来公司想获得什么?你了解我们公司是做什么的吗?【还好我官网一游过】
2、HR-S说了说他们对实习生的要求,反正很快这个面试就完了。7分钟多的样子,看来HR-S是真的太忙了。好像还是边走路边谈的。QAQ
第二天,HR-A告诉我还有终面。。。。
终面HR-C,也谈到了, 你了解我们公司吗?看来这个问题很重要。
这个面试基本就算谈家庭情况了,但是出乎意料的,他还问了一些关于自学,比如遇到新技术怎么学?权限管理设计,github的题外话,很吃惊,不像是终面。不过大体上还是问的,在校的生活,平时学习,成绩,社团,家庭,什么的。这只能看临时说了。没什么好写的。
最后他告诉我,等会有人联系我【因为开始的时候我说了3 点后有课,她刚刚好把时间把握到3点,很厉害QAQ】。
第三天的下午,收到HR-D的电话,这个HR其实就是说公司福利待遇之类的,没什么好说的了。
【HR-D给我发OFFER的时候发错了到岗时间,很迷】
面试下来感觉不错,人都很客气,全程和HR-A联系,A负责通知我结果和面试时间,只有确定我有空他才会发起面试邀请邮件,感觉很好。
PS:HR-A HR-C HR-D都是小姐姐。HR-B是大哥哥 HR-S是大叔【hhhh】
总结,双非尽量找人内推,不然面试机会都没,没面试就没成长。尽量给自己保底offer,不然心态可能会成为问题。
经常用电脑的同志肯定遇到过:一开机,发现右下角网络图标有个×号,wifi信号也搜不到;或者其他wifi信号能搜到,唯独自家的搜不到,是不是感觉很绝望啊,居然被wifi欺负到身上了,这也太憋屈了吧。
此时你要淡定,如果不是路由器发生故障或者路由器隐藏了wifi信号,一般都能搜到信号的,就算被路由器拉黑,也是有信号的。其他的不BB了,下面直接切入正题。按照下面的逻辑肯定能解决问题的,哈哈......
Situation One: 我们先说说路由器搜不到信号大概的几个原因,首先我们得先检查wifi功能是否打开了,有些本本存在wifi的物理开关,如果物理开关被关了,那搜不到信号是必然,也就别瞎功夫找逻辑配置问题了。应该到网络共享中心---更改适配器设置---WLAN,看看是不是禁用了无线网卡。
(1)右键点击网络的小图标,点击“打开网络和Internet设置” (2)点击“网络和共享中心”
(3)点击“更改适配器设置” (4)看见了“已被禁用” 这样就可以了,欢呼吧
====================================================================================================
Situation Two: 若显示没有禁用无线网卡,但是搜不到wifi信号。那我们先要去检查设备管理器,看看无线网卡驱动是否正常,一般驱动异常,会有黄色感叹号。特别注意,win10系统有个飞行模式,关闭了,也会导致wifi功能关闭。
(1)右键最左边的windows窗口,选择“设备管理器”
(2)查看无线网卡驱动是否异常
若是由驱动异常引起的搜不到wifi信号,可以通过重装无线网卡驱动解决。若不知道电脑型号,可以利用其他电脑下载一个通用版的无线网卡驱动,先让笔记本连接上网络,再在网上下载鲁大师,识别电脑型号,如果想偷懒的话,可以直接用鲁大师安装驱动,手动能力强的童鞋,可以自己到网上找适应的驱动。或者是下载个驱动精灵自动修复。
如果无线网卡和驱动都没问题,但还无法找到无线网络,就很可能是由于系统服务的原因造成的,可按如下步骤来解决。
==================================================================================
Situation Three: 打开“控制面板”窗口,单击“管理工具”选项,再双击“服务”图标。在“服务”操作右边窗格,右击“WLAN AutoCon fig”服务选项;单击“启动”命令即可。
另一种快捷打开方式: (1)打开cmd命令窗口(按住win+R) (2)输入services.msc,点击“确定”
(3)在“服务”操作右边窗格,右击“WLAN AutoConfig”服务选项;单击“启动”命令即可。
有时候,当我们连接无线时,一直提示正在连接情况,这是因为在路由器中关闭了“允许SSID广播”功能造成的。只需要重新进入路由器管理页面开启即可。还有另一种情况,就是一直显示“”正在连接“,但是却可以正常访问网络,这很可能是安装了太多的通信协议引起的。所以,应检查并保持连接属性中仅有基本的协议被安装。
对于那些在使用wifi上网时,频繁掉线的问题,如果常规方法无法解决。可以尝试对路由器的系统版本进行升级,往往可以解决一些奇怪的问题。这时由于实际上,无论何种品牌的路由器都或多或少的存在前期设计过程中留存的技术缺陷,通常来说就是Bug,这使得此类因素导致的故障非常常见。此类问题要从根本上解决就必须得升级路由器固件。
还有一些wifi问题,小编一时半会想不起来,欢迎大家在讨论区提出问题,小编看到了会及时去查找资料解决的。今天的谜题解惑就到这里,下次再见咯!!
转载于:https://www.cnblogs.com/wxxblogs/p/9120458.html
1. 实现网页拨打电话
<a href="tel:12345678901">网页直接拨打电话</a> 2. 实现网页发送短信
<a href="sms:15112345678?body=这里是需要发送的短信的具体内容">网页发送短信</a> PS: 需要注意的是,使用以上的方法,手机浏览器或者支付宝浏览器内可以直接跳转到手机的拨号页面,但是在微信的内置浏览器中是禁止了自动跳转到拨号页面的,会弹出一个提示弹窗,如果想要直接跳转,需要在URL后面添加一段域名:
#mp.weixin.qq.com URL示例:
http://www.xxx.com/index.html#mp.weixin.qq.com
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.3.0</spark.version>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- 编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
扫描二维码后,通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
第一步 确定回调域名,即扫描二维码后你需要跳转的后台URL,例如:
http://myWechatTest.top/myProject/wechat_queueInfo.do?user=abc&pwd=123456
http://myWechatTest.top --> 我的外网域名,类似于localhost:8080 但localhost只有内网才能访问。 myProject --> 我的项目名
第二步 构造URL:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx123456789&redirect_uri=http%3A%2F%2FmyWechatTest.top%2FmyProject%2Fwechat_queueInfo.do%3Fuser%3Dabc%26pwd%3D123456&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect
黑色部分:是腾讯后台的Oauth2.0鉴权接口,是固定写法,appid为微信公众号的appid
红色部分:redirect_url = xxx ; xxx是第一步中的回调域名,不同的是此处进行了编码,也必须要编码,否则第一步中url 带 的参数后台接收不到。编码的方式:在浏览器的开发者模式中的console中输入:encodeURIComponent('你的URL') 回车即可。
蓝色部分:如下参数说明
参数说明
参数是否必须说明appid是公众号的唯一标识redirect_uri是授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理response_type是返回类型,请填写codescope是应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )state否重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节#wechat_redirect是无论直接打开还是做页面302重定向时候,必须带此参数 第三步:将URL生成二维码
可以百度“草料二维码”,可以利用网站生成二维码。
第四步:后台代码获取openid 。
思路:首先获取request中的code,然后通过code调用腾讯微信接口获取用户信息,其中就包括了openid。
由于小编使用的是struts2,所有构造了一个request对象。
public String queueInfo() throws Exception{ HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); String code = request.getParameter("code"); //通过code获取openid; net.sf.json.JSONObject wxUser = CoreService.getOpenid(code); String openid = wxUser.getString("openid"); } public class CoreService { public static String GETOPENID = "