1.设置响应行的状态码
setStatus(int sc)
常用的状态码如下:
200 :请求成功。
302 :请求重定向。
304 :请求资源没有改变,访问本地缓存。
404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
500 :服务器内部错误。通常程序抛异常。
2.设置响应头
addHeader(String name, String value) addIntHeader(String name, int value) addDateHeader(String name, long date) setHeader(String name, String value) setDateHeader(String name, long date) setIntHeader(String name, int value)
3.设置响应体
(1)关于设置中文的乱码问题:response.setContentType("text/html;charset=UTF-8");
(2)响应头设置字节
ServletOutputStream getOutputStream() ------------可用于文件下载
附:文件下载核心代码
// 获得要下载的文件的名称 String filename = request.getParameter("filename"); // 解决获得中文参数的乱码 filename = new String(filename.getBytes("ISO8859-1"), "UTF-8"); // 获得请求头中的User-Agent String agent = request.getHeader("User-Agent"); // 根据不同浏览器进行不同的编码 String filenameEncoder = "
一、数据格式化
Spring提供了注解的属性对象格式化功能:在Bean属性中设置、SpringMVC处理方法参数绑定数据、模型数据输出时自动通过注解应用格式化的功能。
在org.springframework.format.annotation包下面定义了两个格式化的注解类型:
1.DateTimeFormat
@DateTimeFormat注解可以对java.util.Date、java.util.Calendar等时间类型的属性进行标注。它支持以下几个互斥的属性:
·iso。类型为DateTimeFormat.ISO。以下是几个常用的可选值。
DateTimeFormat.ISO.DATE:格式为yyyy-MM-dd。
DateTimeFormat.ISO.DATE_TIME:格式为yyyy-MM-dd hh:mm:ss .SSSZ.
DateTimeFormat.ISO.TIME:格式为hh:mm:ss.SSSZ。
DateTimeFormat.ISO.NONE:表示不使用ISO格式的时间。
·pattern。类型为String,使用自定义的时间格式化字符串,如“yyyy-MM-dd hh:mm:ss”。
·style。类型为String,通过样式指定日期时间的格式,由两位字符组成,第1位表示日期的样式,第2位表示时间的格式,以下是几个常用的可选值。
S:短日期/时间的样式
M:中日期/时间的样式
L:长日期/时间的样式
F:完整日期/时间的样式
-:忽略日期/时间的样式
2.NumberFormat
@NumberFormat可对类似数字类型的属性进行标注,它拥有两个互斥的属性。
~pattern。类型为String,使用自定义的数字格式化串,如“##,###。##”。
~style。类型为NumberFormat.Style,以下是几个常用的可选值:
NumberFormat.CURRENCY: 货币类型
NumberFormat.NUMBER: 正常数字类型
NumberFormat.PERCEMT: 百分数类型
代码实例:
前端js页面:
<h3>数据格式化页面</h3> <form action="test" method="post"> <table> <tr> <td>日期类型:</td> <td><input type="text" id="birthday" name="birthday" /></td> </tr> <tr> <td>整数类型:</td> <td><input type="text" id="total" name="total" /></td> </tr> <tr> <td>百分数类型:</td> <td><input type="text" id="discount" name="discount" /></td> </tr> <tr> <td>货币类型:</td> <td><input type="text" id="money" name="money" /></td> </tr> <tr> <td><input id="
经过上一篇的讲解,我们已经知道如何响应用户发送的文本消息了,对于与微信公众号的互动这块,就是你发个用户什么,需要用户响应给你什么,这里记住关键一点就是数据的传输都是通过XML,只要正确解析微信请求中的XML数据包就能知道用户发送的是什么,然后只要你返回给微信服务器正确的XML数据,用户就能收到正确的响应。
接下来要说的是,如何调用官方技术文档中的API去获得数据,这里讲主要的两种方式,也就是Get请求和Post请求。
对于Get请求,我们已获取access_token为例,首先看官方技术文档
接口调用请求说明
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 参数说明
参数是否必须说明grant_type是获取access_token填写client_credentialappid是第三方用户唯一凭证secret是第三方用户唯一凭证密钥,即appsecret 返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200} 参数说明
参数说明access_token获取到的凭证expires_in凭证有效时间,单位:秒 那依据这个文档我们该如何在编码中通过get请求获取access_token 呢?首先需要获取到这个API接口,也就是这个URL
String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; 也就是一个字符串,现在这个字符串中可是缺少参数的,那么该怎么填充这些参数,这就牵涉都URL的拼接,那么该如何拼接呢?如下
String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret); 以上就是对URL的一个拼接。
那么该如何发起请求获得数据呢?比如这个获取access_token的请求,当你成功发起请求,返回的数据是json,这就必然牵涉到对json数据的解析,我们需要将json数据解析成我们能用的数据,这里一般解析成Java对象。
现在梳理一下,比如你编写代码发起一个get请求,然后成功得到返回的json数据,然后对json数据进行解析,得到我们想要的数据。
http请求工具类 现在有这么一个工具类
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ConnectException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.
需求: 采用ArcGIS Runtime SDK for Android 100.3.0加载离线slpk文件
关于slpk的介绍,请参考ArcGIS官方介绍http://pro.arcgis.com/zh-cn/pro-app/help/sharing/overview/scene-layer-package.htm
效果图: ArcGIS Pro中加载slpk文件 Android真机中加载slpk文件 代码实现: (1)MainActivity.java import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.Toast; import com.esri.arcgisruntime.layers.ArcGISSceneLayer; import com.esri.arcgisruntime.mapping.ArcGISScene; import com.esri.arcgisruntime.mapping.view.Camera; import com.esri.arcgisruntime.mapping.view.SceneView; import java.io.File; /** * 加载slpk */ public class MainActivity1 extends AppCompatActivity { private SceneView mSceneView; private ArcGISScene scene; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // create a scene and add a basemap to it scene = new ArcGISScene(); // scene.
python正则表达式的详细讲解可以参考:http://www.runoob.com/python/python-reg-expressions.html
转自:https://blog.csdn.net/tao_627/article/details/51019972
业务场景:
从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下.
难点:
处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理.
往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别。
示例一:
从QQ纯真数据库中解析出省市县等特定词语,这里的正则表达式基本能够满足业务场景,懒惰匹配?非常必要,因为处理不好,会得不到我们想要的效果。个中妙处,还请各位看官自己琢磨,我这里只点到为止!
#!/usr/bin/env python #encoding: utf-8 #description: 从字符串中提取省市县等名称,用于从纯真库中解析解析地理数据 import re import sys #reload(sys) #sys.setdefaultencoding('utf8') #匹配规则必须含有u,可以没有r #这里第一个分组的问号是懒惰匹配,必须这么做 #注意在linux下PATTERN = ur're' PATTERN = r'([\u4e00-\u9fa5]{2,5}?(?:省|自治区|市)){0,1}([\u4e00-\u9fa5]{2,7}?(?:区|县|州)){0,1}([\u4e00-\u9fa5]{2,7}?(?:村|镇|街道)){1}' data_list = ['北京市南瓜村', '陕西省西安市雁塔区大村', '西班牙镇街道', '北京市海淀区', '黑龙江省佳木斯市汤原县大村', '内蒙古自治区赤峰市', '贵州省黔南州贵定县', '新疆维吾尔自治区伊犁州奎屯市'] for data in data_list: #data_utf8 = data.decode('utf8') data_utf8 = data print (data_utf8) country = data province = '' city = '' district = '' #pattern = re.compile(PATTERN3) pattern = re.
在启动计算机时,人们未能进入系统这一情况并不罕见。造成这场灾难的原因是多种多样的。即使对硬盘盘有轻微影响或操作错误也可能导致内部硬盘损坏。
在这里,我们总结了7个硬盘驱动器受损的常见原因。请逐一了解它们。
原因1:物理伤害
物理损坏(也称为硬件故障)包括以下类型:
过热
读/写头崩溃
破裂或接触不良的数据线
在磁盘上刮擦
控制电路板等短路
由于这些原因而丢失的数据很难恢复。您别无选择,只能求助于专业人员从物理损坏的硬盘恢复数据。
原因2:硬盘老化
每个硬盘都具有一定的使用寿命。通常的说法是机械硬盘的理论寿命可能超过30,000小时。如果硬盘连续工作(例如,在Web服务器中),那么这块硬盘大约可以使用三年。
注意:请不要太担心,普通计算机用户使用的硬盘使用寿命可以持续6到10年左右。
原因3 :文件系统损坏
操作系统使用文件系统来定义在存储设备上组织文件的方法。具体而言,它就像是访问保存在硬盘分区上的数据的网关。如果内部硬盘上的文件系统不幸损坏,磁盘可能无法访问,计算机可能无法启动。
原因4:病毒攻击
如果计算机受到病毒攻击,则可能会破坏或删除存储在内部硬盘中的必要引导文件,从而导致引导失败。同时,病毒也可以删除有用数据或整个分区。
原因5 :引导扇区损坏
引导扇区是硬盘的第一个扇区,它用于加载处理器控制,然后将其传输到操作系统。 一旦引导扇区损坏,用户将无法进入计算机并访问保存在内部硬盘中的任何数据。
原因6 :软件冲突
我们计算机上安装的各种程序目前可能无法完全兼容,因此软件冲突时不时会导致计算机意外关机并导致内部硬盘损坏。
原因7 :人为错误
由于并非所有用户都是专业的计算机使用和文件管理者,他们往往会在计算机运行时犯一些错误,导致硬盘崩溃。
前言:为了总结一下random模块的使用方法,我翻看了CSDN中几乎所有的关于random的介绍,发现其实都差不多。不过我还是选择自己再写一遍,一来加深印象,二来增加一些新的内容。
1.****random.random 随机生成[0.1)的浮点数
import random print(random.random()) #运行结果:0.4041810247152263 2.****random.uniform 原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a import random print(random.uniform(10,20)) print(random.uniform(20,10)) #运行结果为19.319774059417643 # 11.25780294472681 3.****random.randint 原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b(闭区间)
print(random.randint(12, 20)) #生成的随机数n: 12 <= n <= 20 print(random.randint(20, 20)) #结果永远是20 #print(random.randint(20, 10)) #该语句是错误的。下限必须小于上限。 4.****random.choice 原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence(字典和集合都是无序的)
import random print(random.choice("Python没那么简单") ) print(random.choice(['Jason', 'is', 'so', 'handsome'])) print(random.choice(('Tuple', 'List', 'Dict'))) 5.****random.sample 原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。(sample函数不会修改原有序列)
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.
普通的一键护眼只是修改[HKEY_CURRENT_USER\Control Panel\Colors]下Windows键值为 199 237 204,休眠、睡眠、锁屏后会变白。
按Windows键+R,打开“运行”对话框,输入regedit:
修改另一个注册表:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColors\Standard]下Windows键值:默认ffffff(白色)改为c7edcc(199 237 204),保证休眠后(Win+L也一样)不会变白的。
①需求稳定,不会频繁变更
自动化测试最大的挑战就是需求的变化,而自动化脚本本身就需要修改、扩展、debug,去适应新的功能,如果投入产出比太低,那么自动化测试也失去了其价值和意义;
折中的做法是选择相对稳定的模块和功能进行自动化测试,变动较大、需求变更较频繁的部分用手工测试;
②多平台运行,组合遍历型、大量的重复任务
测试数据、测试用例、自动化脚本的重用性和移植性较强,降低成本,提高效率和价值;
③软件维护周期长,有生命力
自动化测试的需求稳定性要求、自动化框架的设计、脚本开发与调试均需要时间,这其实也是一个软件开发过程,如果项目周期较短,没有足够的时间去支持这一过程,那自动化测试也就不需要了;
④被测系统开发较为规范,可测试性强
主要出于这几点考虑:被测试系统的架构差异、测试技术和工具的适应性、测试人员的能力能否设计开发出适应差异的自动化测试框架;
转载于:https://www.cnblogs.com/mncasey/p/9443625.html
@Configuration注解 在spring开发当中我们经常使用配置文件的形式来实例化bean、注入bean等操作。例如在spring-bean.xml中配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--实例化一个Person对象--> <bean id="person" class="com.sff.app.bean.Person"/> </beans> 那么@Configuration注解就相当于我们的spring-bean.xml文件,它可以这样使用。
/** * 配置类等价于spring-bean.xml文件 */ @Configuration public class AppConfig { } @Bean注解 它注解于方法之上,告诉方法让其产生一个Bean对象,然后把这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后Spring将会将这个Bean对象放在自己的IOC容器中。
/** * 配置类等价于spring-bean.xml文件 */ @Configuration public class AppConfig { /*给容器中注册一个bean,类型是方法返回值,id就是方法名称*/ @Bean public Person person() { return new Person("Kate", 12); } }
http://my.csdn.net/ 登陆后,打开该链接即可。
做个记录,改错后可以改回来
最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件夹中的内容也提交上去,这里面放的是一些项目的配置信息,包括历史记录,版本控制信息等。可以不传到Git上面去。 这个时候就需要编写.gitignore文件来忽略提交这些文件。在IDEA中有一个插件.ignore可以帮我们做这件事。
先来看下如何安装。
点击File->Settings 搜索.ignore,点击Install,安装完成后就可以愉快的使用了,不过在此之前得重启IDEA 在项目上右键->New ->.ignore file ->.gitignore file(Git) 先选择Example user template好了,以后有什么想过滤的可以自行添加,~最后点击Generate生成
然后就会发现被忽略的文件名变成了灰色有木有啊!又可以愉快的提交代码了~ 也可以右键文件将其加入忽略的名单中 下面是一些.gitignore文件忽略的匹配规则:
1
2
3
4
5
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交: 输入: 1
2
git rm -r –cached filePath git commit -m “remove xx”
或者: 1
2
3
git rm -r –cached .
联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2.
最左匹配原则
假定上图联合索引的为(a,b)。联合索引也是一棵B+树,不同的是B+树在对索引a排序的基础上,对索引b排序。所以数据按照(1,1),(1,2)......顺序排放。
对于selete * from table where a=XX and b=XX,显然是可以使用(a,b)联合索引的,
对于selete * from table where a=XX,也是可以使用(a,b)联合索引的。因为在这两种情况下,叶子节点中的数据都是有序的。
但是,对于b列的查询,selete * from table where b=XX。则不可以使用这棵B+树索引。可以发现叶子节点的b值为1,2,1,4,1,2。显然不是有序的,因此不能使用(a,b)联合索引。
By the way:selete * from table where b=XX and a=XX,也是可以使用到联合索引的,你可能会有疑问,这条语句并不符合最左匹配原则。这是由于查询优化器的存在,mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。所以,当然是我们能尽量的利用到索引时的查询顺序效率最高咯,所以mysql查询优化器会最终以这种顺序进行查询执行。
优化:在联合索引中将选择性最高的列放在索引最前面。
例如:在一个公司里以age 和gender为索引,显然age要放在前面,因为性别就两种选择男或女,选择性不如age。
1. 背景 最近项目需要, 使用了微信小程序开发。我们这里的用法其实就是一个壳子, 直接webview到项目的网页上。在webview中, 我需要使用wx.getLocation() 方法获取用户当前位置数据. 根据网上很多使用微信JSSDK的例子, 调用了wx.config() 方法, 但是总是失败, 先提示"invalid url domain", 后提示 "the permission value is offline verifying".
2. 解决方法 各种尝试, 各种验证, 终于找到下面一篇博客, 解决了问题: 在生成signature时, 要使用公众号(订阅号也可以)的AppID和AppSecret, 不能使用微信小程序的AppID和AppSecret, 否则就会出现上述问题.
原博客地址: 微信小程序web-view中jssdk接口调用【避坑指南】
题目:Roberts算子 作用模板为:
Sobel算子 作用模板为:
设图像为: 问题1:用Roberts算子对其进行锐化,写出锐化过程和结果。 解:
插播一条计算方法:
(图片来源:第7章 图像的锐化处理.ppt - 豆丁网 http://www.docin.com/p-456906827.html)
结果:
问题2:用Sobel算子对其进行锐化,写出锐化过程和结果。 解:
插播一条计算方法:
(图片来源:第7章 图像的锐化处理.ppt - 豆丁网 http://www.docin.com/p-456906827.html)
import numpy as np d=np.array([[3,3,3,3,3],[3,8,7,6,3],[3,6,0,5,3],[3,7,8,4,3],[3,8,3,3,3]]) def mySobel(myArray,x,y): Dx = (myArray[x+1,y-1]-myArray[x-1,y-1])+2*(myArray[x+1,y]-myArray[x-1,y])+(myArray[x+1,y+1]-myArray[x-1,y+1]) Dy = (myArray[x-1,y+1]-myArray[x-1,y-1])+2*(myArray[x,y+1]-myArray[x,y-1])+(myArray[x+1,y+1]-myArray[x+1,y-1]) r = (Dx**2+Dy**2)**0.5 return r for i in range(1,len(d)-1): for j in range(1,len(d)-1): print("({0},{1})→".format(i+1,j+1),int(mySobel(d,i,j))) 输出:
(2,2)→ 5
(2,3)→ 5
(2,4)→ 5
(3,2)→ 3
(3,3)→ 7
(3,4)→ 4
(4,2)→ 9
(4,3)→ 13
(4,4)→ 7
2018.8.8—–学习笔记;
基本常用查询 select select * from student; all 查询所有 select all sex from student; distinct 过滤重复 select distinct sex from student; count 统计 select count(*) from student; select count(sex) from student; select count(distinct sex) from student; top 取前N条记录 select top 3 * from student; alias column name 列重命名 select id as 编号, name ‘名称’, sex 性别 from student; alias table name 表重命名 select id, name, s.id, s.name from student s; column 列运算 select (age + id) col from student; select s.
一、定义
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。使用Builder模式就是用来替代多参数构造函数。
二、在Android中的应用
1、AlertDialog.Builder
通过查看源码发现,AlertDialog的构造方法都是protected修饰,即除了它的子类,其他类是无法访问这个方法的。因此在Fragment和Activity中,无法直接创建AlertDialog实例,必须通过Builder对象。
2、OKHttp中的Request.Builder
这里通过首先创建一个Request.Builder对象,再通过他的build()方法创建出最终的request对象。
结合源码分析
首先,Request是final类型的,因此他不会有子类;再有就它唯一的构造方法是private的;因此,对于开发者来说就无法通过普通的方法(通过new)创建一个Request对象了。
补充:Builder一般都定义为static静态内部类,静态内部类与非静态内部类区别如下:
1、内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。而静态内部类不需要绑定在外部类的实例中,也就是说,在创建内部类时,外部类不需要利用new关键字来创建这个内部类的对象。
2、在非静态内部类中不可以声明静态成员。
3、静态内部类不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。只能够引用外部类中的静态成员方法或者成员变量。
Hadoop+Spark错误i笔记: 环境:Hadoop2.9.1+Spark2.3.1+JKD1.8+centos6.9 32bit + hive2.3.3
Hadoop 1.
Java HotSpot(TM) Client VM warning: You have loaded library /usr/local/bigdata/hadoop/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now. It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'. 参考:https://blog.csdn.net/milhua/article/details/78711895 解决: hadoop-env.sh和yarn-env.sh中添加如下两行:
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib" 2.无论是32未机器还是64位机器都报这个错误,郁闷。。。。
18/08/06 20:05:13 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform.
注:以下结果均需要在网页内点击F12在console中查看效果 event对象很多,这里对一些常用的进行解释和举例 首先创建一个新的HTML 在head中写下一个方法,例如:
<head> <meta charset="utf-8" /> <title>event</title> <script> function test(){ console.log("好好学习") } </script> </head> 1.onlick 在鼠标点击的时候起作用,例如:
<div onclick="test()"> 哈哈哈哈哈哈哈哈哈 </div> 2.onchange 只有在值变化的时候,才能起作用,例如:
<select onchange="test()"> <option>one</option> <option>two</option> <option>three</option> </select> 3.onfocus和onblur onfucus在聚焦的时候起作用,例如:
<textarea onfocus="test()"> </textarea> onblur在失去焦点的时候起作用,例如:
<textarea onblur="test()"> </textarea> 4.onmousemove和onmouseover和onmouseout (1)onmousemove只要鼠标在区域中移动,便起作用,不动或在区域外移动无效; (2)onmoueseover鼠标从区域外移动到区域内起作用; (3)onmouseout鼠标从区域内移动到区域外起作用; 注:加边框是为了出现区域,使效果更明显; 例如:
<div style="border: 1px solid red;height: 200px;width: 200px;" onmousemove="test()"></div> <div style="border: 1px solid red;height: 200px;width: 200px;" onmouseover="test()"></div> <div style="border: 1px solid red;height: 200px;width: 200px;" onmouseout="test()"></div> 5.
单看这个报错真心看不出什么错误:说是操作正在进行中,详情看用户手册。
1、首先确定samba是否正常运行
2、该服务器的139、445端口是否开启
3、然后ping 一下该ip地址,发现ping不通之后,原来是我ip写错了
使用百度地图api模拟实时定位页面 完整示例 效果:使用百度地图api在页面上显示车辆的实时位置,并有自动刷新和手动刷新两种方式可以选择。每次刷新后,都会在地图上显示车辆的最新位置。 示例运行效果截图: 步骤 1. 首先,我们要创建一个一个main方法,用来往一个txt文件中不断地写新的坐标,来模拟GPS设备不断获取的坐标数据。 所以我们先写一个任务,它的作用是产生一个新的位置坐标,并将其写入一个名为position.txt的文档中。
package com.icbc.dataDisplayService.bean; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Random; public class TimerTask extends java.util.TimerTask { // private Position position; @Override public void run() { //随机生成坐标 //lon的取值范围是121.4600-121.4800 //lat的取值范围是31.2200-31.2800 Random randomLon = new Random(); Random randomLat = new Random(); double lon = ((double)(1214600+randomLon.nextInt(200)))/10000; double lat = ((double)(312200+randomLon.nextInt(600)))/10000; // this.position.setLon(lon); // this.position.setLat(lat); //把他写到文件里 File positionFile = new File("D:\\Myapplication\\java\\GPSDataDisplayService\\src\\main\\java\\com\\icbc\\dataDisplayService\\position.txt");//文件路径 try{ FileWriter fw = new FileWriter(positionFile,true); BufferedWriter bw = new BufferedWriter(fw); bw.
解决方法一:
命令:tomcat7:run 注意:trim(run) run前后不存在空格
解决方法二: 找到这个settings.xml文件,进行编辑,在pluginGroups标签下加入下面的配置 <pluginGroups> <pluginGroup>org.apache.tomcat.maven</pluginGroup> </pluginGroups> 原路径:http://tomcat.apache.org/maven-plugin-2.2/
解决方法三:在pom.xml文件中加入
<pluginRepositories> <pluginRepository> <id>apache.snapshots</id> <name>Apache Snapshots</name> <url>http://repository.apache.org/content/groups/snapshots-group/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> 解决方法四:加入这个tomcat7配置
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> 版权声明:如果您发现了文章和代码中的错误,欢迎您在评论区中指出并给予指导,谢谢!! https://blog.csdn.net/u012661010/article/details/73734058
Spring Cloud Config
Spring Cloud Config为分布式系统中的外部配置提供服务端和客户端支持,所谓的服务端是用一台,或者一组(为实现高可用)机器实现从某个固定的地方,默认是git,也可以是其它版本控制工具如SVN,文件服务器,或者JDBC等源头获取配置信息。然后给多个客户端使用,做到统一配置。
一、先动手,创建Spring Cloud Config Server
1、建立Spring boot项目,建立的时候除了勾选web,再勾选一个cloud config -> config server
2、配置application.properties(application.yml)
在创建完项目之后,需要等待maven加载依赖,不然无法进行下一步。我这一步经常卡住,可能是网络渣渣,然后我会将idea中下载maven的progress停止掉。去文件所在目录中敲mvn命令更新,一般会很快。然后回过头来有可能停止maven的操作还卡在那里,索性关掉idea重新打开就好了。
到这里我们停一下,稍微看下源码,spring cloud有几种配置方式,都在下图里了。
默认是使用git来配置,git这个东西不太会用,其实用来讲spring cloud config程度的“会用”我还是会的,只是发现好特么卡。我们可以使用本地配置,svn配置,或者数据库配置。其实大同小异。git、svn配置的不讲,大家自己去百度搜,基于JDBC的着重再讲一下。先从最简单的本地配置开始。
#指定应用程序名称
spring.application.name=config-server
#指定端口
server.port=8888
#指定配置方式是本地文件
spring.profiles.active=native
#配置文件的目录
spring.cloud.config.server.native.search-locations=D:/spring-config/config-file
我们去D盘下,建这两个目录,然后按照xx-xxx的命名规则,建一个.properties的配置文件。比如我们叫做config-dev.properties。
3、打开Application.java,添加一句@EnableConfigServer,开启配置中心服务器选项。
4、浏览器里面敲击http://localhost:8888/config/dev,就可以看到是否能成功获取配置
扩展:
1、扩展名只能是.properties或者.yml
基于文件的叫别的扩展名是不行的,只能叫xxx.properties,或者xxx.yml也可以。假设我们把config-dev.properties改成config-dev.txt就不行
2、即使找不到也会有返回信息的
即使查询不到配置值,也会有返回信息,会把查询信息返回回来,所以要看后半段的"propertySources"是否为空。
3、目标文件应该长什么样
Spring配置规范,要求按照applicationName+profile+label组合的方式来存放配置资源,供客户端读取。其中label是可选的。配置源可以通过三种方式组织,restful,xx-xx.yml,xx-xx.properties,也就是一共包括6种方式,每一种都可缺省label的方式。其中jdbc通过restful组织,其它方式是基于文件系统的,通过后两种方式组织,注意这两种方式的label的位置是不相同,基于文件系统时候,label拼在上级目录的最后(不是一层新的目录,而是就拼在上级目录的最后,等于说是用来区分上级目录的,看到后面会明白)。
restful(jdbc)
application/profile[/label]
yml (基于文件系统)
[label/]application-profile.yml
properties (基于文件系统)
[label]/application-profile.properties
4、中文乱码
看上面的图,会发现中文是乱码。
原因:jdk加载properties时候使用的是ISO-8859-1的字符集。
1)分析:
我们看一下源码,Spring使用PropertiesPropertySourceLoader这个类加载.properties文件,顺着代码往上追,最后是调用java.util.Properties的load方法。
java.util.properties中默认使用ISO-8859-1来解析,所以如果xml中出现中文是无法解析的。
2)解决方法1:
我们可以和PropertiesPropertySourceLoader这个类一样,实现自己的PropertySourceLoader接口,使用utf-8编码读取流。并通过spring boot的配置项org.springframework.boot.env.PropertySourceLoader=com.example.configserver.MyPropertiesHandler
重新指定读取.propeties文件的类。
3)解决方法2:
还可以索性使用yml来实现,这个是通过utf-8来解析的。可能代表java不倾向于properties格式的配置方式了,改用xml、yml这两种配置方式,这两种默认是utf-8的编码格式。
为了方便编写yml语句,可以通过在线yml编辑器,或者下载一款叫做Atom的编辑工具进行编辑。
5、label在不同模式下表现出的差异性
label可选。但是在不同的配置方式下,label表现出来不一样的效果,每一种模式都有一个自己实现的配置解析逻辑。在本地文件访问的时候,表现的特别奇怪。。。
经过查看源码,会发现并不是新增一层label的文件夹,比如localhost:8888/config/dev/test
我们新建一个test文件夹,把yml拷贝一份放进去,把name改成“小红”,新建一个test文件夹到"config-file"文件夹下。会发现访问不到。查看源码原来是要把config-file后面拼上label,就可以访问了(不是一层新的目录,而是就拼在上级目录的最后)。
6、profile这一层,会默认先不匹配,只匹配applicationName。如果有profile,会再匹配profile对不对。
先会把不带dev的这一层也会读取出来,假设我准备了两个文件config.yml和config-dev.yml,都会读出来。
然后我们再复制一个config-test试试看,发现dev的是读取不出来的,只能读取出config-test.yml和config.yml,也就是先用applicationName去找,然后如果有env,再用env去找。
几天前给电脑重装了系统,突然发现电脑没了声音,赶紧一顿操作,在使用驱动精灵等软件重装了一波驱动后依然无果。但基本确定不是硬件问题,于是再solve了一阵后,有了以下解决方案(ps:在你用驱动精灵等一些软件对驱动进行更新却依然不行的情况下,并且你基本确定你的电脑是软件问题,而非硬件问题的时候,可以一试)。
确定自己的厂商及电脑型号,进入官网,例如我的电脑是THINKPAD,就进联想thinkpad的官网(如图1.1);找到服务于支持选项,点进去后如图1.2;选择驱动下载选项,进入,如图1.3; 4.有两种下载驱动的方法: 可以选择自己输入主机编号然后下载对应驱动(主机编号见笔记本背面或侧面等地方); 在这里我更推荐第二种方法,这里也重点介绍第二种方法解决:就是使用官网给出的联想驱动管理这个软件进行下载;下载完的软件如图1.4; 5,进入该软件后可以一键检测是否有驱动的更新等操作,如图1.5; 在我通过这个渠道安装好驱动后,电脑的声音又回来了,希望大家也能通过我的方法来解决自己的电脑问题,byebye~
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ if s: maxStr = s[0] maxLen = 1 resultLen = 0 for t in s[1:]: if t in maxStr: tempLen = len(maxStr) if tempLen > maxLen: maxLen = tempLen maxStr += t maxStr = maxStr[maxStr.index(t)+1:] else: maxStr += t resultLen = len(maxStr) # print (maxLen) # print (resultLen) return max(maxLen,resultLen) else: return 0
一、找工作阶段 背景介绍 非名校,软件工程专业,无相关工作经验,实际编程只有在学校学习时。刚刚毕业,找工作中。
大家都知道,开发这一行没有工作经验相当的吃亏,如果没有丰富的知识,对知识良好的理解,与优秀的自学能力, 很难找到工作。
经过近一个月的面试,总结一些信息。
面试过程 一面都是hr面。良好的表达能力,与亲和力能增加进入二面的几率,其实只要不紧张,好好回答问题都没什么问题。
具体有些需要注意的问题,如下:
请做下自我介绍!这个没啥说的,每个面试官都不一样,争取说说自己的优点,或者能显示出你的团队协作能力、学习能力的事,还有做过的自豪的事。(最好别瞎编)
1、加班或出差。大公司我觉得都可以接受,毕竟咱们刚刚毕业,重要的是先积累经验;如果是小公司,最好问清福利待遇之类的,一般小公司制度不完善,有可能出现加班不给加班费、出差没有出差补助之类的情况。
2、期望工资。最好尽量避免直接回答,可以侧面表示自己要求不高,希望公司给个合理的待遇。
3、上一份工作的离职原因(实习工作)。这个没有具体答案,尽量实事求是,别说上一个公司的坏话,可以说公司发展方向与自己的规划不符之类的。
4、还有哪些想问公司的问题。这个其实挺重要的,公司可能会通过这个来看你是不是真的想在该公司长远发展。如果没什么想问的,可以问“咱们公司对新人有哪些方面的培养计划或者有哪些公司内部培训机会,我可以参加吗”之类的问题。
二面是项目经理面。会问一些专业问题。首先是java一些基础的知识和知识点,主要偏向于理论,有可能在问某个问题的时候突然切入,一直扣这一个问题问到底。
1、 java基础知识点可以靠刷牛客网的题来进行覆盖,但是当遇到某些不懂的东西,或者很重要的东西,最好自己多查查资料争取搞懂。
常问知识点有:
数据库语句,很多考group by的,以及内外连接。事务servlet面向对象基础知识(基本原则、特征之类的)堆、栈、队列、树、图 ArrayList、LinkedList线程前后台数据传递sessionHashMap、Hashtable排序、算法、复杂度JVM内存回收 这里有几个可快速复习用于跳槽及入职的java的帖子,分享下:
Java常见面试题记录_ShyTan的博客-CSDN博客
最终成功入职的java面试题_ShyTan的博客-CSDN博客_java终面
100个你应该知道的java基础知识_ShyTan的博客-CSDN博客_java基础
2、现在是2018年8月份,大部分公司基本都使用ssm,也就是Spring+SpringMVC+Mybatis的框架,如果不熟悉的话,自己找一些相关资料看一看,至少知道他们的作用与职责,或者有哪些好处以及注意点。这里其实可能有很多看不懂的东西,因为毕竟没有环境去实际体验知识点的实际应用,如果你自学能力很强,可以上网找一些实际项目,看看其中的代码,以及某些知识点的实际应用,更方便去理解。
记住,学习还是从实际出发学的快,看枯燥的知识点你是永远不会理解的,自己上网找几个能运行的项目,自己实验,弄懂就容易多了。
二、学习阶段(2021补充) 如果你已经入职或者有很多空闲时间,可以学习些现在常用的技术知识
以下开发基本使用idea及mysql数据库(博主用的oracle),使用maven进行jar包管理,使用git进行版本控制
版权属于狂神,对应视频在B站,大家可以边看视频边看博客笔记,网站中还有其他技术如redis、springcloud等,我的博客也有对应笔记哦!
狂神B站:https://space.bilibili.com/95256449
JVM: 一篇文章教你了解JVM-狂神JVM学习笔记_ShyTan的博客-CSDN博客_jvm狂神
mysql: 一篇文章教你学会并使用MySQL-转自狂神_ShyTan的博客-CSDN博客
javaweb: 一篇文章教你学会并使用JavaWeb-转自狂神_ShyTan的博客-CSDN博客
mybatis: 一篇文章教你学会并使用Mybatis-转自狂神_ShyTan的博客-CSDN博客
spring: 一篇文章教你学会并使用spring-转自狂神_ShyTan的博客-CSDN博客
springboot: 一篇文章教你学会并使用SprintBoot-转自狂神_ShyTan的博客-CSDN博客_sprintboot
git: 一篇文章教你学会并使用Git-转自狂神_ShyTan的博客-CSDN博客
ShyTan纯手打,转载请标明出处。
需要内推请联系博主(仅帮忙内推,不保证进哈):大厂银行软件开发,需出差,使用java/oracle,技术要求不高,薪资范围私聊
第8章 开发web接口 因为要对web接口进行测试,虫师在前面大致讲解了web开发的过程,接下来就是web接口开发。所以,了解了什么是web接口开发,也就很容易进行web接口测试了。
8.1 为何要开发Web接口 总的来说,就是当开发大型B/S架构的程序时,前后端分离,当前端想要调用后台程序,只需要调用接口即可。这样带来的好处就是:
后端不必精通前端技术(HTML5/JavaScript/CSS),只专注于数据的处理并提供Web接口即可;
前端的专业性越来越高,通过调用Web接口获取数据,从而专注于数据展示和页面交互设计;
Web接口的应用范围更加广泛,由后端开发的接口既可以提供给Web页面调用,也可以提供移动APP调用等;
8.2 什么是Web接口 通过数据传输协议(eg:HTTP/SOAP……)传输一定格式(eg:XML/JSON/CSV……)数据的接口。
在当前Web接口中,HTTP协议+JSON数据格式,是目前最流行的两个接口技术。
8.2.1 HTTP HTTP(Hyper Text Transfer Protocol,超文本传输协议)
主要特点:
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间;
媒体独立:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端和服务器指定使用适合的MIME-type内容类型;
无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,如果服务器不需要先前的信息,那么它的应答就比较快。
HTTP请求方法:
请求方法说明(V1.1)GET请求指定的页面信息,并返回实体主体POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中,POST请求可能会导致新的资源的建立或已有资源的修改HEAD类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头PUT从客户端向服务器传送的数据取代指定文档的内容DELETE请求服务器删除指定的页面TRACE请求服务器返回收到的请求信息,主要用于测试或诊断CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求 状态响应码: 当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求。
HTTP状态码分为五类: 1**:信息,服务器收到请求,需要请求者继续执行操作;
2**:成功,操作被成功接收并处理;
3**:重定向,需要进一步的操作以完成请求;
4**:客户端错误,请求包含语法错误或无法完成请求;
5**:服务器错误,服务器在处理请求的过程中发生了错误。
常见状态代码和状态说明: 200 OK: 请求成功,一般用于GET或POST请求。
302 Fund: 临时移动,资源只是临时被移动,客户端应继续使用原有URI。
400 Bad Request: 客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized: 请求要求用户的身份认证。
403 Forbidden: 服务器理解请求客户端的请求,但是拒绝执行此请求。
404 Not Found: 服务器无法根据客户端的请求找到资源。
500 Internal Server Error: 服务器内部错误,无法完成请求。
503 Server Unavailable: 由于超载或系统维护,服务器暂时无法处理客户端请求。
请求头信息与响应头信息:
请求头信息:请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息,常用的请求报头如下:
Accept:浏览器可接受的MIME类型。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时会用到。
首先说明:MinGW就是gcc的安装工具
1.下载 MinGW的下载地址:www.mingw.org,点击右上角的Download Installer即可下载。
2.安装mingw-get-setup.exe 直接默认选择安装即可,默认安装在C:/MinGW/的路径下
3.运行MinGW Installer安装器 根据需要选择安装的package:
mingw-developer-toolkit:mingw的开发者工具,一般不需要mingw32-base:必选,mingw的基础包,核心的c编译器mingw32-gcc-ada:Ada的编译器mingw32-gcc-fortran:fortran的编译器mingw32-gcc-g++:C++的编译器mingw32-gcc-objc:Objective-C的编译器msys-base:MSYS 开发环境所需的包 如果是只需要C++编译器的话,只选中mingw-developer-toolkit和mingw32-gcc-g++即可。
然后点击左上角的Installation下的Apply Changes进行安装即可。
4.环境变量配置 右键我的电脑->属性->高级系统设置->高级->环境变量,在系统变量的path下追加MinGW的bin地址:
点击确定即可。
5.测试 Ctrl+R,输入cmd打开控制台,在控制台中输入gcc -v 查看gcc的版本,
如果显示如下,则说明编译器安装成功:
6.g++ -o命令的使用:(生成可执行文件) 在cmd中通过“cd 地址”的方式快速定位到相关文件夹下输入g++ -o test.exe test.cpp 就是将test.cpp编译成文件名为test.exe的可执行文件
一.功能展示: 二.需求分析: 1.在页面上显示4个输入框,分别输入用户的姓名,邮箱,手机号码,地址. 2.有一个添加按钮,当用户点击添加按钮,会动态添加用户的信息表格 3.实现单数行呈现黄色,双数行呈现红色 三.思路分析: 第一步:先展示如图所示的静态页面: 第二步:需要动态向内容里面添加我的用户信息表格 第三步:改变单数以及双数的样式 四:hTML+CSS结构样式代码: 样式代码:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> #inputInfo li { list-style: none; } table , th ,td { width: 800px; padding: 10px; border: 1px solid black; border-collapse: collapse; background-color: pink; } #first th { background-color: purple; } </style> </head> <body> <!--用户输入信息的按钮--> <div id="inputInfo"> <ul> <li>请输入你的姓名:<input type="text" id="nameInfo"/></li> <li>请输入你的邮箱:<input type="text" id="emailInfo"/></li> <li>请输入你的手机:<input type="text" id="phoneInfo"/></li> <li>请输入你的地址:<input type="text" id="addrInfo"/></li> </ul> </div> <!
批量文件文件异步上传
当使用ajax进行几十上百次的请求时,由于request请求会使浏览器处于等待状态,从而造成浏览器长时间无法访问的问题。针对此类问题,需使用
Deferred使其成为异步操作。 具体使用流程如下:
$scope.commitOrc = function () { //判断是否选中文件夹 var fileOrc = $("#fileFolderOrc").val(); if (fileOrc == '') { $("#msgCrc").text('请选择要上传的文件夹'); return; } while ($scope.alreadyUploadSize < $scope.actual_filesCount) { var end = $scope.alreadyUploadSize + $scope.uploadEachNumber > $scope.actual_filesCount ? $scope.actual_filesCount : $scope.alreadyUploadSize + $scope.uploadEachNumber; var formData = new FormData(); // FormData 对象 for (var i = $scope.alreadyUploadSize; i < end; i++) { formData.append('image', $scope.files[i]); } $scope.alreadyUploadSize = end; // var deferreds = $scope.
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的 循环放在最外层,以减少 CPU 跨切循环层的次数。
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 5 using namespace std; 6 //定义基类First 7 class First { 8 int num; 9 float grade; 10 public: 11 //构造函数带参数 12 First(int n,float v ) : num(n),grade(v) 13 { 14 cout<<"The First initialized"<<endl; 15 } 16 DispFirst(void) { 17 cout<<"num="<<num<<endl; 18 cout<<"
custom_setting:是对setting中的文件内容进行覆盖。 这里我们以爬取知乎的网站为例。 知识点介绍: custom_settings :对框架中的内容进行覆盖,比如我想覆盖setting中的headers的内容,那么只要将header的内容写入custom_settings中,然后改变headers的值即可, 当程序再次运行时会覆盖以前setting的headers值,而运行你修改之后的内容。 知乎最开始带有heaser的setting文件内容如下:、
DEFAULT_REQUEST_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', } 运行zhihu文件出现状态码·200
2018-08-03 10:53:57 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.zhihu.com/robots.txt> (refere r: None) 编写zhihu文件的内容:
# -*- coding: utf-8 -*- import scrapy class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhihu.com'] start_urls = ['http://www.zhihu.com/'] custom_settings = { 'DEFAULT_REQUEST_HEADERS' : { 'User-Agent': None, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', } } def parse(self, response): pass 运行结果为:
word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。
Cbow和skip-gram 是word2vec中两种关键模型,它们从不同角度来描述了周围词与当前词的关系;
在cbow方法中,是用周围词预测中心词(多对一,后验),从而利用中心词的预测结果情况,使用梯度下降法,不断的去调整周围词的向量。当训练完成之后,每个词都会作为中心词。把周围词的词向量进行了调整,这样也就获得了整个文本里面所有词的词向量。cbow的对周围词的调整是统一的:求出的梯度的值会同样的作用到每个周围词的词向量当中去,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次反向传播, 而往往这也是最耗时的部分),复杂度大概是O(V);
skip-gram 与之相反,使用中心词预测周围词(一对多,先验),skip-gram会利用周围的词的预测结果情况,使用梯度下降不断的调整中心词的词向量,最终所有的文本遍历完毕之后,也就得到了文本所有词的词向量。对比而言,skip-gram进行预测的次数多于cbow的:因每个词作为中心词时,皆需使用周围词进行预测一回。因此相当于比cbow多进行了K次(假设K为窗口大小),时间的复杂度约为O(KV),训练时间相对比cbow要长。
but在skip-gram当中,每个词皆受都要收到周围的词的影响,每个词在作为中心词时,都要进行K次的预测、调整。因此, 当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。因为尽管cbow从另外一个角度来说,某个词也是会受到多次周围词的影响(多次将其包含在内的窗口移动),进行词向量的跳帧,但是他的调整是跟周围的词一起调整的,分值会平均分到该词上, 相当于该生僻词没有收到专门的训练,它只是沾周围词的光。
Cbow和skip-gram 通常可分为三层,输入层(input),映射层(projection)和输出层(output)
本文从前端开发的视角,聊一聊前后端分离之后的前端开发的那些事儿。
阅读全文,大约需要8分钟。
什么是前后端分离 要区分前端和后端,需要有个明确的界限。一般,用户可以直接看到的东西,都是属于前端的范畴,除了前端之外都属于后端了。
你负责貌美如花,我负责赚钱养家
在传统的像ASP,JSP和PHP等开发模式中,前端是处在一个混沌的状态中,可以说是没有独立的“人格”可言。
前端负责切图和编写静态页面模板,后端将数据渲染到前端提供的页面模板中,最后将页面渲染到浏览器展示。
这个过程中,前端只提供页面模板或者写一些JavaScript脚本,有的甚至JS脚本都是后端来写,前端的作用只局限于切图和样式模板文件,这种角色就是传说中的“切图仔”。
这也是为什么行业内都觉得前端是一个很简单的工作,只要花个一周,学下HTML、CSS和PS的简单技巧就可以胜任的工作。
现在看来,那时候的前端就是一个打酱油的,发展前景很有限。那时候的JavaScript脚本也比较简单,一个jQuery就可以横扫天下,所以对于精通语言类代码的后端程序员来说,可以很快的上手JavaScript,对前端来说,发展空间就更小了。
前后端分离,不只是简单的代码的分离。
首先是要架构上分离解耦,逐渐摆脱前后端在架构上的依赖,前后端各司其职,分开部署在不同的服务器上,通过RESTful接口传递数据。减轻后端服务器的压力,后端服务器不再负责页面渲染,只负责输入数据,吞吐量提升了好几倍。
其次是逻辑分离,不分离的时候,对于业务代码的界限很不明确,业务逻辑基本都放在后端,分离之后,前端也承担了一部分不该后端来写的业务逻辑,数据处理更加清晰。
最后是系统分离,同一个后端系统,可以将同样的接口数据提供给PC端、Mobile端和Native端等不同的前端终端,不需要为每一种终端提供一套接口。同样,对于前端应用来说,可以更方便的调用多个后端服务器的接口,处理和展示多个系统间的数据。
为什么要前后端分离
前后端分离,让软件开发的流程更加清晰,解决了开发阶段的痛点。
从前,前端不止要学习后端的模板渲染语法,还要配置后端的开发环境,并不断同步后端的代码,这对于前端来说是非常痛苦的。
而现在,前端有自己的服务器,不需要再依靠后端服务器来支持项目运行,如果在开发阶段,还可以使用mock数据(要先和后端确定接口数据结构),摆脱对后端接口的依赖,这样极大的提高了开发效率,系统分工也更加明确。
当然,如果只是提出一个概念,技术上不能实现也是空谈。
随着前端技术的更新发展,短短几年内就发展出了gulp、webpack等前端工程化工具,HTML5和JavaScript也不断更新新特性,提供了前端应用场景和开发前端独立应用的技术支持,React Native、PWA和微信小程序等也都是以前端技术为基础开发移动APP和小应用,前端迈入了一个最好的时代。
前端技术在近些年的发展,也使得后端不能再将前端束缚在自己麾下,必须放开手让前端闯出自己的一片天,发挥大前端的优势。只是下面看一下,前端技术在近几年有了哪些发展,使得前后端分离成为可能。
微服务的兴起,系统架构解耦合,前后端分离是必然的趋势。
2009年,谷歌推出angularJS,将后端MVC的思想带到了前端,模块化、指令和双向绑定等特性使得构建一个前端应用项目成为可能。
2012年HTML5规范定稿,2014年10月标准落地,HTML5的新特性加速了前端领域的发展。2015年6月17日,ECMAScript 6发布正式版本,带来了很多语言新特性,如class,module和promise等。
Nodejs的出现,使得JavaScript编写服务端程序成为可能,用JavaScript就可以开发一个从前端到后端的系统。Nodejs的事件驱动在负载均衡方面表现突出,越来越多的Nodejs服务器被应用到了生产环境。用npm管理的JavaScript模块,可以快速构建一个可插拔的系统。
经历过RequireJS的模块化,发展出了ReactJS、VueJS等前端框架,将前端模块化推上了一个新高度,结合ECMAScript 6语言class、module等,用babel编译成浏览器可识别的ES5语法,经过grunt、gulp、webpack和rollup等打包工具的编译打包,构建一个前端应用变得非常的容易。
前端的场景也已经跳出PC端网页,有了移动端H5页面,微信端页面,Hybird App内嵌页面等。
使用前端技术,能做哪些事
网站
网站是前端最基本的形态了,最基本的是PC端网站、移动端网站。可以在浏览器上打开,也可以在微信或各种APP内打开(这也是一直APP内webview打开的方式)
H5游戏
H5游戏已经见怪不怪了,当年微信退出打飞机游戏的时候,推动了H5游戏的大发展。它无需安装,通过手机浏览器即可访问,最大的特点就是:轻量、简单。
H5游戏的开发采用HTML5的canvas等制作,或者也可以使用webgl来做3D的H5游戏。
移动APP
原生的移动APP,是用Native的开发语言做的,比如要开发IOS APP,你可以用Object-c,swift等,要开发Android APP,你可以用JAVA或Kotlin等。
我们这里说的移动APP,是指使用前端技术来做的。前几年,比较火的Hybird APP框架是ionic,也有国内开发者做的mui和HTML5+框架,这些框架的技术是将html、css和JavaScript打包成一个文件,将文件放到webview中访问,最后再在外层套上原生应用的壳,生成IOS和Android的安装文件。这种APP可以做很多简单的APP,不适合交互比较复杂的APP,因为webview的性能还是存在一定的问题,在Android设备上的卡顿变现比较明显。
这两年,以React为语法基础的React Native和以Vue为语法基础的Weex框架,成为新一代使用前端技术开发移动APP的框架,它们抛弃webview使用新的渲染机制,极大的提升了APP的性能和体验。目前这两者都处在完善阶段,在未来很被看好。
桌面应用
以Nodejs和Chromium为基础的框架Electron,使得使用HTML、CSS、JavaScript开发跨操作系统的桌面应用成为可能,应用可以运行在windows、maxOS和linux系统上。
Chrome APP
Chrome浏览器上运行的插件,是运行在Chrome上的HTML应用,完全使用前端技术开发制作。
2010年Google推出了基于Chrome开发的PC端操作系统Chrome OS,特点就是速度快,设计简洁等,相对应的市场上也推出了很多基于Chrome OS的笔记本电脑,厂商有三星和戴尔等。
微信小程序
2017年1月,微信退出小程序,曾一度引爆前端行业。
小程序按照前端技术来设计开发,也做好了系统的兼容和不同设备的适配的设计,开发者只需要专注于实现业务代码即可。所以,只要熟悉前端技术就可以很快的做出一个小程序。
Web VR、Web AR
这两年,新兴并大火的技术是人工智能和机器学习,紧接着的应该就是VR、AR了吧,去年年底QQ和支付宝都在AR和VR方面做出尝试,在抢红包上进行实践。
前端技术webgl,可以在浏览器上很好的实现3D场景,Three.js是这方便很好的JavaScript框架。Chrome浏览器已经兼容Web VR,配合Daydream View,可以浏览Web VR页面。
前后端分离后,需要考虑哪些事情
分离后的前端,不再是一个简单的HTML文件,已经是一个独立的应用系统。除了要考虑页面的数据渲染展示,还要用工程化的思想来考虑前端的架构,前后端的交互和数据安全等事情。
架构
前端应用部署在Nodejs、Nginx或者Nodejs和Nginx组合的服务器上,通过反向代理转发页面请求到后端服务器,相当于在传统的流程中加了Nodejs这一层。当然,也可以用Nodejs服务器来承担一部分负载均衡的工作,业务逻辑也可以放在Nodejs这一层来处理,例如:通过判断请求是来自PC还是APP,将请求发到不同的后端服务器。
RESTful接口交互
转自码个蛋公众号
目录
1. 快捷键2. 基本语法 2.1 字体设置斜体、粗体、删除线2.2 分级标题2.3 链接2.4 分割线2.5 代码块2.6 引用2.7 列表2.8 表格 3. 常用技巧 3.1 换行3.2 缩进字符3.3 特殊符号3.4 字体、字号与颜色3.5 链接的高级操作 1.行内式2.参考式链接3.内容目录4.锚点5.注脚 3.6 背景色3.7 emoji表情符号 4. 高端用法 4.1 Latex数学公式4.2 流程图4.3 制作一份待办事宜—-Todo 列表4.4 绘制 序列图4.5 绘制 甘特图 5. Markdown工具 前言 写过博客或者github上面的文档的,应该知道Markdown语法的重要性,不知道的朋友们也别着急,一篇博客轻松搞定Markdown语法。话说这个语法超级简单,一看就会,不信你点进来看看。
1. 快捷键 跳转到目录
功能快捷键加粗Ctrl + B斜体Ctrl + I引用Ctrl + Q插入链接Ctrl + L插入代码Ctrl + K插入图片Ctrl + G提升标题Ctrl + H有序列表Ctrl + O无序列表Ctrl + U横线Ctrl + R撤销Ctrl + Z重做Ctrl + Y 2.
SELECT top 1 pt.* FROM t1where id='20180731223014'
SELECT top 1 pt.* FROM t1where id='0180731223014 ---字段值没加单引号导致了索引扫描
转载于:https://www.cnblogs.com/guochunyang2004/p/9407378.html
$res=Db::table('list_order')->order('Id','desc')->limit(10)->column('Id,title,author'); $res = Db::table('list_order')->order('Id','desc')->limit(10)->field('Id,title,author')->select(); Column https://www.kancloud.cn/ldkt/tp5_db/229042 field https://www.kancloud.cn/manual/thinkphp5/118077
$res=Db::table('list_order')->where('create_time','like',date('Y-m-d',time()).'%')->fetchSql(true);//打印sql语句->find(1) fetchSql https://www.kancloud.cn/manual/thinkphp5/118089 路由绑定 https://www.kancloud.cn/manual/thinkphp5/118040 看云链接 https://www.kancloud.cn/ldkt/tp5_db/229011 路由 https://www.kancloud.cn/thinkphp/route-master/223108
3Ds max自带一个卸载工具,但很多人没有注意到,只是单纯的在硬盘中进行了删除或者在软件管理中进行了卸载。这就会导致其注册表残存一些注册信息,所以下次安装时无法安装成功,如:安装后发现没有快捷方式,其实就是没安装上。
此时,需要我们手动的删除注册表中的多余信息,以下是相应的操作步骤。
1 开始------运行,输入regedit,打开注册表;
2 删除:HKEY_CLASSES_ROOT下的Max文件夹;
3 删除:HKEY_CURRENT_USER\software\Autodesk\3ds Max;
4 删除:HKEY_LOCAL_MACHINE\software\Autodesk\3ds Max;
5 删除:先打开HKEY_LOCAL_MACHINE \ software \ classes \ installer \ products文件夹,点击其下每一个文件夹,在右边显示栏中可查看ProductName,如果ProductName是3Ds max相应的名称,则删除该文件夹(文件可能很多,请耐心查找,用键盘上的上下键控制比鼠标更方便查阅);
6 删除完毕后可尝试重新安装。
由于电脑配置问题,我下载的是2014版本的3Ds max。。。
友情链接:https://www.cool-de.com/thread-858715-1-1.html
1. 问题分析 /* * 为了使用ajax上传图片,使用了FormData的解决方案,代码如下。 * 实际请求时:发现在iphone中在input[type=file]里面有内容的时候是可以成功请求的; * 但是当input[type=file]里面内容为空的时候却不能成功发送请求 * (备注:Android机没遇到此情况,由此断定,是浏览器内核不同导致的)。 */ var regData = {url:'...', isCommit:false, data:''}; $('#commitBtn').click(function(){ if (regData.isCommit) { return false; } regData.isCommit = true; regData.data = new FormData($('#regForm')[0]); $.ajax({ type: 'POST', url: regData.url, data: regData.data, dataType: 'json', contentType: false, processData: false, success: function (res) { console.log(res); regData.isCommit = false; }, error: function () { regData.isCommit = false; } }); }); 2. 解决方案: /** * 因为时间比较紧急,也没寻找更好的解决方案。如果有大神有更好的解决方案的话,希望留言共享。 * 判断file是否为空,发不同的请求数据 */ if ($('input[name=file]').
前言 对于 HTTP 请求方法,seaconch 一直是有很多疑惑,按照计划今天就来了解一下各个请求有何区别
概述 根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET、POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
seaconch 今天只总结其中常见的几种方法
简单请求与预检请求 1.简单请求 HTTP 1.0 三个方法:HEAD、GET、POST 默认都属于简单请求 Simple Request
没有自定义报头MIME Type in text/plain、multipart/form-data、application/x-www-form-urlencoded 2.预检请求 预检请求 Priflight Request 即在请求之前需要首先由浏览器自发发送 Options 请求的请求
预检请求的范围
一般 HTTP1.1 中的方法请求默认都会触发预检请求
但是简单请求满足一下条件也可以触发 Options 请求
带有自定义头信息MIME Type Not in text/plain、multipart/form-data、application/x-www-form-urlencoded GET 1.方法用途 GET 方法的首要目的是 获取资源 当然您也可以走野路子,不过在这里 seaconch 并不提倡哦
2.方法特点 a) 参数可见
GET 方法的参数是明文可见的包含在 URL 当中,所以说敏感信息不建议使用 GET 方法
不过也正是因此,所以 GET 方法允许被保存书签
b) 数据类型只允许 ASCII
前言,记得某一次开会的时候,学长学姐就说过让我们去看fork源码,结果一直没有时间去看(其实是懒),这不,正好碰上这次开进程的讲座,就在讲座之前看了一波源码,也算是了了一波自己阅读源码的心愿 。
文章目录 1. linux中的PCB的实体(`task_struct`)2. thread_info 结构与内核栈3. 深入理解 fork(1)系统调用:fork、vfork以及 clone 的区别写时复制内核线程与用户线程(略) (2) _do_fork() 函数(2) copy_process( ) 函数(3)dup_task_struct()函数 首先我们得基本了解一下,task_struct 与 thread_info结构是怎么一回事。
1. linux中的PCB的实体(task_struct) 其实标题已经说的很清楚了。它就是我们常说的进程控制块。
PCB通常记载进程之相关信息,包括:
进程状态:可以是new、ready、running、waiting或 blocked等。程序计数器:接着要运行的指令地址。CPU寄存器:如累加器、变址寄存器、堆栈指针以及一般用途寄存器、状况代码等, 主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类别因计算机体系结构有所差异。CPU排班法:优先级、排班队列等指针以及其他参数。存储器管理:如标签页表等。会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。输入输出状态:配置进程使用I/O设备,如磁带机。 总言之,PCB如其名,内容不脱离各进程相关信息。
内核使用双向循环链表的任务队列来存放进程,使用结构体task_struct来描述进程所有信息。
1 进程描述符 task_struct
struct task_struct { } 结构体相当大,大约1.7K字节。大概列出一些看看:
struct task_struct { struct thread_info thread_info; //必须是第一个元素 //这个是进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止。 volatile long state; /* flags是进程当前的状态标志,具体的如: 0x00000002表示进程正在被创建; //通过宏定义实现 0x00000004表示进程正准备退出; 0x00000040 表示此进程被fork出,但是并没有执行exec; 0x00000400表示此进程由于其他进程发送相关信号而被杀死 。 */ unsigned int flags; void *stack; // 指向内核栈的指针,通过他就可以找到thread_info //这个是进程号 pid_t pid; //该结构体描述了虚拟内存的当前状态 struct mm_struct *mm; .
解决:
UserWarning: detected Windows; aliasing chunkize to chunkize_serial
warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")
在import gensim 之前添加下面的语句
import warnings warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
安装完之后重启idea即可!
目录
1.项目整体结构
2.新建c3p0-config.xml文件
3.新建JDBCUtil工具类
4.数据库操作
简易版的c3p0连接。
1.项目整体结构 这里的两个c3p0jar包必须有。
可以去http://mvnrepository.com/搜索jar包名下载,别浪费积分去csdn里面下载了...小编以前被坑过很多次。
2.新建c3p0-config.xml文件 命名必须为c3p0-config.xml,
必须放在src目录下,c3p0包会默认加载src目录下的c3p0-config.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 这是默认配置信息 --> <default-config> <!-- 连接四大参数配置 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbctest</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <!-- 池参数配置 --> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </default-config> <!-- 专门为oracle提供的配置信息 --> <named-config name="oracle-config"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">123</property> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </named-config> </c3p0-config> 3.新建JDBCUtil工具类 package com.test.uitls; import java.
这些天积累也知道了一些关于glibc内存的分配策略。 说pwn 是在内存里捉迷藏其实到这里才真正接触大片的内存。精确控制就能保证精确修改数据。 需要的一个很重要的能力就是跟内存的能力。 这里调试exp用gdb.attach(p)来下断点,弹出调试界面。跟踪内存。 用gdb的x命令/xg参数来查看内存以十六进制8字节显示。 这个程序开启了PIE跟踪不太容易,不过可以用find命令查找输入的字符串来定位地址
查看保护:
liu@liu-F117-F:~/文档/堆溢出学习/off-by-one$ checksec b00ks [*] '/home/liu/\xe6\x96\x87\xe6\xa1\xa3/\xe5\xa0\x86\xe6\xba\xa2\xe5\x87\xba\xe5\xad\xa6\xe4\xb9\xa0/off-by-one/b00ks' Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX enabled PIE: PIE enabled liu@liu-F117-F:~/文档/堆溢出学习/off-by-one$ 保护只关闭了stack
是一个图书管理系统。 主要内容就这么多
__int64 __fastcall main(__int64 a1, char **a2, char **a3) { struct _IO_FILE *v3; // rdi __int64 savedregs; // [rsp+20h] [rbp+0h] setvbuf(stdout, 0LL, 2, 0LL); v3 = stdin; setvbuf(stdin, 0LL, 1, 0LL); sub_A77(v3, 0LL); sub_B6D(v3); while ( (unsigned int)sub_A89() !
目录
一、JS简介
二、JS变量
三、JS数据类型(弱类型)
四、字符串常用方法
五、数组常用方法
六、条件判断
七、循环语句
八、函数
九、浏览器对象
一、JS简介 JavaScript 是属于网络的脚本语言!
JavaScript 被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。
JS代码写在HTML的script标签内。
二、JS变量 JS变量用于存储程序所需要的数据。
语法: var 变量名 = 变量值; 例: var age = 18; var name = “田轩”;
变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如if、while等。
声明一个变量用var语句。
使用等号=对变量进行赋值。
三、JS数据类型(弱类型) 变量可以存储的数据有不同的类型,JS将数据划分为以下类型:
1.数值类型
JavaScript不区分整数和浮点数,统一用Number表示,其值可以是任意数值、NaN、Infinity;
2.字符串
字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"xyz"等等
3.布尔类型
布尔值和布尔代数的表示完全一致,一个布尔值只有true、false两种值,要么是true,要么是false,可以直接用true、false表示布尔值,也可以通过布尔运算计算出来。
4.数组
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。
例如:[1,2,’3’,’田轩’,true]
数组的元素可以通过索引来访问。请注意,索引的起始值为0.
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
5.对象
JavaScript的对象是一组由键-值组成的无序集合,例如:
var person = {
前面几篇文章学习了 Spring Boot Web 开发、JPA 操作数据库、Thymeleaf 和页面的交互的技术。这节课程就综合使用前几节的课程内容,来做一个用户的管理功能,包括展示用户列表(分页),添加用户、修改用户、删除用户。有人说程序员的一生都是在增删改查,这句话不一定全对,但也有一定的道理,相比于这句话,我更认同的是这句:程序员的技术学习都是从增删改查开始的。
这篇文章介绍如何使用 JPA 和 Thymeleaf 做一个用户管理功能。
注:第一部分为代码,第二部分为增删改查操作的截图,完整代码可在github下载。
github地址:https://github.com/zjh746140129/Spring-Boot2.0
项目结构截图:
一、代码片段 1、编写用户类
package com.boot.model; import org.apache.commons.lang3.builder.ToStringBuilder; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import java.util.Date; /** * @Description: 用户类 * @Author: zhoujh * @CreateDate: 2018/6/17$ 上午11:18$ * @Version: 1.0 */ @Entity public class User { @Id @GeneratedValue private long id; @Column(nullable = false, unique = true) @NotEmpty(message="姓名不能为空") private String userName; @Column(nullable = false) @NotEmpty(message="
代码名称说明举例a形容词取英语形容词adjective的第1个字母最/d 大/a 的/uad副形词直接作状语的形容词.形容词代码a和副词代码d并在一起一定/d 能够/v 顺利/ad 实现/v 。/wag形语素形容词性语素。形容词代码为a,语素代码g前面置以a喜/v 煞/ag 人/nan名形词具有名词功能的形容词。形容词代码a和名词代码n并在一起人民/n 的/u 根本/a 利益/n 和/c 国家/n 的/u 安稳/an 。/wb区别词取汉字“别”的声母副/b 书记/n 王/nr 思齐/nrc连词取英语连词conjunction的第1个字母全军/n 和/c 武警/n 先进/a 典型/n 代表/nd副词取adverb的第2个字母,因其第1个字母已用于形容词两侧/f 台柱/n 上/ 分别/d 雄踞/v 着/udg副语素 副词性语素。副词代码为d,语素代码g前面置以d用/v 不/d 甚/dg 流利/a 的/u 中文/nz 主持/v 节目/n 。/we叹词取英语叹词exclamation的第1个字母嗬/e !/wf方位词取汉字“方” 的声母从/p 一/m 大/a 堆/q 档案/n 中/f 发现/v 了/ug语素绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母例如dg 或agh前接成分取英语head的第1个字母目前/t 各种/r 非/h 合作制/n 的/u 农产品/ni成语取英语成语idiom的第1个字母提高/v 农民/n 讨价还价/i 的/u 能力/n 。/wj简称略语取汉字“简”的声母民主/ad 选举/v 村委会/j 的/u 工作/vnk后接成分 权责/n 明确/a 的/u 逐级/d 授权/v 制/kl习用语习用语尚未成为成语,有点“临时性”,取“临”的声母是/v 建立/v 社会主义/n 市场经济/n 体制/n 的/u 重要/a 组成部分/l 。/wm数词取英语numeral的第3个字母,n,u已有他用科学技术/n 是/v 第一/m 生产力/nn名词取英语名词noun的第1个字母希望/v 双方/n 在/p 市政/n 规划/vnng名语素名词性语素。名词代码为n,语素代码g前面置以n就此/d 分析/v 时/Ng 认为/vnr人名名词代码n和“人(ren)”的声母并在一起建设部/nt 部长/n 侯/nr 捷/nrns地名名词代码n和处所词代码s并在一起北京/ns 经济/n 运行/vn 态势/n 喜人/ant机构团体“团”的声母为t,名词代码n和t并在一起[冶金/n 工业部/n 洛阳/ns 耐火材料/l 研究院/n]ntnx字母专名 ATM/nx 交换机/nnz其他专名“专”的声母的第1个字母为z,名词代码n和z并在一起德士古/nz 公司/no拟声词取英语拟声词onomatopoeia的第1个字母汩汩/o 地/u 流/v 出来/vp介词取英语介词prepositional的第1个字母往/p 基层/n 跑/v 。/wq量词取英语quantity的第1个字母不止/v 一/m 次/q 地/u 听到/v ,/wr代词取英语代词pronoun的第2个字母,因p已用于介词有些/r 部门/ns处所词取英语space的第1个字母移居/v 海外/s 。/wt时间词取英语time的第1个字母当前/t 经济/n 社会/n 情况/ntg时语素时间词性语素。时间词代码为t,在语素的代码g前面置以t秋/Tg 冬/tg 连/d 旱/au助词取英语助词auxiliary 的第2个字母,因a已用于形容词工作/vn 的/u 政策/nud结构助词 有/v 心/n 栽/v 得/ud 梧桐树/nug时态助词 你/r 想/v 过/ug 没有/vuj结构助词的 迈向/v 充满/v 希望/n 的/uj 新/a 世纪/nul时态助词了 完成/v 了/ uluv结构助词地 满怀信心/l 地/uv 开创/v 新/a 的/u 业绩/nuz时态助词着 眼看/v 着/uzv动词 举行/v 老/a 干部/n 迎春/vn 团拜会/nvd副动词 强调/vd 指出/vvg动语素动词性语素。动词代码为v。在语素的代码g前面置以V做好/v 尊/vg 干/j 爱/v 兵/n 工作/vnvn名动词 指具有名词功能的动词。动词和名词的代码并在一起股份制/n 这种/r 企业/n 组织/vn 形式/n ,/ww标点符号 生产/v 的/u 5G/nx 、/w 8G/nx 型/k 燃气/n 热水器/nx非语素字非语素字只是一个符号,字母x通常用于代表未知数、符号 y语气词取汉字“语”的声母已经/d 30/m 多/m 年/q 了/y 。/wz状态词取汉字“状”的声母的前一个字母势头/n 依然/z 强劲/a ;/w
TIME: 打印log的时间点;
PID:打印log的进程;
TID:打印log的线程,应该是PID中的线程。
I,D,E,W,V=====》log级别。
TIME PIDTID log级别 log内容07-26 04:14:33.08032652934Imusic_app_MusicProvider: : query uri= content://gnmusic/external/audio/media, table=10007-26 04:14:33.08032652934Dmusic_app_MusicProvider: : query table is 10007-26 04:14:33.09032652753Elibc++abi: Pure virtual function called!
e.target 拿的是点击的对象的属性
如果是 data- 放到外层了,点击里面的元素是拿不到属性值的
而用 e.currentTarget 则是拿 bintap/catchtap 所在的对象的属性~,点击里面的元素一样能拿到属性值
<view class='a-child' data-tid='{{child.ID}}' bindtap='selectChild'> <image class='avatar' src='../../images/localImages/default_user.png'></image> <view class='child-mid'> <view class='mid-top child-name'>{{child.STUDENTNAME}}</view> 示例中 要拿 tid 要如下:
selectChild: function(e) { //获取ID var tid = e.currentTarget.dataset.tid console.log('tid: ' + tid) }, 而如果写成 var tid = e.target.dataset.tid 你点击 image 之类的子元素拿到的是 undefined ,而很多时候子元素基本都占满了父类 view,所以就会出现 undefined 的情况
当然,你也可以每一层元素都加 data-tid 属性~~~这样就能用 e.target.dataset.tid来获取值喽
开发中遇到的,记一下
import turtle
turtle.setup(600,850,200,200)
turtle.penup ()
turtle.fd (-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,120/2)
turtle.fd(40)
turtle.circle(24,180)
turtle.fd(80*2/3)
turtle.done()
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
turtle绘图的基础知识: 1. 画布(canvas)
画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。
设置画布大小
turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。
如:turtle.screensize(800,600, "green")
turtle.screensize() #返回默认大小(400, 300)
turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。
如:turtle.setup(width=0.6,height=0.6)
turtle.setup(width=800,height=800, startx=100, starty=100)
2. 画笔
2.1 画笔的状态
在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。
2.2 画笔的属性
画笔(画笔的属性,颜色、画线的宽度等)
1) turtle.pensize():设置画笔的宽度;
2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
http://gityuan.com/2015/12/20/signal/
一、信号类型 Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。
1.1 概念 不可靠信号: 也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31;
可靠信号: 也称为实时信号,支持排队, 信号不会丢失, 发多少次, 就可以收到多少次. 信号值取值区间为32~64
1.2 信号表 在终端,可通过kill -l查看所有的signal信号
取值名称解释默认动作1SIGHUP挂起 2SIGINT中断 3SIGQUIT退出 4SIGILL非法指令 5SIGTRAP断点或陷阱指令 6SIGABRTabort发出的信号 7SIGBUS非法内存访问 8SIGFPE浮点异常 9SIGKILLkill信号不能被忽略、处理和阻塞10SIGUSR1用户信号1 11SIGSEGV无效内存访问 12SIGUSR2用户信号2 13SIGPIPE管道破损,没有读端的管道写数据 14SIGALRMalarm发出的信号 15SIGTERM终止信号 16SIGSTKFLT栈溢出 17SIGCHLD子进程退出默认忽略18SIGCONT进程继续 19SIGSTOP进程停止不能被忽略、处理和阻塞20SIGTSTP进程停止 21SIGTTIN进程停止,后台进程从终端读数据时 22SIGTTOU进程停止,后台进程想终端写数据时 23SIGURGI/O有紧急数据到达当前进程默认忽略24SIGXCPU进程的CPU时间片到期 25SIGXFSZ文件大小的超出上限 26SIGVTALRM虚拟时钟超时 27SIGPROFprofile时钟超时 28SIGWINCH窗口大小改变默认忽略29SIGIOI/O相关 30SIGPWR关机默认忽略31SIGSYS系统调用异常 对于signal信号,绝大部分的默认处理都是终止进程或停止进程,或dump内核映像转储。 上述的31的信号为非实时信号,其他的信号32-64 都是实时信号。
二、信号产生 信号来源分为硬件类和软件类:
2.1 硬件方式 用户输入:比如在终端上按下组合键ctrl+C,产生SIGINT信号;硬件异常:CPU检测到内存非法访问等异常,通知内核生成相应信号,并发送给发生事件的进程; 2.2 软件方式 通过系统调用,发送signal信号:kill(),raise(),sigqueue(),alarm(),setitimer(),abort()
kernel,使用 kill_proc_info()等native,使用 kill() 或者raise()等java,使用 Procees.sendSignal()等
目录
1.ElasticSearch的简介
2.用数据库实现搜素的功能
3.ES的核心概念
3.1 NRT(Near Realtime)近实时
3.2 cluster集群,ES是一个分布式的系统
3.3 Node节点,就是集群中的一台服务器
3.4 index 索引(索引库)
3.5 type类型
3.6 document:文档
3.7 Field 字段
3.8 shard:分片
3.9 relica:副本
总结:
4. ES集群的安装
4.1 下载
4.2 安装并启动ES
5. 安装 Kibana
5.1 为什么要安装
5.2 安装并启动
5.3 参数解析:
6. ES的相关命令
7. ES的CURD操作
8.DSL语言
9.聚合分析
10.ES的隐藏性
11.ES集群的扩容问题
12.对等式架构
13.ES的primary shard和replica shard
14.ES的容错机制
15.自动生成ID号
16.version之悲观锁和乐观锁
17.ES实战之项目效果
18.项目实战
1)首先用IDEA新建web maven项目
1.ElasticSearch的简介 ElasticSearch:智能搜索,分布式的搜索引擎
是ELK的一个组成,是一个产品,而且是非常完善的产品,ELK代表的是:E就是ElasticSearch,L就是Logstach,K就是kibana
E:EalsticSearch 搜索和分析的功能
L:Logstach 搜集数据的功能,类似于flume(使用方法几乎跟flume一模一样),是日志收集系统
K:Kibana 数据可视化(分析),可以用图表的方式来去展示,文不如表,表不如图,是数据可视化平台
引言: 最近用StringBoot开发了一个简单的小程序服务器,发现通过post请求插入的中文字段在数据库中是显示“???”的形式,本来不以为意,以为是显示的问题,谁知通过get请求获取数据的时候返回的也是“???”,这下就开始慌了,于是开始了问题的排查。以下为排查的过程。
首先上网搜索“mysql中文乱码”,结果倒是一大堆。 - 排除IDE编码问题 按照网上的信息,先排查IDE的问题,看IntellJ是否设置的了UTF-8的编码格式。 打开setting->editor->code Style->FileEncodings,发现IDE已经为UTF-8的编码,因此排除IDE的问题 - 查看服务器中数据库实际编码格式。 使用root用户登陆数据库,然后发送:show variables like 'character%'; 结果显示: 可以看到服务器的编码方式是latin1。查阅资料后发现该编码是MySql的默认编码格式,且该编码不支持中文,因此需要将编码改为utf8格式。 问题找到了,接下来就是怎么样将该编码格式改为utf8的问题,本以为很简单的一件事,却费了我一天的时间来更改。
以下为修改MySql编码过程:
使用命令修改数据库编码 按照网上的说法,登陆数据库,使用命令set character_set_database = utf8; 发现竟然修改成功了,欣喜若狂。再使用命令show variables like 'character%';查看修改结果,显示编码方式已由latin1改为utf8了。 以为问题就这样解决的时候,再次post中文参数,发现还是“???”,更可气的是,该命令修改完的时候显示是utf8的,重启mysql后又重新变为了latin1。
修改my.cnf配置文件 上述方式无效,再查,说修改配置文件my.cnf。在etc/mysql目录下找到my.cnf文件,在该文件添加default-character-set = utf8 于是使用vim命令编辑该文件,将以上字段复制进去,保存退出。 然后用service mysql start启动Mysql。 结果: 再次泪奔。网上查了这个错误是指配置不正确导致不能正常启动。
再查,还有说在my.cnf里加default-character-set = utf8mb4 “mb4”是什么鬼?好吧,先试下,或许在服务器上utf8字段不一样呢? 于是再次编辑启动。 结果: 再次失败告终。
再查,有说在工程jdbc连接添加编码的jdbc:mysql://localhost:3306/xjp?useUnicode=true&characterEncoding=UTF-8 再试,或许是jdbc的锅。于是让my.cnf恢复原来样子。 于是再次启动mysql和工程。 能正常运行了,估计这次八九不离十了,然而再次post中文数据过去,还是“???”。天呐,要崩溃了,网上资料那么多,咋就没一个能用的呢?
或许是有隐藏打开方式?于是网上搜索“mysql my.cnf配置” 网上倒是很多对配置项的讲解,我也不深究那么多了,先跑起来再说。于是直接把别人的my.cnf配置复制粘贴到我的my.cnf。 再次启动mysql。 结果: 好吧!内心一万句MMP。
受到my.cnf配置的启发,于是用windows来做下实验,看下windows的配置是怎么样的。 windows下的mysql配置名为my.ini。于是打开搜索”character”,发现文件有一行#character-set-server=被注释起来了,再一看说明,原来就是用来设置默认编码的。于是赶紧取消注释并加上utf8。 然后重新启动Mysql,发现所有的编码方式已经修改为utf8。且应用运行后使用post传递数据,windows里的mysql居然能正常显示了。这时内心仿佛发现新大陆一样狂燥不已。更令人欣喜的是这个文件顶部的一行文字: 大意是可以直接复制这个文件内容到linux下的my.cnf。 于是把这些内容复制到服务器的my.cnf文件里,然后启动MySql。 结果: 居然连官方也欺骗我,仿佛全世界要把我抛弃了。泪奔。
就在我快要绝望的时候,一道灵光从天上直接打入了我的天灵盖,瞬间开窍了。既然老是提示配置出错,会不会是少加了点什么东西?于是重新去看windows版本的my.ini文件,发现配置下面那么多注释的英文中间会夹杂着[client]、[mysql]、[mysqld]的字样。然后查询了有关的概念。 于是有了这样配置: 就只是在原来的my.cnf文件后面加上了:
[mysqld] character-set-server=utf8 再次保存启动。 终于能正常运行了。于是激动地要去查看数据库编码。 编码也改为utf8了,感觉这次有戏。 于是把之前的测试数据库删掉(保险起见,删除重建,毕竟被坑怕了),再重新创建及启动应用。这次post终于能正常保存中文数据了。这简直比国足赢了世界杯还要高兴。 花了那么多时间,下面总结下这个问题简单的解决方法: 1、在etc/mysql/目录下找到my.
首先先安装axios:
中文文档地址 https://www.kancloud.cn/yunye/axios/234845
安装 使用 npm:
$ npm install axios 使用 bower:
$ bower install axios 使用 cdn:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 引入
在项目中新建一个request.js文件
// request.js import axios from 'axios' // 一些请求的基本配置 const service = axios.create({ baseURL: process.env.API_ROOT,// 接口的域名地址 headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' } }) // 输出方法 export default function request(url, data = {}, method = 'post') { return new Promise((resolve, reject) => { const options = { url, method } if (method.
LED状态说明 闪烁红色:ST-LINK/V2连接到计算机后,第一次USB枚举过程红色:ST-LINK/V2与计算机已建立连接闪烁绿色/红色:目标板和计算机在进行数据交换绿色:通讯完成橙色(红色+绿色):通讯失败 ——————————————————————————————————————————————————————————
由于STM8的SWIM接口只需要4根连接线,所以ST-LINK/V2连接至STM8目标板时需要注意连接位置。
下面为ST-Link/V2 SWIM接口定义:
仿真器端口连接目标板功能1. VDDMCU VCC连接STM8目标板的电源VCC2. DATAMCU SWIM pin连接STM8目标板的SWIM PIN3. GNDGND连接STM8目标板的电源GND4. RESETMCU RESET pin连接STM8目标板的RESET PIN 下面是ST-Link/V2 SWIM标准的接口排列:
ST-Link/V2 SWIM指定的标准接口
———————————————————————- ——————————————————————————————————– STM32的JTAG / SWD接口是通过20PIN连接线连接目标板,所以ST-LINK/V2连接至STM32目标板时需要注意连接方向。
下面为ST-Link/V2 JTAG/SWD接口定义:
仿真器端口连接目标板功能1. TVCCMCU电源VCC连接STM32目标板的电源VCC2. TVCCMCU电源VCC连接STM32目标板的电源VCC3. TRSTGNDGROUND4. UART-RXGNDGROUND5. TDITDI连接STM32的JTAG TDI6. UART-TXGNDGROUND7. TMS, SWIO TMS, SWIO连接STM32的JTAG的TMS, SWD的SW IO8. BOOT0GNDGROUND 9. TCK, SWCLK TCK, SWCLK连接STM32的JTAG的TCK, SWD的SW CLK10. SWIMGNDGROUND11. NCNCUnused12. GNDGNDGROUND13. TDOTDO连接STM32的JTAG TDO14. SWIM-RSTGNDGROUND15. STM32-RESETRESET连接STM32目标板的RESET端口16. KEYNCGROUND17. NCNCUnused18. GNDGNDGROUND19. VDDNCVDD (3.3V)20. GNDGNDGROUND 下面是ST-Link/V2 JTAG/SWD标准的接口排列:
ST-Link/V2 JTAG/SWD指定的标准接口
现象访问地址
此原因可能是dns 解析的问题
dns解析:(人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应一个ip地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。)
驱动编译: 安装VS2017 和WDK 10 ,下载地址:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
如果安装VS2017时没有选择安装windows SDK,打开Visual Studio Iinstaller添加安装sdk组件
VS2017安装完成,启动下载好的wdksetup安装wdk10。
创建驱动项目例子:
打开VS2017进行项目属性配置:
按照上面的项目属性设置后,编译项目输出如下:
驱动调试(网络调试): 主计算机(192.168.0.102)目标计算机(192.168.0.106 ) ( 虚拟机也可以)
确保两台计算机互相ping通(最简单的办法就是将防火墙关闭)
目标计算机(WIN8及以上系统):
以管理员权限运行CMD
//允许进行内核调试
bcdedit /set {default} DEBUG ON bcdedit /set TESTSIGNING ON bcdedit /debug on //hostip 为主计算机ip,port为网络通讯端口,key为网络通讯所需密钥(主计算机VS2017配置驱动调试时需要填入)
bcdedit /dbgsettings net hostip:192.168.0.102 port:50000 key:1.2.3.4 //查看settings
bcdedit /dbgsettings 将主计算机编译的驱动安装在目标计算机上进行代码调试。)
将wdk安装目录下的WDK Test Target安装程序拷贝到目标计算机安装,C盘DriverTest目录下devcon进行驱动安装(网上查询devcon命令安装驱动)
*
主计算机:
VS2017菜单栏 => Test =>Configure Devices
VS2017进行源代码调试:*
windbg命令
//指定驱动所需的程序调试数据库路径(编译驱动输出的.pdb文件路径) kd> .sympath G:\点滴记录\7-28\driver\KMDF Driver1\x64\Debug //重载 /n只加载内核模块(根据需求选择) kd> .reload /n /f //在代码处设置断点,运行调试 kd> g 目标计算机触发驱动,进入断点调试。
首先找一个echarts实例
然后自己搭建环境运行
var lineChart = echarts.init(document.getElementById('event_pandect'),'macarons');(添加) option = { title : { text: '某站点用户访问来源', subtext: '纯属虚构', x:'center' }, tooltip : { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, legend: { orient: 'vertical', left: 'left', data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] }, series : [ { name: '访问来源', type: 'pie', radius : '55%', center: ['50%', '60%'], data:[ {value:335, name:'直接访问'}, {value:310, name:'邮件营销'}, {value:234, name:'联盟广告'}, {value:135, name:'视频广告'}, {value:1548, name:'搜索引擎'} ], itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.
说到巨人网络第一反应一定是游戏,对于我来说更吸引我的是他们公司的董事长:史玉柱。他经历过负债过后却没有被生活打倒,横跨多个领域:游戏,保健品等再一次成功。这一点对我来说还是蛮牛逼的。所以对巨人网络是有一定的好感,最起码对这公司是有企业认同感的。
基于上述的原因每每在51job上面看到巨人有招H5的开发师时,我都会去投递。功夫不负有心人,终于在7月24号晚上收到巨人的面试邀请。
首先从松江大学城地铁站去巨人二期建议选择打的,离地铁真的还蛮远的。在面试前我也看了大量的js的相关问题。做最好的准备但抱最坏的期望。
面试对于大多数的人来说是你进入这一家公司的平台,但是对我来说更多是一场考试,一次丰富自己前端甚至是后台知识方面的旅行。在前端行业中,不得不说的是技更新的很快,VIEW.JS ,TYPESCRIPT.JS都在崛起。你的技术是原地踏步还是说在不断前进在面试中会有一个很好的体现,当然每一次的面试题目也会让你去思考。我每一次的面试的都会把自己不知道的问题记下来,面试后就去百度搜索相关的资料,不理解的去弄懂!所以面试对我来说更加是一个快速提高自我能力的平台。(TIPS: 注意的是尽量去大公司面试,大公司的面试官我接触下来素质比较高,而且越是大公司的给我感觉是越平易近人。)
下面说正式的面试流程:
第一步还是填写表格,表格内容大多是一样的,如实填写即可。
第二步就是等人事带你上去,到了3楼以后人事带我去了会议室,我从10点半等到了10点50吧,足足20分钟。当时都想写一个字条然后自己跑路了。我觉得对于面试无论是公司还是个人都应该准时出席。这是最起码的尊重彼此的表现。
终于等到面试官,感觉人还是不错的,他一开始问了你知道巨人主要做什么吗?我脱口而出游戏。
然后就开始问我你觉得你的JS怎么样?我说还可以。
下面是具体的问题:
1、说说JS中的闭包 (这个我博客中已经提到了)
2、说一下 == 和 === 的区别
3、说一下原型链
以上三个问题我都很好的回答了然后他看了我的简历说你会java 我说我大学的时候学到过
4、面向对象的三大特点 (我当时只记得了继承,其他两个封装和多态真的是忘记了。)
面试官对我说其实无论是那种语言都是有面向对象的,恩 之前对这一块除去继承我了解的不多。
5.说说你理解的MVC?
6.说说你们项目中是怎么运用到的MVC
7.谈谈内聚和耦合?(这个一脸懵逼内聚我完全不了解,耦合我只记得了写代码一定要解耦)
8.说说链式作用
9、int 占多少内存
10、ajax底层实现方式
11、js中的垃圾回收机制?
后来和我谈到了算法:
图形算法,向量算法,矩阵算法,
一开始问我的是 贪吃蛇这款游戏说说设计思路,我想了很久因为没有接触过一片空白,后来面试官就觉得有点难度 就问我三角形内有一点 怎么判断这个点是在三角形内?
最后回答问题完毕以后他看着我的简历说 年轻了点,因为我是17届毕业的。然后问我有什么问题吗?然后我说没有,他好像有点诧异,然后我就问了面向对象是哪三大特点。面试官很细心的和我解答了一下,还和我提到了内聚函数和耦合。
后来他说你等一下,我以为结束了 下面一个应该是人事 但是又来一个技术
他就问了我一个问题是 你知道canvas吗 我说我公司的项目中没有用到过但是我自己有了解和实践过。
然后就结束一整套的流程
不过面试完以后我觉得这次面试还是值的,最起码我又知道自己哪些地方不够,可以朝着这个方向继续努力~加油!
分页加载20条数据,getTwentyRec(int offset)中控制页数offset++即可 DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context, "arnold.db"); DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb()); AbstractDaoSession daoSession = daoMaster.newSession(); List<UserEntity> listMsg = daoSession.queryBuilder(UserEntity.class).offset(offset * 20).limit(20).list(); (1)orderAsc:升序排序 (2)orderDesc: 降序排序 (3)eq():== (4)noteq():!= (5)gt(): > (6)t():< (7)ge:>= (8)le:<= (9)like():包含 (10)between:俩者之间 (11)in:在某个值内 (12)notIn:不在某个值内 userDao.queryBuilder() .where(Properties.FirstName.eq("Joe")) .orderAsc(Properties.LastName) .list(); orderDesc 排序后截取分页加载数据 /** * 分页条件查询实体集合 * * @param entityClass * @param offset * @param limit * @param where * @param selectionArgs * @param <T> * * @return */ public <T> List<T> queryPage(Class<T> entityClass, int offset, int limit, String where, Property properties, Object.
这两天有许多Python小白加入学习群,并且问了许多关于Pycharm基本使用的问题,今天小编就以配置Python解释器的问题给大家简单絮叨一下。
1、一般来说,当我们启动Pycharm,如果Pycharm正常激活的话,就会直接进入到Pycharm中去,并且Pycharm经常会弹出下图的界面。(如果有小伙伴的Pycharm尚未激活,可以站内私信,小编这有好几个激活码,给大家分享。)
其实这个是Pycharm的提示信息,一般是Pycharm的简易或快捷方式介绍或者其他的Pycharm功能说明,大家完全可以不用理会,直接点击右下方的“Close”即可,不会对你产生任何影响。
2、之后我们可能会碰到一个问题,先后有好几个小伙伴咨询Pycharm安装后并不能直接写代码,并且有图为证,如下图所示。
一看到这个提示,就知道Pycharm中尚未配置Python解释器,此时不用慌,并不是Pycharm没有安装成功,而是因为有个配置尚未完成,只需要配置好Python解释器之后,一切都会正常。其实Python解释器的配置并不难,具体的教程如下。
3、首先点击上图中“Configure Python Interpreter”,之后Pycharm就会自动定位到“Project Interpreter”这个位置,如下图所示,该界面是Pycharm的设置窗口之一,专门用于配置Python解释器的。
4、此时只需要点击“Project Interpreter”右侧的小三角下拉框,如下图右侧的红色小框框所示。
5、点击该按钮之后,Pycharm会自动弹出Python的解释器路径,如下图所示。
6、此时只需要选择其中一个Python解释器,就可以配置成功了。在这里,以第一个Python解释器为例,点击之后,等待Pycharm进行加载,如下图所示。
7、此时可以看到“Project Interpreter”已经有Python解释器了,并且相关的库正在加载中(Loading),稍等片刻之后就可以加载成功。相关库加载好之后,Python解释器配置就完成了,如下图所示。
8、点击“Apply”,表示将相关库加载到Python解释器中,稍等片刻即可,等“Apply”这个选项卡灰化之后,再点击“OK”选项卡,如下图所示。
9、接下来Pycharm就会自动关闭“Setting”窗口,自动回到Pycharm主页面中,并且会显示加载Python解释器的过程,如下图所示,稍等片刻之后就会完成。
10、顺利加载完成之后,之前的提示就会消失了,此时Pycharm一起回复正常,如下图所示。
现在,小伙伴们就可以自由的使用Pycharm敲代码啦~~~
11、如果在“Setting”窗口中的“Project Interpreter”下拉框中没有弹出Python安装路径或者弹出的路径位置不对,则需要点击旁边的那个设置按钮,如下图所示。
12、之后会弹出下图的对话框,点击第一个“Add Local”,表示从本地添加Python解释器。
此时Pycharm就会定位到本地磁盘,此时你要做的就是将Python的安装位置找出来,然后点击“OK”进行确认即可。
13、之后的操作步骤就和上面正常加载Python解释器的步骤一样了,祝大家一切顺利。
小伙伴们,这下你们应该get到Pycharm中该如何加载Python解释器的正确姿势了吧?
前言:作为一个程序员,怎么不会一些很酷的操作呢,不然怎么吸引MM呢,今天就来操作一下在idea编辑器下设置背景图。先上图感受一下。 是不是很炫酷,下面就开始吧!
第一步:打开设置界面 第二步:进入插件功能搜索我们需要的插件(Background Image Plus), 第四步:下载安装。 下载好了一路ok就可以了,页面会出现下面提示
点击Restart 重启。
第五步:设置背景图。重启之后的操作,请看下图。 点击进入背景图片设置。
之后就可以看见你的idea编辑器的背景就是你设置的图片了。
目录结构说明:整个集群采用node63 node64 node65 node66 node67 node69 node70节点 **Hadoop:**node63作为namenode,node64作为secondarynamenode,node65,node66 node67 node68 node69 node70作为datanode **Zookeeper:**node63 node64 node65 node66 node67 node69 node70都有部署,一般node66作 为 leader **Hbase:**node63 node64 node65 node66 node67 node69 node70都有部署,一般选取node63作 为HMaster,node64作为备用的。 HIve:node63作为HIve服务端,node70作为客户端 **Pig:**node63 **Spark:**node63 node64 node65 node66 node67 node69 node70都有部署 **Mysql:**node63,node64,选取node63作为本地策略 **Sqoop:**node63
node63目录截图: node70目录截图: node64-node69截图: 关闭个节点的防火墙。 各个节点的/etc/profile配置截图: export JAVA_HOME=/usr/local/jdk1.8.0_172 #这里路径为自己解压的JDK的路径 export CLASSPATH= JAVAHOME/libexportPATH= J A V A H O M E / l i b e x p o r t P A T H = {JAVA_HOME}/bin: PATHexportHADOOPHOME=/root/hadoop−2.
网上下载了一个Yolo(keras+tensorflow)网络的训练代码,在运行的时候,报了以下错误:load_weights() got an unexpected keyword arguement 'skip_mmismatch'。在网上搜索了半天,也没有发现具体原因,最后,仔细看了看这句话的报错,因为我调用的是一个keras的内置函数,却报了没有这个参数的错,就想到了版本问题。最后将keras进行升级(我的升级到了2.1.5版本),这个问题就解决了。
总结: 在跑keras和tensorflow程序的时候遇到了好多次这种版本导致的问题。因为深度学习现在发展比较迅速,所以很多框架的API更新比较快,以后debug的时候一定要注意排查版本问题。
原图如下 处理代码
#include<iostream> #include<opencv.hpp> using namespace cv; using namespace std; /* 函数功能:在输入图像中找一条直线 输入输出:输入的图像是灰度图raw,返回值为dst,返回值是一条白色的线 lines = cvHoughLines2(canny, stor, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 80, 200, 30); 参数中的200是指要找的直线长度要在200个像素以上; 参数中的30指的是两条在同一直线上的线段,如果相隔不到30,则把它们连起来 */ void findLines(IplImage* raw, IplImage* dst) { IplImage* src = cvCloneImage(raw); // clone the input image IplImage* canny = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); // create a tmp image head to save gradient image cvCanny(src, canny, 20, 200, 3); // Generate its gradient image CvMemStorage* stor = cvCreateMemStorage(0); CvSeq* lines = NULL; // find a line whose length bigger than 200 pixels lines = cvHoughLines2(canny, stor, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 80, 200, 30); cvZero(dst); CvPoint maxStart, maxEnd; // save the coordinate of the head and rear of the line we want int maxDistance = 0; // The maximum distance of all lines found by [cvHoughLines2] for (int i = 0; i < lines->total; i++) // lines->total: the number of lines { // variable 'lines' is a sequence, [cvGetSeqElem] gets the (i)th line, and it returns its head and rear.
Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise checkLogin: () => { // 返回一个promise对象 return new Promise((resolve, reject) => { axios({ url: url method: 'post', data: { } }) .then((res) => { resolve(res.data); // console.log(res); }) .catch(function (error) { reject(error); // console.log(error); }); }); } 调用 this.common.checkLogin() .then(res => { console.log(res); // 执行成功的回调函数 }, error => { console.log(error); // 执行失败的回调函数 }); 可以关注一下
选择一个数据库,点击“查询”,在右侧点击“创建查询”,输入SQL语句,点击“执行”就可以了 示例SQL: CREATE TABLE `test`.`users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 注意加粗的地方,需要指定哪个数据库的表。不能只写表名,要写数据库名.表名的形式
直接上代码:
import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; import org.apache.log4j.Logger; public class CommonUtil { private static Logger logger = Logger.getLogger(CommonUtil.class); public static short[] bytesToShort(byte[] bytes) { if(bytes==null){ return null; } short[] shorts = new short[bytes.length/2]; ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts); return shorts; } public static byte[] shortToBytes(short[] shorts) { if(shorts==null){ return null; } byte[] bytes = new byte[shorts.length * 2]; ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shorts); return bytes; } public static void main(String[] args) { byte[] ba = {21,32,45,98,46,85}; short[] sa = bytesToShort(ba); byte[] bb = shortToBytes(sa); System.
中午打算用笔记本连电视看剧,发现ubuntu的WIFI图标为空,所有的WIFI连接都不显示,连接网线也不太好使。想起前一天Ubuntu自己更新了一次,可能是更新导致的问题,于是检查硬件情况:
# 命令行输入 sudo lshw -C network # 发现WIFI状态为 UNCLAIMED 于是进入System settings下 Software & Updates项,再进入Additional Drivers, 发现使用的驱动是Broadcom的一个驱动,
在网站askubuntu看到,这个驱动可能导致无法联网,所以将其卸载:
sudo apt-get purge bcmwl-kernel-source 卸载后重启即可恢复WIFI连接。
参考连接:
https://askubuntu.com/questions/812553/network-unclaimed
1 简介 LSD是一种线段检测算法,该方法能在较短的时间内获得较高精度的直线段检测结果。
LSD直线检测算法首先计算图像中所有点的梯度大小和方向,然后将梯度方向变化小且相邻的点作为一个连通域,接着根据每一个域的矩形度判断是否需要按照规则将其断开以形成多个矩形度较大的域,最后对生成的所有的域做改善和筛选,保留其中满足条件的域,即为最后的直线检测结果。该算法的优点在于检测速度快,而且无需参数调节,利用错误控制的方法,提高直线检测的准确度。
2 算法介绍 LSD直线检测方法首先计算每个像素点的水平线(Level-Line)角度,从而形成了一个水平线场(Level-Line Field),即单位矢量场。这里像素点的水平线角度就是该点梯度方向的垂直角度,如图2-1所示,而水平线场就是一个与图像中的点一一对应的矩阵,矩阵中元素的值即为对应到图像中点的水平线角度,如图2-2中间图所示。
获得水平线场后,依据水平线角度用区域生长的方法将其切割成若干个连通域,每个连通域中所有像素点的水平线角度变化不能超过容忍值,这样的连通域称为线支持区域(Line Support Regions),每个线支持区域都是线段检测的候选对象。如图2所示,绿色区域、橙色区域和蓝色区域各是一个线支持区域。
获得线支持区域后,把线支持区域的主惯性轴方向作为矩形方向,构造一个包含区域中所有点的矩形,如图2-3所示构造方式在3.6节中详细说明。然后将矩形中所有水平线方向角度与矩形方向角度偏差小于的点叫做对齐点(Aligned Point)如图2-4所示,设一个矩形内总的点数为,其中对齐点点数为,这将用于之后验证矩形是否能作为线段检测结果。
矩形的验证方法是基于Desolneux, Moisan, and Morel提出的contrario方法和Helmholtz法则,所谓的亥姆霍兹原理指出,不应在噪声图像上产生感知(或检测),因此,相反的方法提出定义噪声或相反的模型,其中不存在期望的结构。在含有线段的情况下,我们对对齐点的数量感兴趣,因此考虑噪声模型中的虚警线段具有与所观测的真实线段一样多或更多对齐点的事件。给定图像和矩形,定义表示矩形中对齐点的数量,表示矩形中像素点的总数,这样上述事件发生的次数即为
也就是说这种事件发生即表示产生一个直线段检测的虚警。其中表示被考虑到的矩形总数,表示一个矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率。是模型对应的噪声图像,即为一个各个元素独立同分布的的矩阵,其尺寸与真实图像一致,每一个元素是在上服从均匀分布的独立随机变量。
任意一个像素点属于对齐点的概率为
于是矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率为
设图像的尺寸为,矩形的宽度最大为,因此所有可能的矩形个数为,考虑到后续对于值还有其他的测试值而不仅仅是,设为个,因此测试矩形总数为
最后定义虚警的个数(the Number of False Alarms)为
设置一个NFA的阈值,如果一个矩形满足,那么就可以将其保留为一个直线段检测结果。
整体算法的过程图如图2-5所示。
3 详细论述 3.1 图像缩放 为了解决数字离散图像的阶梯效应,如图3-1所示,两种情况的直线段检测结果是合情合理的,但是并非我们所希望看到的结果。图3-2给出了缩小至原图的80%后再进行直线段检测的结果,两个边缘都被检测出来。
论文给出的缩放比例是原图像的80%,即缩放后是尺寸是,则缩放前是,缩放的方法用的是高斯降采样,而高斯核的标准差,这里取值0.6,而S取值0.8,可以在避免混叠和避免图像模糊之间获得良好的平衡。
3.2 梯度计算 图像梯度是按照的掩膜计算的,给出图像的局部灰度值如图3-3所示。
那么梯度计算如下
于是水平线角度为
那么梯度幅值为
3.3 梯度伪排序(Pseudo-Ordering) 一般的排序算法需要次操作,而伪排序只要线性的时间即可完成,即与排序的点数n呈线性关系。
首先构建1024个bins,然后把图像中所有点根据梯度值分到这些bins中,然后从大到小逐个生长,也就是获得了线支持区域,这里需要说明的是,从不同的点开始生长,得到的线支持区域结果也不一样。
3.4 梯度阈值 梯度值小的像素对应于图像中平滑或者变化较缓的区域,而它们在量化时将会引起更大的梯度计算误差。在LSD算法中,通过设置梯度阈值,梯度值小于的点不会在线支持区域和矩形中使用。
假设量化噪声为,一个图像为,那么就有观测值
于是误差角度,如图3-4
要使,所以应有
这里取经验值2。
3.5 区域生长 LSD算法的区域生长跟我们以往所了解的区域生长算法原理大致相同,它利用伪排序得到的排序列表中梯度幅值大的点作为种子点,以该点的水平线角度作为区域的初始角度,然后在八邻域中寻找与的偏差小于容忍值的点,然后将该点加入到区域中并更新,更新方式为
上式中遍历区域中的所有点。当区域中所有点的八邻域中都不满足与的偏差小于容忍值时,此时停止生长,算法的处理过程如图3-5所示。
3.6 矩形逼近 对每一个线支持区域在验证之前,需要先进行一次矩形逼近,构造一个特定的包含区域中所有点的矩形。构造的原理如下。
首先把整个区域当做一个实体,而区域中每个像素点的梯度大小为点的质量,这样整个实体就有一个质心,将质心作为矩形的中心点。假设区域中点的坐标为,对应的质量为,那么矩形的中心为
,
然后确定矩形的朝向角度,其角度设置为与矩阵M的最小特征值相关联的特征向量的角度。
其中,,的值分别为
确定了矩形的中心和矩形的朝向后,包含区域所有点的最小矩形即为逼近得到的矩形。
3.7 对齐点密度(Aligned Points Density) 对于一个线支持区域和对应的逼近矩形,区域中对齐点的数量为,那么该矩形的对齐点密度为
如果矩形的对齐点密度,则可以接受该矩形检测结果,如果不满足要求,则对矩形做两种处理:减少角度容忍值,根据设置半径对矩形裁剪。
rest
是一种软件架构风格,如果你们的接口是 rest
接口,那么就可被认为你们的的接口是restful的,英文名词和形容词的区别。
rest
接口是围绕“资源”展开的,利用HTTP的协议,其实rest本也可以和HTTP无关,但是现在大家普遍的使用 rest
都是依托于HTTP协议。HTTP 的url即资源。
RFC 3986
定义了通用的URI语法:
URI = scheme “://” authority “/” path [ “?” query ][ “#” fragment ] scheme: 指底层用的协议,如http、https、ftphost: 服务器的IP地址或者域名port: 端口,http中默认80path: 访问资源的路径,就是咱们各种web 框架中定义的route路由query: 为发送给服务器的参数fragment: 锚点,定位到页面的资源,锚点为资源id RESTful API设计 资源路径 对于rest资源的定义,即URL的定义,是最重要的;想要设计出优雅的、易读的rest 接口,其实还是听不容易的。
URL中不能有动词 在Restful架构中,每个网址代表的是一种资源,所以网址中不能有动词,只能有名词,动词由HTTP的 get、post、put、delete 四种方法来表示。
URL结尾不应该包含斜杠“/” 这是作为URL路径中处理中最重要的规则之一,正斜杠(/)不会增加语义值,且可能导致混淆。REST API不允许一个尾部的斜杠,不应该将它们包含在提供给客户端的链接的结尾处。
许多Web组件和框架将平等对待以下两个URI:
http://api.canvas.com/shapes/
http://api.canvas.com/shapes
但是,实际上URI中的每个字符都会计入资源的唯一身份的识别中。
两个不同的URI映射到两个不同的资源。如果URI不同,那么资源也是如此,反之亦然。因此,REST API必须生成和传递精确的URI,不能容忍任何的客户端尝试不精确的资源定位。
有些API碰到这种情况,可能设计为让客户端重定向到相应没有尾斜杠的URI(也有可能会返回301 - 用来资源重定向)。
正斜杠分隔符”/“必须用来指示层级关系 rul的路径中的正斜杠“/“字符用于指示资源之间的层次关系。
例如:
http://api.user.com/schools/grades/classes/boys
- 学校中所有的男生
http://api.college.com/students/3248234/courses
- 检索id为3248234的学生学习的所有课程的清单。
应该使用连字符”-“来提高URL的可读性,而不是使用下划线”_” 为了使URL容易让人们理解,请使用连字符”-“字符来提高长路径中名称的可读性。
一些文本查看器为了区分强调URI,常常会在URI下加上下划线。这样下划线”_”字符可能被文本查看器中默认的下划线部分地遮蔽或完全隐藏。
为避免这种混淆,请使用连字符”-“而不是下划线
URL路径中首选小写字母 RFC 3986将URI定义为区分大小写,但scheme 和 host components除外。
统计数字的二进制表示的中的 1 的个数 自己写的 思路 9 = ret[8] + ret[9-8] 12 = ret[8]+ret[12-8] i = ret[ 小于i的2的最大幂次 j ] +ret[ i-j ] 代码 /** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ int* countBits(int num, int* returnSize) { *returnSize = num+1; int* res = (int*)malloc(sizeof(int)*num+1); for(int i=0;i<=num&&i<=2;i++){ if(i == 0){ res[i] = 0; } else{ res[i] = 1; } } if(num<=2){ return res; } int* index = (int*)malloc(sizeof(int)*num+1); memset(index,0,num*sizeof(int)); int count = 2; int bcount = 2*count; for(int i=2;i<=num;i++){ if(i>=count && i<bcount){ index[i] = count; } else{ index[i] = bcount; count = bcount; bcount = 2*count; } } res[0] = 0; res[1] = res[2] = 1; for(int i=3;i<=num;i++){ if( index[i] ==i ){ res[i] = 1; } else{ res[i] = res[index[i]] + res[ i-index[i] ]; } } free(index); return res; } 看到别人的代码 才知道什么叫做 excellent idea 参考 338.
原创:http://blog.csdn.net/yxh265/article/details/51483822
iOS线程间的通信 iOS中,两个线程之间要想互相通信,可以使用:NSMachPort 下面是例子
#define kMsg1 100 #define kMsg2 101 - (void)viewDidLoad { [super viewDidLoad]; //1. 创建主线程的port // 子线程通过此端口发送消息给主线程 NSPort *myPort = [NSMachPort port]; //2. 设置port的代理回调对象 myPort.delegate = self; //3. 把port加入runloop,接收port消息 [[NSRunLoop currentRunLoop] addPort:myPort forMode:NSDefaultRunLoopMode]; NSLog(@"---myport %@", myPort); //4. 启动次线程,并传入主线程的port MyWorkerClass *work = [[MyWorkerClass alloc] init]; [NSThread detachNewThreadSelector:@selector(launchThreadWithPort:) toTarget:work withObject:myPort]; } - (void)handlePortMessage:(NSMessagePort*)message{ NSLog(@"接到子线程传递的消息!%@",message); //1. 消息id NSUInteger msgId = [[message valueForKeyPath:@"msgid"] integerValue]; //2. 当前主线程的port NSPort *localPort = [message valueForKeyPath:@"localPort"]; //3.
说明 在数据库字段命名规范中,通常使用下划线“_”来连接两个单词,比如:user_type。但是在Java开发中,实体字段通常采用驼峰命名法,因此会在mapper文件的SQL语句中使用 “AS”设置别名来匹配实体。
select user_type as userType from t_user Mybatis 在 settings 配置项中有一个 mapUnderscoreToCamelCase 参数,设置为True即可开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射,默认为False。
设置 打开Mybatis的全局配置文件,在 中添加 mapUnderscoreToCamelCase 参数项,设置value为true即可。
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> SQL语句即可省略”AS”别名的添加,如下所示:
select user_type from t_user
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例 2:
输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] 说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的原地算法。 class Solution(object): def rotate(self, nums, k): """ :type nums: List[int] :type k: int :rtype: void Do not return anything, modify nums in-place instead.
本文参考自Jenkins相关资料,结合本人实际使用情况编写。 相关文档:
《Jenkins:The Definitive Guide》 ——10.4 Multiconfiguration Build Jobs《Building a matrixproject》 可以解决的问题: 有时,我们希望项目能够根据不同参数、或不同环境来编译,若使用多个项目来实现,则有些浪费资源,那么最好是可以实现:在一个项目中,就能根据给出的不同参数来编译不同版本。 我这里以自定义参数为例。
思路 比如当前项目的参数有四种(非完整参数,简单举例而已)
python -Purpose test -version 1.0 python -Purpose release -version 1.0 python -Purpose test -version 1.1 python -Purpose release -version 1.1 可以看到 Purpose 和 version 参数是可变的,那我们可以利用两个变量将以上参数简化为一条:
python -Purpose %purp% -version 1.%ver% 其中的 purp 可取值为 test 或 release,ver 可取值为 0 或 1.
有了目标,接下来就是在Jenkins中的应用实践。
步骤 1、需要新建一个任务,类型为:构建一个多配置项目(Build multi-configuration project) 2、其他设置与一般任务相同,只是多了一个模块 Configuration Matrix a)在Add axis中,选择User-defined Axis,本例需要两个变量,所以需要再增加一个User-defined Axis b)这里定义变量和对应的值,Name中是变量名,Values中是变量可取的值,中间以空格或回车隔开(注意:当可取值比较复杂的时候,建议每个值用英文双引号隔离,值之间仍以空格、回车隔开),如图,填入前面提过的变量和值,此时 purp 和 ver 就是可以在构建参数中直接使用的变量了 c)这个模块的下方有两个可选项需要注意:
在写注释的时候会发现输入法不跟随,这是idea工具本身存在的bug,这个问题很头疼,我找了好多办法都不行,比如删除idea自带的jre,这个办法对我的2018.1.5版本并不适用,以下办法是不需要删除任何东西,分分钟解决问题
如下图所示:
现有如下办法解决输入法不跟随问题。 使用快捷键ctrl+shift+A,在输入框中输入Switch Boot JDK,如图所示
默认选中idea自带的jre也是绿色的(我已经改过了所以默认显示<reset to default>) ,此时我们应该选择 。。。 ,然后选择本地的jdk所示路径(我的idea是64位,JDK也是64位,如果版本不统一是不能选择的,它会提示版本错误) 最后点击保存,重启之后输入法就可以跟随光标了。
重启之后问题解决,我没有测试其他版本的idea,你可以使用此办法试试其他版本。
一直使用Visual Studio + WDK的方式开发Windows驱动,最近想在VS2017下安装WDK10开发驱动,结果遇到问题了,首先是没法实现双机调试,然后是编译出来的驱动在Win7平台下一加载就蓝屏,定位到是security_cookie的问题,紧接着又是生成的驱动与老版本Window兼容性的问题,最后是KdPrint消息看不到的问题。本文主要对遇到的这些问题和解决办法进行记录,主语虚拟机中Win7的安装等常规操作则略过,安装好后的配置,搜一下“虚拟机win7 双机调试”也都能解决。
搭建双机调试环境时的坑 WinDBG提示找不到对应串口,需将虚拟机中的打印机删除,该打印机默认占用了COM1口:
对应WinDBG参数为:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,resets=0,reconnect -y SRV*E:\DBGSymbols*E:\MySymbols*http://msdl.microsoft.com/download/symbols 解决由于Security Cookie初始算法不兼容导致的加载时蓝屏 用VS2017配合WDK10搭了个驱动开发环境,用其中的WDM模板写了个NT式的HelloWorld驱动,编译后拖到测试机里运行居然蓝屏了。故障定位是/GS机制造成的:
这个问题有两种解决方案,第一种算是官方途径,建议大家在没有其他特殊需求的情况下采用这种方案。
方案一:更改目标平台 建议首选此方法:在驱动工程属性中,找到“Driver Settings”项,然后将其“General”子项中的“Target OS Version”设置成Windows 7即可,如下图所示。
方案二:修改链接到的KernelBufferOverflowLib库 将产生故障的代码放到IDA里仔细看看:
很明显,这里就和0x0BB40E64E这个魔数杠上了,只要二者相等就直接蓝屏。当然,直接关闭/GS这个编译开关肯定能解决,但也就意味着程序可能被栈溢出攻击。其主要问题是在Win7下,Loader将__security_cookie就是初始化成了这个值!将这个16进制数搜一下,第一篇链接就解答了我们的疑惑。
WDM驱动针对Win8前后系统的兼容性问题(张佩)
为不同版本的 Windows 构建驱动程序
同时也给出了解决方案:
手动编译,手动设定KernelBufferOverflowLib的路径: >msbuild /p:KernelBufferOverflowLib="C:\Program Files (x86)\Windows Kits\8.1\Lib\win8\km\x64\BufferOverflowK.lib" /p:platform=x64 /p:Configuration="Win8 Release" myDriver.sln 用记事本打开驱动项目的工程文件(.vcproj)并添加下面的内容: <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib<KernelBufferOverflowLib> 然而我们是在VS下编译,应该可以直接设置lib库的路径,试了一下,果然可以:
再看看生成的驱动程序中cookie初始化部分:
INIT:00404010 ; =============== S U B R O U T I N E ======================================= INIT:00404010 INIT:00404010 ; Attributes: library function bp-based frame INIT:00404010 INIT:00404010 ___security_init_cookie proc near ; CODE XREF: GsDriverEntry(x,x)+5↑p INIT:00404010 INIT:00404010 InitialSeed = _LARGE_INTEGER ptr -8 INIT:00404010 INIT:00404010 mov edi, edi INIT:00404012 push ebp INIT:00404013 mov ebp, esp INIT:00404015 push ecx INIT:00404016 push ecx INIT:00404017 mov eax, ___security_cookie INIT:0040401C mov ecx, 0BB40E64Eh INIT:00404021 test eax, eax INIT:00404023 jz short loc_404029 INIT:00404025 cmp eax, ecx INIT:00404027 jnz short loc_40403E INIT:00404029 INIT:00404029 loc_404029: ; CODE XREF: ___security_init_cookie+13↑j INIT:00404029 rdtsc INIT:0040402B xor eax, offset ___security_cookie INIT:00404030 mov ___security_cookie, eax INIT:00404035 jnz short loc_40403E INIT:00404037 mov eax, ecx INIT:00404039 mov ___security_cookie, eax INIT:0040403E INIT:0040403E loc_40403E: ; CODE XREF: ___security_init_cookie+17↑j INIT:0040403E ; ___security_init_cookie+25↑j INIT:0040403E not eax INIT:00404040 mov ___security_cookie_complement, eax INIT:00404045 mov esp, ebp INIT:00404047 pop ebp INIT:00404048 retn INIT:00404048 ___security_init_cookie endp INIT:00404048 INIT:00404048 ; --------------------------------------------------------------------------- 这个流程就比较正常了,如果和魔数值相等,就将当前时间和魔数异或,然后取反作为初始种子。再测试一下,没问题了。
from:http://blog.sina.com.cn/s/blog_ba23fa6f0102v32g.html
窗口动画和过渡动画是指在窗口(activity或dialog)切换时的显示动画,窗口动画的范围相对较广,包括activity和dialog,而过渡动画只包括activity。
第一种方法是调用overridePendingTransition的方法,记得要在startActivity之前调用,还可以用startActivity(Intent, Bundle)设置Bundle来实现,这种可以跨Context,而overridePendingTransition只能在当前app内实现,具体做法是ActivityOptions.makeCustomAnimation(context, enterResId, exitResId).toBundle(),这种方法要求系统是4.1以后的。这两种方法实现的都是过渡动画。
前面这些方法都只能做activity的动画,要做dialog的动画,就必须用窗口动画。方法是设置style,代码如下: 然后dialog.getWindow().setWindowAnimations(R.style.MyStyle)
或者dialog.getWindow().getAttributes().windowAnimations = R.style.MyStyle;
这样就可以在弹出dialog的时候播放动画了。窗口动画也可以作用在activity上,style的设置一样,代码也差不多,直接在activity内就可以调用getWindow这条方法。style还有另外一种做法:
这种设置的是过渡动画,只对activity有用,对dialog没用。
(除了用getWindow来设置动画资源外,还可以在你的Theme里添加一个item,item的name是android:windowAnimationStyle,然后指定上面的一种style)
从原理上看,窗口动画和过渡动画其实就是系统在切换窗口时读取相应的动画资源,上面的所有做法本质上就是在替换那些资源。开发者需要处理的是如何选择,是窗口动画还是过渡动画。如果是dialog,只有窗口动画可选,也只能通过style来完成。如果是activity,就两种动画都可以,但大多情况下还是用过渡动画,因为通过像overridePendingTransition这些api可以很简单的实现,而如果想把动画应用到整个Activity,用style就更方便,至于用上面哪种style,其实没什么影响。
在实际的开发中,其实并不提倡用上面这些方法,因为手机的设置可以关闭这两种动画(在开发者选项那里),你没法保证app一定能显示动画。对于activity动画来说,可以在新的activity初始化结束后启动常规的动画,但这种方法要求你必须等到窗口的相关view初始化结束,但什么时候结束是无法预测的,这和手机性能有关,所以你可以设置定时器来播放,而对于dialog就没有其他解决的方法了。
android 自定义dialog,窗口动画 from:http://blog.51cto.com/308210/703682
自定义dialog窗口,根据坐标可随意设置dialog显示位置,实现了窗口弹出动画 Java代码:
package com.sunxu.org.IndividualityDialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
public class IndividualityDialogActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.
如题,虽然这个问题是经典目标跟踪算法,但事实上,可能我们并不需要那些曾经辉煌但已被拍在沙滩上的tracker(目标跟踪算法),而是那些即将成为经典的,或者就目前来说最好用、速度和性能都看的过去tracker。我比较关注目标跟踪中的相关滤波方向,接下来我介绍下我所认识的目标跟踪,尤其是相关滤波类方法
benchmark: https://github.com/foolwood/benchmark_results
知乎:https://www.zhihu.com/question/26493945/answer/156025576
背景介绍 作者:YaqiLYU
链接:https://www.zhihu.com/question/26493945/answer/156025576
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
经典判别类方法推荐Struck和TLD,都能实时性能还行,Struck是2012年之前最好的方法,TLD是经典long-term的代表,思想非常值得借鉴:
Hare S, Golodetz S, Saffari A, et al. Struck: Structured output tracking with kernels [J]. IEEE TPAMI, 2016.Kalal Z, Mikolajczyk K, Matas J. Tracking-learning-detection [J]. IEEE TPAMI, 2012. 长江后浪推前浪,前面的已被排在沙滩上,这个后浪就是相关滤波和深度学习。相关滤波类方法correlation filter简称CF,也叫做discriminative correlation filter简称DCF,注意和后面的DCF算法区别,包括前面提到的那几个,也是后面要着重介绍的。深度学习(Deep ConvNet based)类方法,因为深度学习类目前不适合落地就不瞎推荐了,可以参考Winsty的几篇 Naiyan Wang - Home,还有VOT2015的冠军MDNet Learning Multi-Domain Convolutional Neural Networks for Visual Tracking,以及VOT2016的冠军TCNN http://www.votchallenge.net/vot2016/download/44_TCNN.zip,速度方面比较突出的如80FPS的SiamFC SiameseFC tracker和100FPS的GOTURN davheld/GOTURN,注意都是在GPU上。基于ResNet的SiamFC-R(ResNet)在VOT2016表现不错,很看好后续发展,有兴趣也可以去VALSE听作者自己讲解 VALSE-20160930-LucaBertinetto-Oxford-JackValmadre-Oxford-pu,至于GOTURN,效果比较差,但优势是跑的很快100FPS,如果以后效果也能上来就好了。做科研的同学深度学习类是关键,能兼顾速度就更好了。
最后强力推荐两个资源:
王强@Qiang Wang维护的benchmark_results foolwood/benchmark_results:大量顶级方法在OTB库上的性能对比,各种论文代码应有尽有,大神自己C++实现并开源的CSK, KCF和DAT,还有他自己的DCFNet论文加源码,找不着路的同学请跟紧。
@H Hakase维护的相关滤波类资源 HakaseH/CF_benchmark_results ,详细分类和论文代码资源,走过路过别错过,相关滤波类算法非常全面,非常之用心!
颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。 class Solution: # @param n, an integer # @return an integer def reverseBits(self, n): temp = bin(n)[2:] count = 32-len(temp) if count > 0: for i in range(0,count): temp = '0' + temp return int(temp[::-1],2) return int(temp[::-1],2)
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2 输出: 1->2 示例 2:
输入: 1->1->2->3->3 输出: 1->2->3 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def deleteDuplicates(self, head): """ :type head: ListNode :rtype: ListNode """ temp = set() while head: temp.add(head.val) head = head.next res = ListNode(0) res_Last = res temp = sorted(temp) for t in temp: res_Last.next = ListNode(t) res_Last = res_Last.
微信阅读是一款非常棒的软件,简洁明了,阅读体验非常棒.但是,大概基于某种原因,微信阅读一直没有出电脑版本.但是有时候很尴尬的就需要在电脑上进行阅读.例如,今天早上去图书馆时候本来准备看一会书,然后手机被小外甥拿去玩游戏了;例如,你在办公室寂寞难耐时候,又不敢明目张胆得拿着手机看小说.
so,这问题就是在电脑端运行微信读书这个软件.
首先,我尝试使用微信软件自带的公众号功能,关注了微信阅读公众号后,在手机端可以使用直接在公众号进行阅读,那么我就开始尝试了在电脑端进行公众号关注后,想直接进行阅读,在百度经验中的确有截图表示可以在pc端操作,可是特么的我发现mac的并不支持,完全是腾讯的锅.
接下来我就很简单的想到了模拟器这方面.关于模拟器方面,我想到了ios和安卓.ios我考虑到安装电脑端很简单,但是下载ios软件估计不方便.所以我就考虑使用安卓模拟器.
安卓模拟器方面,因为我只有微信阅读一个软件的问题,所以我希望用最简单的方法,尽量安装最少的文件.我百度搜索后,发现chrome有个插件arc welder可以在浏览器方面模拟安卓.下载chrome之后,我尝试直接在chorme app上直接下载插件,发现,404.所以我直接选择自主去下载crx文件来安装.好不容易下载了arc的crx文件,然而,还是安装不成功.好吧,我就开始搜索科学上网方法.下载了shadowsocks,在某个安全的网站注册了一个账号,然后就能科学上网了.在chrome app上下载arc并且安装,登陆微信阅读官网,下载apk文件,万事俱备,只欠运行,然而,等来只是无尽的安装打转转,度娘后发现,arc并不是万能的,对于某些apk支持并不完美.
这条路我也放弃了,最后只能老老实实去下载安卓模拟器了.有时候人生就是这样子的啦,你总是想着走捷径,想最少的力气去干,总会发现最后还是得老老实实的用最笨的也是最有效的方法.好吧,在安卓模拟器方面,我也是走了很多的弯路,第一下载的网易的mumu的模拟器,差评,md,软件做的乱七八糟,鼠标都是错位的.接着我下载了bluestack(?是叫这个名字),总之下载好了之后,我发现mac端我无法知道如何使用?!!!!全是英文,一直让你链接谷歌账户,就算在科学上网状态也无法登陆,我估计这个软件本身就是有问题的,还是放弃了.
最后,我下载了夜神模拟器,一切安装完毕,完美运行.
但是有个问题,因为分辨率和dpi的原因,显示效果没有那么手机上那么细腻.我查阅了ip6s的分辨率为1334*750,dpi没有查到(大概是400左右好像),最后我不断的尝试和设置,把dpi定位在300,完美.
以下是效果图:
一、引入redis pom依赖,代码如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.0.0.RELEASE</version> </dependency> 二、建立config包,在包下建立RedisConfig类,代码如下:
@Configuration @EnableCaching public class RedisConfig { @Bean public RedisTemplate<Serializable,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Serializable,Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.afterPropertiesSet(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new ObjectRadisSerializer()); return template; } } 注意:
1、@Configuration和@EnableCaching注解,声明是springboot配置类,和springboot启动缓存的,@Bean是声明此方法是一个依赖。
2、而RedisTemplate<Serializable,Object> 是用来操作redis 的一个类,RedisConnectionFactory是用来连接redis的一个类,Serializable是可序列化对象,因为redis存储是以二进制形式存储的。
3、template.afterPropertiesSet()是表面在application.properties(在下面会给出)配置文件加载完成后再执行下面的程序。
三、application.properties配置文件代码如下:
spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.timeout=2000ms 注意这是redis数据库的一些配置,在执行上面方法之前先执行此配置连接到redis数据库。
四、在util包下建立一个序列化POJO对象的类ObjectRedisSerializer,代码如下:
public class ObjectRadisSerializer implements RedisSerializer<Object> { /** * ObjectRadisSerializer序列化VO对象的类,要实现RedisSerializer接口 * */ /** * 新建序列化和反序列化对象 * */ private Converter<Object,byte[]> serializer = new SerializingConverter(); private Converter<byte[],Object> deSerializer = new DeserializingConverter(); /*** * 定义一个字节空数组 */ private static final byte[] EMPTY_ARRAY = new byte[0]; /** * 下面为序列化方法 * @param obj * @return * @throws SerializationException */ @Override public byte[] serialize(Object obj) throws SerializationException { byte[] byteArray = null; if (obj == null){ byteArray = EMPTY_ARRAY; }else { try { byteArray = serializer.
描述:
表A和表B的主键A1和B1是相同的,现在需要A2和B2比较,A3和B3比较,将A2不等于B2和A3不等于B3的数据从表A中筛选出来。这样的SQL语句怎么写?
SQL语句对比两张表的数据并筛选出数据不同的公式如下:
select A.* from A, B where A.A1=B.B1 -- 相同主键,做表连接.
and A.A2 <> B.B2 -- 条件1:A2不等于B2.
and A.A3 <> B.B3 -- 条件2:A3不等于B3.
划重点:在网上查了很多资料,一个很重要的点基本上没有人提出来,要使用.net4.0及以上啊。。。否则都是扯淡。
代码还是那个代码,.net4.0以下根本就不起作用。
1. 学习过程:修改窗口的localizable=true; Language=你要添加的语言。VS会帮我们自动添加一个对应的语言资源文件。
这时候修改窗体的text为繁体,打开Fom1.zh_TW.resx, 会发现里面有一条 名称和值的对应信息:$this.Text: 測試窗口。
查看构造函数: System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this, "$this"); 原先的this.Text='测试窗口',变成了resources.ApplyResources(this, "$this"); 这个是一个很合理的逻辑,我在开始查资料,知道会形成多个资源文件的时候,就想应该是存在一种快速切换资源的做法。
网上的很多代码是这样的:
public Form_实验管理()
{
InitializeComponent();
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
ApplyResource(); //修改控件的语言显示
}
private void ApplyResource()
{
System.ComponentModel.ComponentResourceManager res = new ComponentResourceManager(typeof(Form_实验管理));
foreach (Control ctl in Controls)
{
res.ApplyResources(ctl, ctl.Name);
}
this.ResumeLayout(false);
this.PerformLayout();
res.ApplyResources(this, "$this");
}
这个我隐隐觉得不对劲,还需要自己每个窗口去写循环?但是因为一开始我用的.net2.0, 上面的方法不起作用,我以为是我没弄对,后来使用下面代码的时候也不起作用,我就觉得应该要使用更高版本的框架,改为.net4.0后,生效了。
两种方法都生效,但是上面这个代码明显比较繁琐。
反复强调:在网上看到使用高版本特性的方法说明时不带版本,或者不带引用,这点很讨厌,自己也要注意这点。
2. 实际使用:这个方法很简单,直接让.net自己去加载对应的语言资源文件就好了。
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-TW");
这句话放在哪里呢,我需要整个程序都切换语言,通过配置文件一开始就设定好语言,不需要随时切换语言,所以我放在了登录窗口的load事件里面。 private void Login_Load(object sender, EventArgs e)
代码略长!!!!!!!!求大神指教!!!!!! 实现 atoi,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: "42" 输出: 42 示例 2:
输入: " -42" 输出: -42 解释: 第一个非空白字符为 '-', 它是一个负号。 我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。 示例 3:
输入: "4193 with words" 输出: 4193 解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。 示例 4:
输入: "words and 987" 输出: 0 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。 因此无法执行有效的转换。 示例 5:
按下检测 当鼠标某一个按键按下时,便会返回true,但是即使玩家一直按着鼠标按键,也仅仅会返回一次true。
if(Input.GetMouseButtonDown(0)) //......; if(Input.GetMouseButtonDown(1)) //......; if(Input.GetMouseButtonDown(2)) //......; 其中:0 表示鼠标左键,1表示鼠标右键,2表示鼠标中键,3表示鼠标4键(我的是回退键),4表示鼠标5键(我的是前进键)。
松开检测 当鼠标某一个按键松开时,便会返回true。
if(Input.GetMouseButtonUp(0)) //......; if(Input.GetMouseButtonUp(1)) //......; if(Input.GetMouseButtonUp(2)) //......; 其中:0 表示鼠标左键,1表示鼠标右键,2表示鼠标中键,3表示鼠标4键(我的是回退键),4表示鼠标5键(我的是前进键)。
长按检测 当鼠标某一个按键按下时,便会返回true,如果玩家一直按着鼠标按键,便会多次返回true。 在我电脑上测试发现,在Update方法中,我以极快的速度点击一下鼠标左键,大概会返回4-6个true。
if(Input.GetMouseButton(0)) //......; if(Input.GetMouseButton(1)) //......; if(Input.GetMouseButton(2)) //......; 其中:0 表示鼠标左键,1表示鼠标右键,2表示鼠标中键,3表示鼠标4键(我的是回退键),4表示鼠标5键(我的是前进键)。
Hive:可以写SQL语句,充当数据仓库作用,完成批量数据处理。
Pig:针对流式数据,轻量级脚本语言。
Tez:将整个MapReduce作业构建成一个有向无环图,实现作业的优化。
ZooKeeper:分布式协调一致性。分布式锁一致性,集群管理等等。
FLume:针对流式数据的收集工作,日志收集工具。
Spark类似于MapReduce,但是Spark是基于内存计算的。
Sqoop:将传统的关系型数据库的数据导入/导出到Hadoop(HDFS,Hbase,Hive中)。
HBase: 非关系型分布式数据库,架构在HDFS之上。用来存储非结构化和半结构化的松散数据。HDFS顺序读写,Hbase支持随机读写以及实时应用。
MapReduce:Data Processing
Yarn:集群的资源管理,cluster resource management
SecondaryNameNode在小型集群中可以和NameNode共用一台机器,较大的群集可以采用与NameNode相同的硬件。(不同的机器)
对于一个小的集群,名称节点(NameNode)和JobTracker运行在单个节点上,通常是可以接受的。但是,随着集群和存储在HDFS中的文件数量的增加,名称节点需要更多的主存,这时,名称节点和JobTracker就需要运行在不同的节点上。
安装:
1.一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。
2.我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop (与系统用户名相对应),因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input。标注:这里两个hadoop对应的。
js中对于数组的操作很常见,下面记录一下js向数组添加元素的方法。
let myArray=[11,22,33]; console.log('原数组:',myArray); myArray.push(44,55); console.log('用push在数组后面插入元素:',myArray); myArray.unshift(66,77); console.log('用unshift在数组前面插入元素:',myArray); myArray.splice(2,0,'肾虚少年'); console.log('用splice在数组指定位置插入元素:',myArray); 通过使用push以及unshift即可向数组插入元素,如果要在指定的位置插入元素则可以用splice,splice接收多个参数,分别是索引,要删除的元素个数,新加的元素(可多个,用逗号隔开);
这样即可向数组插入元素了。
作者介绍:
周甜,北京大学硕士研究生,高级分析师,主要从事环保数据分析,擅长于污染溯源和PM2.5源解析,知乎id:周小甜。
获取气象数据十分困难,但是气象数据对于空气质量分析至关重要,那么如何获取一个地方的气象数据(包括温度、风向、风速、气压、相对湿度等)呢?
本篇采用“worldmet”包,获取机场的小时气象数据,包括风向、风速、温度、露点、大气压、相对湿度。关于“worldmet”包,可参考大神github网页:https://github.com/envhyf/worldmet。
1.下载安装“worldmet” require(devtools) install_github('davidcarslaw/worldmet') 2.根据一个城市经纬度,找到最近机场信息 library("worldmet") #以延庆区的经纬度为例,纬度40.458N,经度115.98E getMeta(lat = 40.458, lon = 115.98) #系统会搜索到此点位周边的机场站点 3.结果示例 结果示例:从结果来看,最近的站点为“HUAILAI”站点,编码544050-99999,数据从1956-08-20就有数据。
# A tibble: 10 x 15 USAF WBAN STATION CTRY ST CALL latitude longitude `ELEV(M)` BEGIN <chr> <int> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <date> 1 544050 99999 HUAILAI CH <NA> <NA> 40.4 116. 538 1956-08-20 2 545110 99999 BEIJING - ~ CH <NA> ZBAA 40.1 117. 35.4 1945-10-31 3 543080 99999 FENGNING CH <NA> <NA> 41.
一、概率密度函数和分布函数
分布函数是概率密度函数从负无穷到正无穷上的积分;
在坐标轴上,概率密度函数的函数值y表示落在x点上的概率为y;
分布函数的函数值y则表示x落在区间(-∞,+∞)上的概率。
二、均匀分布的概率密度函数
假设x服从[a,b]上的均匀分布,则x的概率密度函数如下
概率密度图像如上图所示
三、均匀分布的分布函数
四、均匀分布的期望与方差
一、BWA-MEM函数框架 软件位置:https://sourceforge.net/projects/bio-bwa/
1 读入 bwt、options、reads;
2 利用mem_chain生成chain;
3 利用mem_chain_flt过滤掉部分chain;
4 利用mem_chain2aln生成比对结果数据。
1.第一步:数据输入 加载已经生成的bwt表。接口的参数文件名为:xx.fasta;实际中包含具有以下几个后缀名的文件.amb,.ann,.bwt,.fai,.pac,.sa。注意后面几个文件的名字要和接口参数的文件名一致。
其中这几个文件分别为:
.bwt文件:重新排列的bwt表,大小与原reference相同。存储的是o表。
.sa文件:sa_intv
.pac文件:原始reference的压缩文件,原来ACTG用ASCIIS码表示,一个字符占八位,在.pac文件中,用00~11的2bit重新编码bwt表,使得.pac文件成为原来.fasta文件大小的1/4.
.ann文件:reference分组的划分信息
.amb文件:
2.第二步: mem_align1()函数功能:给一个read匹配一块reference区域
输入:const mem_opt_t *opt~运算中的匹配数据。alignment parameters
const bwt_t *bwt~ bwt表
const bntseq_t *bns ~reference的信息。Information of the reference
const uint8_t *pac~压缩后的reference表
int l_seq ~read 的长度
char *seq~read(待匹配片段)
返回值:mem_alnreg_v regs~描述确定reads下匹配到的在reference上的位置信息
3. 第三步: mem_reg2aln():功能:根据reads和reference的匹配结果,生成CIGAR(一种描述匹配情况的信息)
输入:
const mem_opt_t * opt~alignment parameters
int64_t l_pac~length of concatenated reference sequence
int n~number of query sequences;must be an even number
编写一个函数来查找字符串数组中的最长公共字符串串。
如果不存在公共字符串,返回空字符串 ""。
例如:
输入: ["flower","flow","flight"] 输出: "fl" 代码实现: class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ length = len(strs) if length == 0: return '' elif length == 1: return strs[0] else: result = '' strs_sorted = sorted(strs,key = lambda x:len(x)) #最短字符串 shortest = strs_sorted[0] k = 0 Flag = True for s in strs_sorted[1:]: for i in range(0,len(shortest)): if shortest[:i+1] in s: k = i else: k = i Flag = False break print k if Flag == True and k >= 0: return shortest[:k+1] else: return shortest[:k]
这个问题来源于一个朋友曾经问过我的问题,当时是一个二维数组变成一维数组。后面我想整理一下,整理一个多维,并且是不定维的数组。
一、二维数组变成一维数组 1、遍历数组,将元素一个个放入新数组 结果:
如果元素不是数组,将会报错。下面是改良版:
这样的方法仍显臃肿
2、用apply的特性,将数组作为参数展开 concat接受单个值作为参数,所以不需要识别。
3、利用es6新增的扩展运算符将数组展开 与concat类似。
比较推荐扩展运算符的方法,书写简洁。 二、多维数组变成一维数组 多维数组变成一维,就是在二维变成一维的基础上递归调用。
代码如下:
1、遍历每一个元素,先判断再处理 2、reduce方法 2018-9-26新增:三、es6新增的flat及flatMap方法 es2018为数组实例新增了flat及flatMap方法,用于将二维 或者多维数组拉平成一维数组。
flat方法默认没有参数,这时只会降维降一层。可以传数字类型的参数指定降维次数。
flat方法不改变原数组。
如果想将任意维度的数组变成一位数组,可以传入Infinity。
flatMap()方法,参数是一个回调函数,类似map方法的使用,数组的每个元素执行一次回调函数,然后对返回的数组执行flat()方法,只降一次维,
转载:https://blog.csdn.net/czg13548930186/article/details/75207913
效果图:
开始配置 第一步<配置文件准备>: 下载配置文件default.conf,点击我进入下载界面。
里面有CODEBLOCKS的安装包和主题配置文件
然后替换本地的default.conf文件<本地一般在C盘->Users->用户->AppData(隐藏的话显示出来)->Roaming->Codeblocks-> defatlt.conf>
第二步<配置主题>: 主题效果可以点此去官网预览
打开codeblocks,setting(设置)->editor(编辑)->Syntax highlighting(语法高亮), 然后在右边的Colour theme(主题)里选择适合你的主题。<推荐obsidian、sublime>
注:点击Background->添加自定义颜色->记住上图的六个数据,后面会用到!
第三步<配置字体>: setting(设置)->editor(编辑)->Font->Choose, 然后选择适合你的字体<推荐Consolas 大小:四号-14>
第四步<设置光标>: 可能用新的界面风格由于颜色会看不到光标,setting(设置)->editor(编辑)->Margins and caret->caret, 然后选择适合你颜色、大小的光标
第五步<设置左边行号区域部分>: 设置完以上四部应该会如下图所示,左边很丑。
接下来我们进行改装:
setting(设置)->Environment->Colurs, 然后就要用到第二步的六个数值!
如下图修改:
最终效果:
【到此完毕,感谢阅读~】
personally
1、插入视频时src变成空白 解决方法:打开ueditor.config.js,在365行找到”whitList”,再往下找到img(403行),确保其数组中有“src”、“_src”、“id”、“style”等字符串,如果没有的话手动添加即可,img改完后再往下找到video,处理方法同img 示例:
img: ['src', 'alt', 'title', 'width', 'height', 'id', 'style', '_src', 'loadingclass', 'class', 'data-latex'], video: ['autoplay', 'controls', 'id', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'] ps.看到有的博客说把whitList改成whiteList,我试过之后发现并没有用。也有的博客直接将inputXssFilter关闭了,其实完全没有必要
2、编辑内容时setContent()失效 有如下几种解决方法: ①延迟加载: 怀疑是组件加载顺序的原因使得setContent无效,因此尝试性地加上延迟,这种方法可能有效,如果依旧没有效果,请继续往下看,代码如下:
setTimeout(function(){ ue.ready(function(){ ue.setContent(client.content, false); }); },600); ②先销毁再重新渲染: 想到这个方法的原因在于刷新页面后,第一次打开layer弹出层进行编辑时Ueditor是可以正常setContent的,但把当前弹出层关掉再打开就失效了。因此在layer的cancel回调与success回调中先销毁ueditor,下一次打开弹出层时再重新渲染。这样可以顺利解决问题,但是每次销毁与渲染消耗了太多资源,导致加载缓慢,暂时没有想到更好的办法,只能弹一个有阴影的加载层出来掩人耳目。 销毁的代码如下:
// 判断是否第一次加载弹出层,默认为true var isFirstDialog = true; layer.open({ title:t1, skin: 'layui-layer-rim', //加上边框 area: ['850px', '98%'], //宽高 type: 1, shadeClose: false, content: $('#divsave'), // 点击右上角关闭按钮触发的回调函数 cancel: function() { destoryUeditor(); }, success:function() { destoryUeditor(); } }); // 每次关闭layer时必须销毁ueditor function destoryUeditor(){ ue.