Mac下根据端口号查询进程号Pid #!/bin/bash #use sh kill.sh 8080 echo "$0" port="$1" echo $port ##根据端口获得进程号 lsof -i :$port | grep -i LISTEN | awk '{print $2}' # ##组合获得该进程的执行命令 lsof -i :$port | grep -i LISTEN | awk '{print $2}' | xargs -I {} ps -o command -p {} | tail -n +2 # ##管道给kill掉该进程 lsof -i :$port | grep -i LISTEN | awk '{print $2}' | xargs -I {} kill -15 {}
现在有 A(10.16.12.220)和B(10.16.12.150)两台服务器,为了使A服务器通过SSH连接B服务器时,免密登录,做以下操作。
1、首先登录A服务器,查看是否已经生成了 ssh公钥私钥;
cat ~/.ssh/id_rsa.pub 2、如果不存在,则执行命令生成 (-P 无需密码)
ssh-keygen -t rsa -P '' 3、用 ssh-copy-id 命令将公钥复制或上传到远程主机,并将身份标识文件追加到B服务器的 /home/用户/.ssh/authorized_keys 中:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.16.12.150 4、无密码验证登录
ssh root@10.16.12.150
很多读者可能都不太清楚爬虫是干什么的,今天我就来跟大家科普下爬虫工程师平时的工作都是怎样的。
说起爬虫,大家可能不太理解它的概念。但给大家举个通俗易懂的例子,像百度、谷歌这些大型搜索引擎,你就可以把它们理解为一个巨大的爬虫,它们无时无刻不在抓取着网上的所有信息,然后展示给用户看。这种称为通用网络爬虫。而爬虫工程师更多干的是聚焦网络爬虫,是专门根据业务针对某些网站而制定的特定爬虫程序,只需要获取目标网站的数据。
爬虫又分为增量式爬虫和全量式爬虫。全量式爬虫又称为一次性爬虫,就是把该网站的数据一次性全部抓取下来,后面就不需要再管该网站了,这种爬虫任务通常比较简单。而增量式爬虫不止这次要把网站数据抓取下来,而且之后还要检测该网站有无数据更新,如果有更新的话还需要把更新后的数据再抓回到数据库里。所以增量式爬虫对于爬虫程序的健壮性要求会更高些。
爬虫工程师的目的就是获取所需的数据。而主要难点就是获取数据的过程中需要跟网站的各种反爬措施做斗争。对于简单的网站,可能只是验证一下请求头或者限制ip访问的频率,这两种可以通过构造请求头和购买ip代理来解决。再复杂点就是url中会带些关键参数,而这些关键参数需要通过js逆向来破解出来参数是如何生成的,然后自己写程序来构造参数。更复杂的就是破解各类验证码,破解验证码如果自己不怕麻烦而且懂深度学习相关的知识的话,可以自己搭建相应模型训练来进行破解。如果想省事又效率高的话就可以直接通过网上的打码平台来辅助工作。
随着移动化时代的到来,越来越多的数据逐渐从PC端转移到了app端,所以爬虫工程师如果想更精进的话,也必须懂得app端数据的抓取。对于简单的app数据抓取,可以通过charles、fiddler等抓包工具来抓包分析,只要找到数据所在的地址,并且构造合适的请求头便可以得到。再复杂点的有些app数据需要破解关键参数,而这些关键参数便需要通过app逆向来得到,需要用到AJAX、frida等逆向框架。
另外如果大家不想破解网站加密而且对爬虫效率没有那么高要求的话,可以试试自动化模拟工具。所谓自动化模拟,就是让爬虫完全像人一样在操作,可以实现所见即所得的效果,功能非常强大。像PC端可以用selenium,app端可以用airtest,这里我只是简单列举了两个工具,还有很多其它好用的工具,各位可以选择自己觉得顺手的使用。
最后和大家说下我平时接任务的流程,首先确定需求网站,然后确定需求的数据,并且判定该任务是属于全量式爬虫还是增量式爬虫。之后对需求网站进行反爬机制的探索,并且制定相应的反反爬措施。然后就开始搭建数据库并编写爬虫程序爬取数据入库。这只是简单的描述一下工作流程,当然具体到每一步的话,可不是那么简单的。
我原来是以抓取文本数据为主,现在由于公司以及业务的变更,目前的爬取领域扩展到了视频、音频、图片等多领域,要说难度的话,可能比原来的难度要稍微大一点,因为像视频音频这种文件不像文字可以直接存储到数据库,这些我还需要自己进行处理,然后存储到oss上。不过只要能解决网站的反爬措施,其余的都不困难。
在我看来,爬虫与反爬就是矛与盾的较量。究竟是矛能攻破盾,还是盾能抵御矛。也许爬虫工程师的乐趣就是在一次又一次的较量中得来的吧!
java上传文件代码
关注:232 答案:5 mip版
解决时间 2021-02-04 09:24
提问者妳狠僤莼
2021-02-03 17:48
java上传文件代码
最佳答案
二级知识专家孤者何懼
2021-02-03 18:57
上传文件通常是先连接到远程服务器,之后将本地文件通过流的形式写入到远程文件中,实现文件的上传。
举例:
import hkrt.b2b.view.util.Log;
import hkrt.b2b.view.util.ViewUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class EncodeAES {
public static String encodeAESFileUploadByFtp(String plainFilePath, String fileName, String date,String filepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
哈夫曼树的基本概念 路径:从树中结点到另一个结点之间的分支构成这两个结点间的路径
结点的路径长度:两结点间路径上的分支数
树的路径长度:从树根到每一个结点的路径长度之和。记作:TL
权:将树中结点赋给一个有着某种特殊意义的值,则这个数值称为该结点的权
结点的带权路径长度:从根结点出发到该节点之间的路径长度与该结点的权的乘积
树的带权路径长度:树中所有叶子结点的带权路径长度之和
哈夫曼树:最优树(带权路径长度(WPL)最短的树)
哈夫曼树的特点 满二叉树不一定是哈夫曼树
哈夫曼树中权值越大的叶子离根越近
具有相同带权结点的哈夫曼树不唯一
哈夫曼树的一些知识点 包含n个叶子结点的哈夫曼树共有2n-1个结点哈夫曼树的结点的度为0和2,没有度为1的结点包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1个新结点 哈夫曼树构造算法的实现 定义结构体 typedef struct{ int weight; int parent,lch,rch; }HTNode,*HuffmanTree; 算法实现 void Select(HuffmanTree &ht, int i, int &s1, int &s2) { int min = INT32_MAX; for (int j = 1; j <=i; ++j) { for (int k = 1; k <=i; ++k) { int temp = ht[j].weight + ht[k].weight; if (k != j && ht[j].parent == 0 && ht[k].
近期学FPGA,准备联合仿真的时候发现ISE不能打开ModelSim进行仿真。碰到如下几个问题:
出现这个的原因是ISE中没有ModelSim的地址,解决方法在ERROR中红框部分也给出了,将ModelSim的地址引入即可
箭头位置将modelsim.exe的地址引入即可,别忘了点ok
还有一种问题:
解决方法:
在这里把ISE_DS\EDK的那个文件夹地址引进去,但前提是它的library你已经解析过了,解析过程如下:
打开后会有一个dos窗口全黑,另外弹出来一个类似于安装的窗口,里面不需要特殊操作,就按着提示一步步ok下去就行,最后finish后,包就被装到了EDK文件夹下,这样就可以解决那个大弹窗的问题。
1.基础设置
2.拖进来LeapHandController
(显示为蓝色)
其中,Edit Time Pose选择的是不同的模式,是桌面模式还是VR模式。
3.拖进来HandModels
此部分为手势模型,为新建空物体,然后加上Hand Model Manager(系统文件)
其中LeapHand是设置的空物体,Capsule HandLeft为拖进来的Prefabs
4.Interaction Manager
删除RigidRoundHand_L和RigidRoundHand_R,换成了Interaction Hand(Left)和(Right)
5.在需要交互的物体上加上Rigidbody和Interaction Behaviour两个组件。
一些常用的按位小技巧 按位与 a & -a:a的二进制原码表示中最低有效位。 如5(101) --> 1(001),6(110) --> 2(010), 12(1100) --> 4(0100)
a & a-1: 相当于 a - (a&-a),去掉最低有效位之后的值
a& 1-a: 最右一位不参与运算,除去最右位后的最低有效位。对于奇数a来说相当于(a-1)&(1-a),对于偶数来说与a&-a相等。
文章目录 多命令顺序执行与管道符通配符与其它特殊符号 多命令顺序执行与管道符 1、多命令顺序执行
例子:
[root@localhost ~]# ls ; date ; cd /user ; pwd
用途:dd命令(用于磁盘复制)
[root@localhost ~]# dd if=输入文件of=输出文件bs=字节数count=个数
选项:
if=输入文件指定源文件或源设备
of=输出文件指定目标文件或目标设备
bs=字节数指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数指定输入/输出多少个数据块
例子(dd与多命令结合)
[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
[root@localhost ~]# ls anaconda-ks.cfg && echo yes
[root@localhost ~]# ls /root/test || echo "no
[root@localhost ~]# 命令&& echo yes || echo no(正确执行命令打印yes,错误打印no)
2、管道符
命令格式:
[root@localhost ~]# 命令1 | 命令2 #命令1 的正确输出作为命令2 的操作对象
svn自用过滤正则 下面展示一些 内联代码片。
格式错乱问题 *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db*bin* *classes* *.class .classpath .project *.jar *.prefs *.iml .idea *idea* *iml* *target* *test* *target target*
Springboot 生成war部署到外置Tomcat(tongweb)时:
Caused by: java.lang.StackOverflowError
at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89)
at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72)
at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:108)
at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:121)
at org.apache.logging.log4j.util.StackLocatorUtil.getCallerClass(StackLocatorUtil.java:55)
at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.
前言 当k8s启动容器时,如果配置文件有误,会出现"Back-off restarting failed container"的报错信息
更正配置 形如1
... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent command: [ "/bin/sh", "-c", "--" ] args: [ "shile true; do sleep 30; done;" ] ... ... 形如2
... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-ce", "tail -f /dev/null" ] ... ... 形如3
... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent restartPolicy: Never command: - /bin/sh - "-c" - "sleep 60m"
import itertools
lis = [1,2,3,4,5]
print list(itertools.combinations(list(lis),2))
AirtestProject AirtestPocoAirtestIDE AirtestProject是由网易游戏推出的一款自动化测试框架。
Airtest 一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。
Airtest官方文档:https://airtest.readthedocs.io/zh_CN/latest/
安装命令:pip install -U airtest
连接安卓设备:connect_device("android:12344321")
常用的api:
touch
touch(Template(r"tpl1614914523361.png", record_pos=(-0.206, 0.189), resolution=(1080, 1920)),times=1,duration=0.01) swipe
swipe(Template(r"tpl1614914905026.png", record_pos=(-0.064, 0.675), resolution=(1080, 1920)), vector=[0.0272, -0.5581]) text
text("c测试text输入") keyevent
设备操作,只能应用在Android和Windows
keyevent("BACK") snapshot
snapshot(msg="请填写测试点.") wait
wait(Template(r"tpl1614915394025.png", record_pos=(-0.403, 0.81), resolution=(1080, 1920))) 断言常用的方法:
assert_exists
assert_exists(Template(r"tpl1614922752951.png", record_pos=(-0.392, 0.815), resolution=(1080, 1920)), "请填写测试点") assert_not_exists
assert_not_exists(Template(r"tpl1614922833487.png", record_pos=(-0.406, 0.801), resolution=(1080, 1920)), "请填写测试点") assert_equal
assert_equal("1", "1", "1等于1.") assert_not_equal
assert_not_equal("1", "2", "1不等于2.") Poco 一款基于UI控件识别的自动化测试框架,目前支持Unity3D/cocos2dx-*/Android原生app/iOS原生app/微信小程序,也可以在其他引擎中自行接入poco-sdk来使用。
Poco官方文档:https://poco.readthedocs.io/zh_CN/latest/
AirtestIDE 跨平台的UI自动化测试编辑器,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写Airtest和Poco代码。
package com.jsxf.jscqmlbmb.View; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import com.jsxf.jscqmlbmb.Controller.view.BaseFragment; import com.jsxf.jscqmlbmb.Model.Final.OnlyID; import com.jsxf.jscqmlbmb.R; import static android.app.Activity.RESULT_CANCELED; import static android.app.Activity.RESULT_OK; /** * Created by Administrator on 2016/11/30 0030. * Web页面 */ public class WebFragment extends BaseFragment { private WebView webView; private View view; private ValueCallback<Uri> uploadFile; private ValueCallback<Uri[]> uploadFiles; @Nullable public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (null !
文章目录 一、Django框架简介二、后台管理1.项目创建与运行1)创建项目2)目录说明:3)Terminal命令窗口执行:4)网页访问给定网址,如下图,说明Django创建成功 2.启用后台Admin 站点管理1)数据库迁移2)创建管理员用户3)本地化配置4)自定义模型加入后台管理 3.应用的创建和使用1) 创建第一个应用程序2) 编写第一个视图函数3) 路由规则 4.数据库模型1)创建数据库模型2)生成数据库表3)数据库模型基本操作4)创建关联对象5)自定义管理页面 三、前台管理1.URLconf 路由管理2. 视图函数处理业务逻辑3.模板管理实现好看的HTML页面1)标题样式2)列表3)图片4)链接5)表格6)表单 四、Django实现的生命周期 一、Django框架简介 Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需重新创建轮子。它是免费的和开源的。被官方称之为完美主义者的Web框架。
Django 官方文档:https://docs.djangoproject.com/zh-hans/3.1/
二、后台管理 1.项目创建与运行 1)创建项目 2)目录说明: manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互内层的目录:项目的真正的Python包 init.py :一个空文件,它告诉Python这个目录应该被看做一个Python包settings.py :项目的配置urls.py :项目的URL声明wsgi.py :项目与 WSGI 兼容的Web服务器入口 3)Terminal命令窗口执行: python manage.py runserver 4)网页访问给定网址,如下图,说明Django创建成功 2.启用后台Admin 站点管理 站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分, “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。因此, Django 会根据定义的模型类完全自动地生成管理模块。Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个
Web平台。 1)数据库迁移 #Terminal命令框中执行: python manage.py makemigrations #生成迁移文件 python manage.py migrate #将数据库表写入数据库中 创建完成后,如看不到DB下的文件,需要如下操作:
2)创建管理员用户 #Terminal命令框中执行: python manage.py createsuperuser 创建完超级用户后,网页访问127.0.0.1:8000/admin,输入上面创建的用户名、密码
进入管理站点,默认可以对 groups、users 进行管理
//创建Workbook对象
Workbook workbook = new Workbook(); //获取第一张工作表 Worksheet sheet = workbook.Worksheets[0]; //指定列宽、行高 sheet.Columns[0].ColumnWidth = 50; sheet.Rows[0].RowHeight = 160; //加载图片,添加到指定单元格 ExcelPicture picture = sheet.Pictures.Add(1,1, "tp.png"); //指定图片宽度和高度 picture.Width = 300; picture.Height = 180; //通过LeftColumnOffset和TopRowOffset属性值设置图片在单元格中的横向、纵向对齐 picture.LeftColumnOffset = 75; picture.TopRowOffset = 20; //保存文档 workbook.SaveToFile("result.xlsx", FileFormat.Version2013); System.Diagnostics.Process.Start("result.xlsx");
工作中同事使用maven时遇到了下面的问题报错:
Failure to transfer com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml">com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml from http://XXX.XXX.XX.com/artifactory/life">http://XXX.XXX.XX.com/artifactory/life was cached in the local repository, resolution will not be reattempted until the update interval of * has elapsed or updates are forced. Original error: Could not transfer metadata com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml from/to * (http://XXX.XXX.XX.com/artifactory/life): D:\code\repository\com\iii\iii-a dex\1.0-SNAPSHOT\maven-metadata-*.xml.part.lock (文件名、目录名或卷标语法不正确。) Downloading from *: http://XXX.XXX.XX.com/artifactory/life/com/iii/iii-adex/1.0-SNAPSHOT/iii-adex-1.0-SNAPSHOT.pom [WARNING] The POM for com.iii:iii-adex:jar:1.0-SNAPSHOT is missing, no dependency information available 最终发现是因为他的maven配置文件settings.xml 中的mirror 的id写成了*。导致maven把maven-metadata.xml 重命名为maven-metadata-*.xml。但是*在windows中不能作为文件名
所以出现如上错误。
他的settings.xml的mirror类似如下:
</mirrors> <mirror> <id>*</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.
文章目录 前言一、FPGA简介二、FPGA的用途三、FPGA比较1、FPGA与单片机比较2、FPGA与CPU比较 四、为什么选择FPGA总结 前言 在正点原子的技术文档里面看到一个小故事,很有意思。刚开始接触FPGA的时候,这个故事让我眼前一亮,对FPGA有一种莫名的神秘感与期待感。
话说一个资深工程师出国的时候带了一块 FPGA 开发板。 海关问道:“这是什么东西?” 工程师说:“FPGA 开发板”。 海关又问:“FPGA 是什么?”。 工程师回答说:“你想让它是什么,它就是什么(It can be whatever you want)” 一、FPGA简介 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,由Xilinx创造于1984年,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,FPGA本质上是一种芯片,它并不是一种软件,也不是一个工具,和CPU、GPU相比,它们在本质上并没有什么区别,都是芯片的一种。
FPGA有三个重要特点:现场、可编程、门阵列。
首先FPGA有大量的逻辑门阵列组成,逻辑门是数字电路最基本组成单元,它基于布尔代数,对二进制数0和1进行操作,并完成不同的逻辑运算,比如与或非等等。举个例子,任何数和0相与都为0,和1相或都为1,非就是把0变1,把1变0,而FPGA可以使用逻辑门组成各种不同的逻辑功能。有些可能不太明白这个逻辑门阵列有什么好处,换句话说,拥有可配置的逻辑块,就意味着不再受到硬件的制约。您不会再遇到定时器或 UART 不够用的情况,只要您拥有逻辑单元便可创建更多定时器或 UART。
其次,FPGA的另外一个特点就是可编程性 ,这里的可编程与我们平时所说的软件编程有着本质区别,对于CPU或者单片机的编程,一般是通过改变寄存器的配置来实现,但不会改变芯片的逻辑功能。打个比方,你不能通过编程把一个网络交换芯片变成一个视频处理芯片,相比之下,FPGA的编程为硬件可编程,它让FPGA可以对逻辑门阵列可以重复编程,从而使FPGA可以在逻辑层面上任意改变自己实现的硬件结构,这使得FPGA有很高的灵活性。
现场可编程性:主要指FPGA可以在现场完成编程,而不需要把芯片拆下来,然后送回厂家来完成编程操作(相当于一块橡皮擦,可以自己捏成任意形状)
二、FPGA的用途 FGPA能做什么呢?
可以毫不夸张地讲,FGPA能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用FGPA来实现。你可以把FGPA比喻成一堆乐高,通过拼装,可以做成任何一种模型——工程师可以通过传统的原理图输入或硬件描述语言(如Verilog HDL、VHDL)自由地设计一个数字系统。 目前的FPGA主要还是在通信和网络领域用的比较广泛,用来对大量的网络数据包进行处理,比如大规模应用于华为5G基站。一部分应用于医疗器械,金融领域,军用设备,航空航天。
FPGA的应用大可分为以下几种:
数据采集领域:自然界的大部分信号是模拟信号,在高速采集时,信息无法直接传入MCU或者DSP。此时,需要FPGA进行一定的转换和速率匹配。这里提一点,DSP是CPU的一种,做数字信号的处理,擅长做乘法和加法运算。
逻辑接口领域:CPU在于外界通信时,需要各种专门的接口,而接口电路所引入的接口电路很庞大。加入FPGA,就可以CPU与FPGA做单独通信,由FPGA实现其他各种接口的扩展。
电平接口领域:不同的器件支持的电平不尽相同,如果需要连接各种接口时,就需要各种接口标准或者转换电路。对于FPGA来说,FPGA分为不同的BANK,可以直接支持不同的电平标准。
数字信号处理领域:通信、图像等领域近些年对计算量提出了更高的要求,FPGA支持并行计算,可以大大缩短计算的时间。
IC设计领域:IC在设计时,首先会使用FPGA设计出基础的电路模型进行各种理论验证,等验证通过后,才会进行IC制造等等。
三、FPGA比较 1、FPGA与单片机比较 FPGA和单片机,首先它们在硬件架构上不同,单片机无论是MCU还是MPU都是基于控制器和算术逻辑单元进行工作的,而FPGA是基于查找表的硬件电路进行工作的,这一点正同于单片机用的是软件设计语言而FPGA用的是硬件描述语言一样;其次,FPGA在芯片容量、组合逻辑、工作速度、设计灵活上远优于单片机;最后,在代码的设计思想上也不一样,单片机使用的是串行的设计思想,而FPGA则使用的是并行的设计思想。
2、FPGA与CPU比较 CPU与FPGA的根本区别在于软件与硬件的差异。CPU为 冯诺依曼结构,串行地执行一系列指令;而FPGA可以实现 并行操作 ,就象在一个芯片中嵌入多个CPU,其性能会是单个CPU的十倍、百倍。一般来说,CPU可以实现的功能,都可以用硬件设计的方法由FPGA来实现。当然,极其复杂的算法用硬件实现会比较困难,资源消耗也很大,如果没有高性能要求,那用硬件实现就有点得不偿失了。对于一个复杂系统而言,进行合理的软、硬件划分,由CPU(或DSP)和硬件电路(如FPGA)合作完成系统功能是非常必要的,也是高效的。(http://blog.csdn.net/chzms/article/details/2548272)
四、为什么选择FPGA 打破顺序执行模式,大规模并行运算,低延时,验证想法简便,缩短产品上市时间。(由于时间问题,这个小节后面有时间总结好再更新到文章)
总结 FPGA应用于很多关键领域,但是目前我国FPGA市场的份额的90%以上都被美国公司所占据,特别是中高端的FPGA芯片,国内还没办法做到生产代替,光刻机技术、EDA软件仍然很落后,很多人并没有意识到这点,我们的芯片半导体产业仍然有很长的路要走。
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
提示:
0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
class Solution {
public String longestCommonPrefix(String[] strs) {
String subStr = ""; if(strs.length > 0 && strs[0].length() > 0){ if(strs.length == 1){ return strs[0]; } int maxPreLen = 1; for(maxPreLen=1;maxPreLen<=strs[0].length();maxPreLen++){ subStr = strs[0].substring(0,maxPreLen); for(int i=1;i<strs.length;i++){ if(!strs[i].startsWith(subStr)){ subStr = strs[0].substring(0,maxPreLen-1); return subStr; } } } return strs[0]; }else{ return "
两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
/**
Definition for singly-linked list.
public class ListNode {
int val; ListNode next; ListNode() {} ListNode(int val) { this.
<Select v-model="vehicleTypeId" ref="vehicleType" filterable clearable > <Option v-for="item in vehicleTypeList" :value="item.id" :key="item.id" >{{ item.name }}</Option > </Select> this.$refs.vehicleType.clearSingleSelect();
用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法:
# include <stdio.h> int main() { char operator; double firstNumber,secondNumber; printf("输入操作符 (+, -, *,/): "); scanf("%c", &operator); printf("输入两个数字: "); scanf("%lf %lf",&firstNumber, &secondNumber); switch(operator) { case '+': printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber); break; case '-': printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber); break; case '*': printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber); break; case '/': printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber); break; // operator doesn't match any case constant (+, -, *, /) default: printf("
pip安装命令:
pip install opencv-python
pip install opencv-contrib-python
若报错可以使用清华源安装cv2:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
还下不下来那就都这个网站下:https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/
还不不行试试wget,把上面那个网址复制下来 wget + 链接 老子被下载折腾半天,哭死
import cv2的错误记录:
1、cv2 ImportError: libGL.so.1: cannot open shared object file: No such file or directory
缺少相关依赖项,需要更新安装,执行命令:
sudo apt-get update
sudo apt-get install -y libgl1-mesa-dev
2、若执行sudo apt-get update报如下错:
Get:1 http://mirrors.aliyun.com/ubuntu bionic InRelease [242 kB]
Err:1 http://mirrors.aliyun.com/ubuntu bionic InRelease
Couldn't create temporary file /tmp/apt.conf.g1YDx9 for passing config to apt-key
打开/tmp目录的权限即可:chmod 777 /tmp
HuggingFace Datasets上传本地文件作为训练数据 这两天用自己的数据来做训练,看到datasets库中的教程,进行翻译,记下如何使用本地/私有数据集。
文章目录 HuggingFace Datasets上传本地文件作为训练数据前言编写数据集加载脚本(Writing a dataset loading script)添加数据集元数据(Adding dataset metadata)下载数据文件并组织拆分(Downloading data files and organizing splits)在每个分割中生成样本(Generating the samples in each split)指定几个数据集配置(Specifying several dataset configurations)指定默认数据集配置(Specifying a default dataset configuration)测试数据集加载脚本(Testing the dataset loading script)数据集参考脚本(Dataset scripts of reference) 示例结果演示 前言 在前面Bert的微调中,加载数据的方式是
from datasets import load_dataset, load_metric datasets = load_dataset("squad_v2" if squad_v2 else "squad") 获得打印的结构是:
DatasetDict({ train: Dataset({ features: ['id', 'title', 'context', 'question', 'answers'], num_rows: 87599 }) validation: Dataset({ features: ['id', 'title', 'context', 'question', 'answers'], num_rows: 10570 }) }) 打印出来一个示例就是:
js校验远端图片是否存在,因为图片存在于服务器,是异步加载,所以需要使用Promise。
const checkImgExists = (imgurl) => { return new Promise((resolve, reject) => { const ImgObj = new Image(); // 判断图片是否存在 ImgObj.src = imgurl; ImgObj.onload = (res) => { resolve(res); }; ImgObj.onerror = (err) => { reject(err); }; }).then((imageData) => { const target = imageData.target; if (target.fileSize > 0 || (target.width > 0 && target.height > 0)) { return true; } return false; }).catch((err) => { console.log(err); return false; }); } 使用方式 const src = '/app-sys-manage/oss/get_img/10443'; const res1 = await this.
前言 此次分享目的是为了让更多刚接触前端的人了解这款出色的轻量级拾色器,但功能绝不仅拾色。
介绍 FastStone Capture 是一款强大的、方便的、直观的屏幕捕捉工具。它允许你捕捉屏幕上的任何内容,包括: 活动窗口、对象、整个屏幕、矩形区域、手绘区域以及滚动的窗口/网页。另外该程序还包含了一些创新的功能,例如: 浮动捕捉面板、快捷键捕捉、调整大小、裁剪、文本注释、打印、通过 E-Mail 发送、屏幕放大镜,屏幕直尺,屏幕取色器,屏幕录制器等。
说明 前端经常需要拾色,但目前市场拾色器众多,对我而言,我需要的仅是一款轻量级、使用便捷的就可以了,而 FastStone Capture 就是这么一款软件,它不仅可以拾色,还包含了我最想要的直尺功能,毕竟前端工作也需要用到直尺测量,除此之外,它还可以像QQ一样,当放到屏幕最上边时可以缩小,完全不会影响你的工作空间,当你需要的时候就可以随时调出。
展示 下载链接 百度网盘:https://pan.baidu.com/s/1q2BEB7d_1A1Q8lchuOnsJA
提取码:h7rp
一:什么是数据倾斜 数据倾斜是进行大数据计算时常见的问题。主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,造成部分数据大量的集中在某一个节点上,形成了数据热点,导致这一节点运行时间远远大于其他节点的时间reduce端主要是partition不均匀导致。
二:Hive中有那些容易造成数据倾斜的情况以及处理办法 1:map端数据倾斜 当maptask出现较多的小文件时,需要合并小文件,可以通过设置 set hive.merge.mapfiles=true来解决, set hive.map.aggr=true;//map端聚合:相当于Combiner,可以减小map端的压力, set hive.groupby.skewindata=true;负载均衡 //有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR job。 第一个job中,map端的输出结果集合会随机分布到Reduce中,每个reduce都做部分聚合, 并输出结果,这样的处理结果是相同的group by key有可能被分布到不同的reduce中, 从而达到负载均衡的目的,第二个MR job再根据预处理的数据结果按照group by key 分布到reduce中(这个过程可以保证相同的group by key被分布到同一个reduce中), 最后完成最终的聚合操作。 ------------------------------------------------------------------- /当单个文件大小稍大于block的大小可以适当的增加map的个数: set mapred.map.tasks个数 /当文件大小适中,map端计算量较大的时候(sum,count等),需要增加map个数: set mapred.map.tasks个数,set mapred.reduce.tasks个数 -------------------------------------------------------------------- 2:大小表关联 小表在join左侧,大表在右侧,或使用mapjoin 将小表加载到内存中。然后再对比较大的表进行map操作
join就发生在map操作的时候,这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle
如:select /*+ MAPJOIN(a) */ hive0.11 版本之前 a.c1, b.c1 ,b.c2 from a join b where a.c1 = b.c1; map join 概念:将其中做连接的小表(全量数据)分发到所有 MapTask 端进行 Join,从 而避免了 reduceTask,前提要求是内存足以装下该全量数据,在内存允许的条件下使用 map join 比直接使用 MapReduce 效率还高些, 当然这只限于做 join 查询的时候。
仅整理个人和组里对下文引用的论文(HybridSN)的学习所获,如有错误,感谢指正~
更新记录
⭐️ 2021.3.6 —— 关于本文2.2.2节卷积层参数的计算
⭐️ 2021.3.8 —— HybridSN如何接受尺寸大小不同的输入
目录 写在前面1 研究思路2 网络结构2.1 简要的计算过程2.2 具体的网络结构2.2.1 对于India Pines数据集2.2.2 关于每层参数的计算 3 实验设置3.1 采用的数据集3.2 评价指标3.3 对比实验 4 组里讨论意见写在后面持续补充 写在前面 最近导师说学院要一份研究报告小结,发现之前看过的很多论文笔记没随身携带,果然及时整理成电子版的比较方便。
本文整理的论文HybridSN于2020.2发表于IEEE Geoscience and Remote Sensing Letters,这篇论文最让我好奇的是,其测试准确率在高光谱公共数据集Salines Scence上达到了100%!与之前的模型SSRN相比,HybridSN以提升一个数量级的可训练参数为代价,进一步提升了准确率。前段时间把这篇论文又认真阅读了一次,并在Colab上运行了作者提供的代码。
本文侧重于网络结构的设计和实验分析,以及组里对这篇论文的一点意见。
论文:
S. K. Roy, G. Krishna, S. R. Dubey and B. B. Chaudhuri, “HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification,” in IEEE Geoscience and Remote Sensing Letters, vol. 17, no. 2, pp.
文章目录 问题背景1.需求2. 使用tomcat提供一个接口3. 使用nginx代理文件3.1 nginx 配置3.2 ES配置3.3 增加词汇不生效3.4 修改nginx配置进行验证 4.spring boot tomcat的设置 问题背景 1.需求 最近有一些需求导致我们需要扩充IK的词库,按照IK的官方走了一遍,这里是官方的一些介绍
IK热更新配置方式
我们的ES版本为7.1.1
2. 使用tomcat提供一个接口 按照文档在tomcat服务中提供一个接口,来将自定义的热词数据写出去,结果在es中不能成功加载这些数据。
项目是一个springboot项目,接口的代码如下
@RequestMapping(value = "/remoteExtDict/select", method = RequestMethod.GET) public void select(HttpServletResponse response) { List<String> resultList = remoteExtDictMapper.selectRemoteExtDict(); StringBuilder result = new StringBuilder(); for (String value : resultList){ result.append(value+"\n"); } result.delete(result.length()-1,result.length()); try { Long time = remoteExtDictMapper.getMaxTime(); response.setHeader("Last-Modified", time.toString()); response.setHeader("ETag",time.toString()); response.setContentType("text/plain; charset=utf-8"); String test = "上海堡垒\n陈默涵\n天际漫谈\n大西瓜\n人生如梦\n快手"; PrintWriter writer = response.getWriter(); writer.write(test); writer.
github的hosts地址 # Github Hosts
# update: 2021-01-26
140.82.113.4 github.com
140.82.114.10 nodeload.github.com
140.82.113.5 api.github.com
140.82.114.10 codeload.github.com
185.199.108.153 training.github.com
185.199.108.153 assets-cdn.github.com
185.199.108.153 documentcloud.github.com
185.199.108.154 help.github.com
185.199.108.153 githubstatus.com
199.232.69.194 github.global.ssl.fastly.net
199.232.96.133 raw.github.com
199.232.96.133 raw.githubusercontent.com
199.232.96.133 cloud.githubusercontent.com
199.232.96.133 gist.githubusercontent.com
199.232.96.133 marketplace-screenshots.githubusercontent.com
199.232.96.133 repository-images.githubusercontent.com
199.232.96.133 user-images.githubusercontent.com
199.232.96.133 desktop.githubusercontent.com
199.232.96.133 avatars.githubusercontent.com
199.232.96.133 avatars0.githubusercontent.com
199.232.96.133 avatars1.githubusercontent.com
199.232.96.133 avatars2.githubusercontent.com
199.232.96.133 avatars3.githubusercontent.com
199.232.96.133 avatars4.githubusercontent.com
199.232.96.133 avatars5.githubusercontent.com
199.232.96.133 avatars6.githubusercontent.com
199.232.96.133 avatars7.githubusercontent.com
199.232.96.133 avatars8.githubusercontent.com
# End of the section
STM32 Bootloader跳转到APP程序中无法启动实时系统 一、问题描述: STM32G431 bootloader跳转到APP中执行,能够进入APP的main函数,但main函数里创建实时系统(CMSIS-RTOS2)失败。
二、问题解决过程: 首先明确:APP程序稍作修改(去掉中断向量偏移,flash起始地址改为0x08000000),不用bootloader,直接烧录到单片机里是肯定可以执行的,实时系统也是可以运行的。
以下是bootloader跳转处的程序(bootloader也用的是CMSIS-RTOS2系统)。
if((Flash_Read_Word(AppCode_Address) & 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 jump2app();//跳转到APP osKernelUnlock(); } 此程序能跳到APP中,但无法创建实时系统。
1、首先想到的是中断,所以在bootloader 添加__set_PRIMASK(1)或__set_FAULTMASK(1)关闭所有中断,在APP中添加__set_PRIMASK(0)或__set_FAULTMASK(0)打开中断。 if((Flash_Read_Word(AppCode_Address) & 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); __set_FAULTMASK(1);//__set_PRIMASK(1); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 jump2app();//跳转到APP osKernelUnlock(); } 没有成功,接下来我于是调整__set_PRIMASK(0)或__set_FAULTMASK(0)的位置,比如说放到main函数的开头、稍后或者bootloader中,作尝试,都没有成功。
if((Flash_Read_Word(AppCode_Address) & 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); __set_PRIMASK(1); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 __set_PRIMASK(0); jump2app();//跳转到APP osKernelUnlock(); } 2、接下来我对程序究竟死在哪儿,做了研究。 如果不加__set_PRIMASK(1),CMSIS-RTOS2的osKernelInitialize()函数返回值是-6,然后会再往下执行。
/// Status code values returned by CMSIS-RTOS functions.
拿到offer之路往往不是那么顺利,而且我是在重庆拿到北京的offer,接下来我分享下自己拿到北京offer的历程。
首先说说为何要从重庆到北京,重庆是座漂亮的城市,但是互联网还不够成熟,没有比较大型的互联网公司,也没有比较先进的互联网技术,互联网氛围不够浓厚。我如果继续呆在重庆,成长是缓慢的,而如果选择去一线城市,那么自己的成长就会快很多,而且自己还是想进大厂看看大厂的工作流程,拓宽自己的视野。所以我就萌生了要去北京的想法。
既然决定要去北京,就要为之后的面试做充足的准备。首先从面试强度而言,北京肯定是要比重庆面试难度大点,而且我参考了很多别人的面试经验分享,知道编程基础扎实的话会给自己加分很多。于是那段时间我也开始疯狂补习自己的编程基础知识,例如数据结构与算法,操作系统,计算机基础等。另外担心会有公司出算法题,为此在leetcode上刷了两百多道题,几乎上保持每天两三道题的频率。事实证明这些在后来的面试中都是有用的。
之后我想在自己的简历上增加亮点,因为这样更容易通过公司的初筛。但想想自己除了爬虫还会什么呢,突然想到自己以前从事过nlp算法的经历,虽然没能成为算法工程师,但是之前也花了很大部分时间在研究算法上,于是索性不如出个教初学者入门nlp的项目吧,于是就开始着手写这个项目,写完之后发布到github上的效果出乎我意料,当时还登上了Python热榜,到现在已经获得了6百多个star,并且每天都还在持续增加中。
如果有对nlp感兴趣的同学想初步入门,也可以看看我这个项目,项目地址是:https://github.com/Alic-yuan/nlp-beginner-finish。
接下来就是投简历和面试了,由于我在重庆,所以只能接受视频面试,不过当时由于疫情原因,视频面试这种形式也开始流行起来。在找工作的面试中难免会遇到不合适,没通过的情况,但我相信我终能找到一份适合自己的工作。最终在自己不懈的努力下,拿到了我现在的公司,一家头部教育公司的offer。在这场面试中,之前学到的数据机构和算法知识以及我之前刷题的经历起到了至关重要的作用。
现在回顾在重庆找北京工作的那段时期,确实很累,白天要把自己的工作完成好,晚上回到家还要再继续学习,中途遇到失败的面试还要鼓励自己不要灰心,继续坚持下去。但一切都是值得的,以后的你,一定会感谢曾经努力的自己!
以上就是我拿到北京offer的经历啦,希望能够对你有些许帮助。之后我还会在公众号持续输出自己的经验,如果大家有想要和我交流或者需要帮助的,都可以关注公号和我联系,能帮到大家的我都义不容辞。另外我还建立了一个Python萌新交流群,群里气氛活跃,我也经常在群里解答大家的问题,想要加群的也可以通过公号加群。
来日正长,一起前行!
https://github.com/MrDotYan/vue3.0-elemenplus-admin-template.git
应用层是 OSI 七层网络模型的第七层,不同类型的网络应用有不同的通信规则,因此应用层协议是多种多样的,比如 DNS、FTP、Telnet、SMTP、HTTP、 等协议都是用于解决其各自的一类问题。
一,Http通信协议的基本原理 http 协议在远程通信场景中的应用还是挺广泛的,包括现在主流的微服务架构的通信都是基于 http 协议。
1,一次http请求的通信流程 我们在浏览器上输入一个网址后,浏览器是如何展示目标网址的内容的?内容是从哪里来的呢?
DNS: (Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务, 用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯
但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。DNS 协议提供通过域名查找 IP 地址,或逆向从IP 地址反查域名的服务
二,http通信协议的组成 HTTP 协议是基于应用层的协议,并且在传输层使用的 TCP 的可靠性通信协议。既然是协议,那么就应该符合协议的定义:协议是两个需要通过网络通信的程序达成的一种约定,它规定了报文的交换方式和包含的意义,所以,接下来我们来深入去剖析 HTTP 协议的原理和组成。
1,请求URI定位资源 我们在浏览器中输入一个地址,浏览器是如何根据地址去找到服务器对应的资源并做返回的?以及这个地址包含了哪些有价值的信息呢?
URL (Uniform Resource Locator),统一资源定位符 ,用于描述一个网络上的资源,具体格式是:
URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见 URL 是 URI 的子集。
http://www.baidu.com:80/java/index.html?name=aaa
schema://host[:port#]/path/…/?[url-params]#[ query-string]
scheme 指定应用层使用的协议(例如:http, https, ftp)
host HTTP 服务器的 IP 地址或者域名
port# HTTP 服务器的默认端口是 80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.
Ubuntu docker安装、容器准备、环境准备以及软件安装 docker安装SSH安装 容器准备环境准备安装必要软件配置SSH免密登录设置时区关闭防火墙 安装MySQL安装JDKHadoop安装Hive安装Sqoop安装 docker安装 SSH安装 更新源 dsj@dsj:~$ sudo apt-get update 如果这一步发现更新很慢,可以这样设置
点击系统设置,选择软件和更新,下载自选择其他站点
点击选择最佳服务器
等待找到最佳的服务器,选择服务器 点击关闭,选择重新载入
完成后再次更新源
下载ssh服务
dsj@dsj:~$ sudo apt-get install -y openssh-server 启动ssh服务 dsj@dsj:~$ systemctl start sshd 查看本机的ip地址 dsj@dsj:~$ ip addr 可以使用MobaXterm连接
安装curl
dsj@dsj:~$ sudo apt install curl 安装docker dsj@dsj:~$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 查看docker版本 dsj@dsj:~$ docker -v 容器准备 拉取镜像 dsj@dsj:~$ sudo docker pull centos:7 启动并创建容 dsj@dsj:~$ sudo docker run -itd --privileged --name singleNode -h singleNode \ > -p 2222:22 \ > -p 3306:3306 \ > -p 50070:50070 \ > -p 8088:8088 \ > -p 8080:8080 \ > -p 10000:10000 \ > -p 60010:60010 \ > -p 9092:9092 \ > centos:7 /usr/sbin/init 查看镜像 dsj@dsj:~$ sudo docker ps 进入容器 dsj@dsj:~$ sudo docker exec -it singleNode /bin/bash 环境准备 安装必要软件 [root@singleNode /]# yum clean all [root@singleNode /]# yum -y install unzip bzip2-devel vim bashname 配置SSH免密登录 安装必要的SSH服务 [root@singleNode /]# yum install -y openssh openssh-server openssh-clients openssl openssl-devel 生成密钥 [root@singleNode /]# ssh-keygen -t rsa -f ~/.
常规分页查询缓存方案
我们都知道,通过缓存查询的结果,可以极大的提升系统的服务能力,以及降低底层服务或者是数据库的压力。
对于有分页条件的缓存,我们也可以按照不同的分页条件来缓存多个key,比如分页查询产品列表,page=1&limit=10和page=1&limit=5这两次请求可以这样缓存查询结果
productList:page:1:limit:10
productList:page:1:limit:5
这个是一种常见方案,但是存在着一些问题:
缓存的value存在冗余,productList:page:1:limit:10缓存的内容其实是包括了productList:page:1:limit:5中的内容(缓存两个key的时候,数据未发生变化的情况下)
仅仅是改变了查询条件的分页条件,就会导致缓存未命中,降低了缓存的命中率
为了保证数据一致性,需要清理缓存的时候,很难处理,redis的keys命令对性能影响很大,会导致redis很大的延迟,生产环境一般来说禁止该命令。自己手动拼缓存key,你可能根本不知道拼到哪一个page为止。
放弃数据一致性,通过设置失效时间来自动失效,可能会出现查询第一页命中了缓存,查询第二页的时候未命中缓存,但此时数据已经发生了改变,导致第二页查询返回的和第一页相同的结果。
以上,在分页条件下这样使用常规方案总感觉有诸多困扰,诸多麻烦,那是不是就应该放弃使用缓存?
基于SortedSet的分页查询缓存方案
首先想到的解决方法是使用@see ListOperations不再根据分页条件使用多个key,而是使用一个key,也不分页将全部的数据缓存到redis中,然后按照分页条件使用range(key,start,limit)获取分页的结果,这个会导致一个问题,当缓存失效时,并发的写缓存会导致出现重复数据
所以想到通过使用set来处理并发时的重复数据,@see ZSetOperations
代码逻辑如下:
range(key,start,limit)按照分页条件获取缓存,命中则直接返回
缓存未命中,查询(没有分页条件)数据库或是调用(没有分页)底层接口
add(key,valueScoreMap)写入缓存,expire设置缓存时间
当需要清理缓存时,直接删除key,如果是因为数据新增和删除,可以add(key,value,score)或remove(key,value)
redis中会按照score分值升序排列map中的数据,一般的,score分值是sql语句的order by filedA的filedA的值,这样能保证数据一致性
但是这种方式也存在一定问题:
这个key缓存的value确实是热数据,但可能只有少数数据被频繁使用其余的可能根本就未被使用,比如数据有100页,实际可能只会用到前10页,这也会导致缓存空间的浪费,如果使用了redis虚拟内存,也会有一定影响
sql查询由原来的分页查询变成了不分页查询,缓存失效后,系统的处理能力较之前会有下降,尤其是对于大表
总结
这两种方式互有利弊,具体使用还是要按照具体场景,合理选择!有更好的方案也欢迎讨论:-)
R7 5700U 为 8 核 16 线程,1.8-4.3GHz,GPU 为 8 个计算单元,频率为 1.9GHz。
选r5 5500u还是r75700u这些点很重要!看完你就知道了 http://www.adiannao.cn/dy
R5 5500U集成了基于Zen 2微体系结构的六个内核。 它们的频率为2.1(保证的基本频率)至4 GHz(Turbo),并支持SMT /超线程(12个线程)。 该芯片是在台积电采用现代7纳米工艺制造的。 与较旧的Ryzen 5 4500U(Renoir)相比,Ryzen 5 5500U提供了超线程。 更快的Ryzen 5 5600U已经基于更新的Zen 3架构。
AMD锐龙R5 5500U怎么样?相当于什么水平级别档次?性能应该比旧的Ryzen 5 4500U略高(由于SMT支持)。
除了六个CPU内核之外,APU还集成了Radeon RX Vega 7集成显卡,具有7个CU和高达1800 MHz的频率。 双通道内存控制器支持DDR4-3200和高能效LPDDR4-4266 RAM。 此外,芯片还配备了8 MB的3级缓存。
APU的TDP指定为15瓦(默认)
运放,是运算放大器的简称
运算放大器是用模拟电子器件(如晶体管,场效应管,二极管等)构成的模拟集成电路,其特点是有很高的放大倍数和抗干扰能力,因此可以被设计成各种用途的派生电路,如电压比较器、窗口电路、波形发生电路等等,其中也有电压跟随器。
电压跟随器是一种具有100%电压负反馈的放大器电路,其特点是输出电压的幅度和极性都与输入电压相同,所以叫跟随器。典型线路如图所示:
运放跟随器有输入阻抗高,而输出阻抗低的特性,一般来说,输入阻抗可以达到几兆欧姆,而输出阻抗低,通常只有几欧姆,甚至更低。
在电路中,电压跟随器一般做缓冲级(buffer)及隔离级。
这是因为,电压放大器的输出阻抗一般比较高,通常在几千欧到几十千欧,如果后级的输入阻抗比较小,那么信号就会有相当的部分损耗在前级的输出电阻中。
此时,需要电压跟随器进行缓冲。起到承上启下的作用。
电压跟随器还可以提高输入阻抗,可以大幅度减小输入电容的大小,为应用高品质的电容提供保证。
集成运算放大器实质上是一个高增益的多级直接耦合放大器,具有很大的开环电压放大倍数(一般可达105)和极高的输入阻抗(可达l06Ω,采用场效应管输入级的可达109Ω以上)。
HA17555集成运放使用中一般加入深度负反馈,由于其开环增益很大,闭环增益仅由反馈电阻决定。
集成运放通常有3种基本接法。
反相输入放大器。输出信号Uo与输入信号Ui相位相反,放大倍数A=Uo/Ui≈-Rf/R1,如图(a)所示。同相输入放大器。输出信号玑与输入信号Ui相位相同,放大倍数A=Uo/Ui≈1+Rf/R1,如图(b)所示。电压跟随器。输出信号与输入信号配相位相同,放大倍数A≈1,如图10-47(c)所示。 图中(c)与(b)比较可见,电压跟随器就是Rf=O、R1=∞、反馈系数F=l时的同相输入放大器。
由于集成运放本身的高增益特性,因此用集成运放构成的电压跟随器具有极高的输入阻抗,几乎不从信号源汲取电流。同时具有极低的输出阻抗,向负载输出电流时几乎不在内部引起压降,可视为电压源。
集成运放电压跟随器的性能非常接近理想状态,并且无外围元件、无须调整,这是晶体管电压跟随器(射级跟随器)所无法比拟的。
参考:
http://www.elecfans.com/d/1108867.html
(一)yum源概述 yum需要一个yum库,也就是yum源。默认情况下,CentOS就有一个yum源。在/etc/yum.repos.d/目录下有一些默认的配置文件(可以将这些文件移到/opt下,或者直接在yum.repos.d/下重命名)。
首先要找一个yum库(源),然后确保本地有一个客户端(yum这个命令就是客户端),由yum程序去连接服务器。连接的方式是由配置文件决定的。通过编辑/etc/yum.repos.d/CentOS-Base.repo文件,可以修改设置。
打开CentOS-Base.repo文件,可以看到url路径是CentOS的官网自身的yum源,http://mirrorlist.centos.org/?release=releasever&arch=releasever&arch=basearch&repo=os。可以将这个mirrorlist注释掉,然后将baseurl设置成国内的阿里云源http://mirrors.aliyun.com/repo/Centos-6.repo,也可以在用于大量的rpm包的前提下设置成自己的本地文件系统(挂载目录),需要移除CentOS-Base.repo文件,并编辑CentOS-Media.repo文件。
name=Description#一个描述,随意。 baseurl=#设置资源库的地址,可以写阿里云也可以是自己的yum ftp:// http:// file:/// enabled={1|0}#enabled=1开启本地更新模式 gpgcheck={1|0}# gpgcheck=1表示检查;可以不检查gpgcheck=0 gpgkey=#检查的key;如果上面不检查这一行可以不写。 (二)yum源配置方法一(阿里云源) 1) 安装wget yum install -y wget 2) 备份/etc/yum.repos.d/CentOS-Base.repo文件 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.back 3) 下载阿里云的Centos-6.repo文件 wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 4) 重新加载yum yum clean all yum makecache (三)yum源配置方法二(本地挂载目录) 1) 下载iso文件 从CentOS的官网下载CentOS的完整版iso文件,并上传到Linux文件系统中,例如/opt/tools/。
2) 创建挂载目录 为iso文件的挂载创建目录。
mkdir /mnt/vcdrom 3) 挂载 将iso文件挂载到挂载目录。
mount -o loop -t iso9660 /opt/tools/CentOS-6.7-x86_64-bin-DVD1.iso /mnt/vcdrom 4) 移除或备份Centos-Base.repo文件 cd /etc/yum.repos.d/ mv Centos-Base.repo Centos-Base.repo.back 5) 编辑Centos-Media.repo文件 vim /etc/yum.
事务ACID原则、脏读、不可重复读、幻读
事务(transaction):要么都成功、要么都失败
ACID原则:
原子性(Atomicity):要么都成功、要么都失败
一致性(Consistency):事务前后的数据完整性要保持一致
隔离性(Isolation):是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干预
持久性(Durability):事务提交,事务一旦提交则不可逆,被持久化到数据库中!
隔离所导致的一些问题
脏读:
指一个事务读取了另一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
幻读:
在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
-- ===============事务=================
-- MySQL是默认开启事务自动提交的
set autocommit = 0 -- 关闭
set autocommit = 1 -- 开启(默认的)
-- 1.手动处理事务
set autocommit = 0 -- 关闭自动提交
-- 2.事务开启
start transaction -- 标记一个事务的开始,从这个之后的SQL都在同一个事务内
-- 3.操作
insert xxx
insert xxx
-- 4.提交:持久化(成功!)
commit
-- 回滚:回到原来的样子(失败!)
rollback
-- 5.事务结束
set autocommit = 1 --开启自动提交
-- 了解
savepoint 保存点名 -- 设置一个事务的保存点
条件
condition
wan 和 wan6 是默认配置
Wan and wan6 are the default configurations
同时wan6可以获取到原生IPv6
At the same time wan6 can get native IPv6
ssh链接之后,进行备份配置文件后,并进行修改
After the ssh link, after backing up the configuration file, and modifying it
root@cby:~# vim /etc/config/dhcp root@cby:~# cat /etc/config/dhcp config dnsmasq option localise_queries '1' option rebind_protection '1' option rebind_localhost '1' option local '/lan/' option domain 'lan' option expandhosts '1' option authoritative '1' option readethers '1' option leasefile '/tmp/dhcp.
锐龙5 4600U有6核心12线程,其他的主频2.3-4.0GHz,二级缓存3MB、三级缓存8MB,集成Vega 6 GPU,384个流处理器,频率1500MHz都相同。
选r5 5500u还是r54600u这些点很重要!看完你就知道了 http://www.adiannao.cn/dy
R5 5500U集成了基于Zen 2微体系结构的六个内核。 它们的频率为2.1(保证的基本频率)至4 GHz(Turbo),并支持SMT /超线程(12个线程)。 该芯片是在台积电采用现代7纳米工艺制造的。 与较旧的Ryzen 5 4500U(Renoir)相比,Ryzen 5 5500U提供了超线程。 更快的Ryzen 5 5600U已经基于更新的Zen 3架构。
AMD锐龙R5 5500U怎么样?相当于什么水平级别档次?性能应该比旧的Ryzen 5 4500U略高(由于SMT支持)。
除了六个CPU内核之外,APU还集成了Radeon RX Vega 7集成显卡,具有7个CU和高达1800 MHz的频率。 双通道内存控制器支持DDR4-3200和高能效LPDDR4-4266 RAM。 此外,芯片还配备了8 MB的3级缓存。
APU的TDP指定为15瓦(默认)
报错:ValueError: I/O operation on closed file
ValueError: I/O operation on closed file。是指处理了已经被关闭的数据。一般是语句没有对齐。当python的处理代码不对齐的时候会出现这种情况。使用with方法打开了文件,生成的文件操作实例在with语句之外是无效的,因为with语句之外文件已经关闭了。 报错部分代码:
class Maoyan(object): ... def run(self): response = self.get_data() datas = self.parse_data(response) self.save_data(datas) if __name__ == '__main__': ... with open('猫眼.csv', 'a', newline='', encoding="utf8") as f: csv_writer = csv.writer(f) csv_writer.writerow(head) maoyan = Maoyan() maoyan.run() 解决:
检查了很多遍,因为已经确认了是缩进的问题,最后才发现最后两行代码也要缩进,因为调用的保存也要在with语句块里能有效。
改成图片里这样就可以运行了!
Linux shell脚本内的set -x set +x set -e set -u set -n的应用 set命令可以定义脚本的运行方式,变量的获取方式,脚本的执行过程,脚本的测试。
1,set -u (检查脚本内的变量,如果有变量未被定义将终止脚本)(脚本的自检测功能)
#!/bin/bash set -u echo $A 这是一个极为简单的shell脚本,功能为输出变量abc的值,但可以看到在脚本内并没有给定变量a的值,如果执行,将会报错。脚本名称为test.sh。执行后输出如下(也就是变量没有赋值):
[root@centos7 ~]# bash test.sh test.sh: line 3: A: unbound variable 如果不使用set -u,那么脚本将会忽略错误,完整执行,并不会报错,也就是说默认是不检测变量是否赋值。
[root@centos7 ~]# cat test.sh #!/bin/bash echo $A [root@centos7 ~]# bash test.sh [root@centos7 ~]# 2,set -e
没有使用set -e的时候,脚本即使遇到错误也可以继续执行下去,例如:
#!/bin/bash cat hello.sh echo "this is my script file" [root@centos7 ~]# cat test.sh #!/bin/bash cat hello.sh echo "this is my script file"
Vue前端:引用高德地图动态添加markers和标签 效果实现过程 效果 显示的效果如下
实现过程 一些基础的设置参照了这篇文章,指路:https://blog.csdn.net/ActiveLi/article/details/102592797
接下来写一下我自己的操作
步骤如下:
1.在项目终端的下安装vue-amap包
npm install vue-amap --save 2.在项目的main文件内写入以下内容
import AMap from 'vue-amap'; //地图类 Vue.use(AMap); AMap.initAMapApiLoader({ key: '在高德上为此应用申请的key',// 高德key plugin: [// 插件集合 (插件按需引入)'AMap.Geolocation' 'AMap.Geocoder', 'AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.OverView', 'AMap.Geolocation', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor'],// v: '1.4.4' //指定版本号 }); 3.在需要的此地图vue页面的中加入
<template> <!-- 高德地图 --> <div :style="{width:'100%',height:'700px'}"><!-- zoom是变焦,key是v-for的属性:events="marker.events":label="marker.label"--> <el-amap ref="map" vid="amapDemo" :center="center" :zoom="zoom" :plugin="plugin" class="amap-demo"> <el-amap-marker v-for="(marker, i) in markers":key="i" :position="marker.position":label="marker.label"> </el-amap-marker> </el-amap> </div> </template> 4.在script标签中加入一下data和method(其中接口名和数据自行使用自己项目中的接口)
<script> //其他项目的依赖项需要自行引入 import { AMapManager } from 'vue-amap'; export default { data(){ zoom: 15, center: [110.
这是我作为家庭作业所做的一个小程序的一部分:
public Exam maxGrade() {
Node p = firstNode;
int max = 0;
String name;
while (p!=null) {
if (p.info.getGrade()>max) {
max = p.info.getGrade();
name = p.info.getName();
}
p = p.next;
}
if (name==null)
return null;
else
return searchByName(name);
}
因此,当我继续编译时,编译器输出以下消息:
Student.java:127: error: variable name might not have been initialized
if (name==null)
用以下代码替换第四行可以很容易地解决这个问题:
String name = null;
现在,我可以看到一些逻辑.但我真的很想掌握这个问题背后的运作方式.
我的意思是,如果变量在你的代码中看到你正在对它做一些事情,那么编译器会检查变量是否被初始化似乎是合理的,但我认为我没有做任何需要初始化变量的事情.
根据像this这样的来源,当我简单地声明我的String(或任何其他Object)变量“name”时,它已经指向null.那么为什么仅仅检查该值是否为空它被认为是异常?除了赋值之外,编译器是否会考虑我对未初始化变量所做的任何错误?
iOS 真机12.4.1的系统上需要设置这一项 textView.layoutManager.allowsNonContiguousLayout = NO; 其实和覆写父类这俩方法也有关系,如果不覆写也不会出现显示一半的问题
- (void)setSelectedRange:(NSRange)selectedRange { } - (UITextRange *)selectedTextRange { return nil; }
匿名用户
1级
2013-01-06 回答
servlet-api.jar这个包.在tomcat等服务器中可找到此包.
request对象的主要方法有:
1. getAttribute( String name )
返回name指定的属性值,如果指定的属性值不存在,则会返回null值.
2. getAttributeNames()
返回request对象的所有属性的名字,其结果是一个类举(Enumeration)类的实例.
3. getCookies()
返回客户端的Cookie对象,结果是一个Cookies数组.
4. getHeader( String name )
返回指定名字的request Header的所有值,其结果也是一个类举类的实例.
5. getHeaderNames()
返回所有request Header 的名字,其结果也是一个类举类的实例.
6. getMethod()
获得客户端向服务器端传送数据的方法,如get,post等.
7. getParameter( String name )
获得客户端传送给服务器的参数值,该参数是由name指定的.
8. getParameterNames()
返回客户端传给服务器摘的所有参数的名字,其结果也是一个类举类的实例.
9. getParameterValues( String name )
获得指定参数的所有值,参数由name指定.
10. getProtocol()
获得客户端向服务器端传送数据所依据的协议的名称.
11. getQueryString()
获得查询字符串,该字符串由客户端以get方法向服务器端传送.
12. getRequestURI()
获取发出请求字符串的客户端的地址.
13. getRemoteAddr()
获取客户端的IP地址.
14. getRemoteHost()
获取客户端的名字.
15. getServerName()
获取服务器的名字.
16. getServerPort()
获取服务器的名字..
二手交易市场操作备忘录 源码:https://github.com/DedicationTechnology/SecondHandMarket
个人博客:个人博客
GitHub:GitHub
【smtp服务器无法链接】使用celery异步发送激活邮件时,在worker端显示smtplib.SMTPServerDisconnected: Connection unexpectedly closed
解决方案:修改setting.py的数值(注意:发送端(pycharm)和worker端都要修改)
【path中使用正则】在通过激活邮箱地址来获取秘钥时在path路径使用正则表达式匹配网址中的路径失败
当要在path中使用正则时要用re_path来代替path,否则无法进行正则匹配
【redis接受celery异步处理】celery异步发送邮件worker端开启监听处理准备接受redis端的任务
celery -A celery_tasks.tasks worker -l info # celery_tasks文件夹下的task.py文件中包括一些需要异步处理的任务,这里就是异步发送电子邮件 【mysql竖向显示数据】select * from df_address \G
表示读取df_address表中的所有数据,\G表示以竖向排列
【Mac传输文件到ubuntu】在mac上传输文件到ubuntu虚拟机中(似乎不能直接传输文件,只能传输压缩包)
scp /Volumes/MacData/Pycharm/projectFile/SecondHandMarket.zip yfx@172.16.136.128:/home/yfx/桌面/ 【异步发送文件】异步发送邮件时报错:django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM
在redis端task.py中添加如下代码(task.py是redis端发送邮件的代码处)
import django, os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SecondHandMarket.settings') django.setup() 【session数据查询/cache缓存查询】查看session数据是否保存在redis数据库中
redis-cli -h 172.16.136.128 select 9 keys * 【文件只读】mac下出现只读文件无法写入的问题
sudo mount -uw / 【tracker和storage服务器启动】启动tracker和storage服务器时报错:Failed to start fdfs_trackerd.service: Unit fdfs_trackerd.service not found
如果虚拟机的网络连接方式不是net则修改为net链接,如果是则直接重启Linux虚拟机(不是挂起)
【Linux解压】linux解压命令总结
unzip filename. ziptar -zxvf filename. tar.