1.安装passport插件
composer require laravel/passport 或 composer require laravel/passport "^9.0" 2.执迁迁移文件,生成数据表,保存token数据
php artisan migrate 3.生成客户端授权码 注:secret保存起来 php artisan passport:install 4.修改接口账号模型
5.修改config/auth.php文件中的api配置 6.令牌的有效期
在app/Proivders/AuthServiceProvide.php文件中的boot方法添加有效期
use Laravel\Passport\Passport; // token认证有效期2小时 Passport::tokensExpireIn(now()->addHour(2)); // 刷新token认证有效期30天 Passport::refreshTokensExpireIn(now()->addDays(30)); 7.解决auth在接口中登录没有attempt问题
8.实现登录,并且注意,如果登录不成功,数据返回符合restful规范
9. 接口token生成
生成接口验证token在登录成功后生成
此处附上代码
public function login(Request $request){ //表单验证 //异步获取 ajax 和 接口会用 try { $this->validate($request,[ 'username' => 'required', 'password' => 'required', ]); }catch (\Exception $exception){ return response()->json(['code'=>1,'msg'=>'账号或密码不能为空'],400); } //查看对象中可用的方法 //dump(get_class_methods());die; $data = $request->all(); unset($data['_token']); $bool = auth()->guard('apiweb')->attempt($data); //账号登录成功 if ($bool){ //得到用户模型对象 $userModel = auth()->guard('apiweb')->user(); //生成token 保存在服务器端1份 给客户返回1份 $token = $userModel->createToken('api')->accessToken; $data = [ 'expire' => 7200, 'token' => $token ]; return response()->json($data); }else{ return response()->json(['code'=>2,'msg'=>'账号或密码不正确'],401); } } 10.
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 数组中两个数的最大异或值,我们先来看题面:
https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/
Given an integer array nums, return the maximum result of nums[i] XOR nums[j], where 0 <= i <= j < n.
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
示例 示例 1: 输入:nums = [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR 25 = 28. 示例 2: 输入:nums = [0] 输出:0 示例 3: 输入:nums = [2,4] 输出:6 示例 4: 输入:nums = [8,10,2] 输出:10 示例 5: 输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出:127 解题 https://blog.
上面的问题涉及到的核心问题就是环境配置,这里就直接放解决方法了,想了解更多的可自行去学习下macOS环境变量相关内容~;
出现这样的问题,可以想到的就是一定是某个地方少了自动source配置,才造成需要自行source的结果,解决方案为:
cd ~ ls .zshrc vim .zshrc 写入:source ~/.bash_profile :wq 进行关闭 即可在任意新终端进行任意目录下工具的调用~
python+ADB实现手机控制(2021淘宝的喵糖活动自动点击) 背景环境ADB(Android 调试桥)python环境手机环境 简单程序 背景 双十一 TaoBao的活动太折磨人了,要一个一个点击进去浏览,等待若干秒,不如直接写个小程序挂机吧!!!
环境 ADB(Android 调试桥) ADB提供了一组你可以控制调试安卓手机的命令,理解起来并不难。有了ADB,你可以把自己对手机的操作替换成命令行。
ADB的官网下载连接:https://editor.csdn.net/md?not_checkout=1&articleId=120978183。
ADB下载后解压,不能直接点击EXE文件运行,需要通过命令行的方式打开。通过CMD方式打开ADB,记得将目录切换到adb.exe在的路径。输入adb,检查是否正确执行:
为了python能够直接调用adb,需要添加环境变量。
添加环境变量:与所有田间环境变量的方法一样,在高级系统设置里添加一条新的环境变量,名称为“adb”,路径为adb的解压路径,然后在PATH变量中,新增一条路径。
python环境 这个右手就行吧
手机环境 打开开发者模式打开USB中允许模拟点击,红米K20如下图: -tips:如果不打开,在执行adb命令时,会报如下错误:
错误信息:
java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission at android.os.Parcel.createExceptionOrNull(Parcel.java:2376) at android.os.Parcel.createException(Parcel.java:2360) at android.os.Parcel.readException(Parcel.java:2343) at android.os.Parcel.readException(Parcel.java:2285) at android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:1012) at android.hardware.input.InputManager.injectInputEvent(InputManager.java:907) at com.android.commands.input.Input.injectKeyEvent(Input.java:355) at com.android.commands.input.Input.access$100(Input.java:41) at com.android.commands.input.Input$InputKeyEvent.sendKeyEvent(Input.java:203) at com.android.commands.input.Input$InputKeyEvent.run(Input.java:190) at com.android.commands.input.Input.onRun(Input.java:107) at com.android.internal.os.BaseCommand.run(BaseCommand.java:60) at com.android.commands.input.Input.main(Input.java:71) at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:463) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:812) at com.
深度学习Pytorch(五)——数据加载和处理 文章目录 深度学习Pytorch(五)——数据加载和处理一、下载安装包二、下载数据集三、读取数据集四、编写一个函数看看图像和landmark五、数据集类六、数据可视化七、数据变换1、Function_Rescale2、Function_RandomCrop3、Function_ToTensor 八、组合转换九、迭代数据集 一、下载安装包 packages:
scikit-image:用于图像测IO和变换pandas:方便进行csv解析 二、下载数据集 数据集说明:该数据集(我在这)是imagenet数据集标注为face的图片当中在dlib面部检测表现良好的图片——处理的是一个面部姿态的数据集,也就是按照入戏方式标注人脸
数据集展示
三、读取数据集 #%%读取数据集 landmarks_frame=pd.read_csv('D:/Python/Pytorch/data/faces/face_landmarks.csv') n=65 img_name=landmarks_frame.iloc[n,0] landmarks=landmarks_frame.iloc[n,1:].values landmarks=landmarks.astype('float').reshape(-1,2) print('Image name :{}'.format(img_name)) print('Landmarks shape :{}'.format(landmarks.shape)) print('First 4 Landmarks:{}'.format(landmarks[:4])) 运行结果
四、编写一个函数看看图像和landmark #%%编写显示人脸函数 def show_landmarks(image,landmarks): plt.imshow(image) plt.scatter(landmarks[:,0],landmarks[:,1],s=10,marker=".",c='r') plt.pause(0.001) plt.figure() show_landmarks(io.imread(os.path.join('D:/Python/Pytorch/data/faces/',img_name)),landmarks) plt.show() 运行结果
五、数据集类 torch.utils.data.Dataset是表示数据集的抽象类,自定义数据类应继承Dataset并覆盖__len__实现len(dataset)返还数据集的尺寸。__getitem__用来获取一些索引数据:
#%%数据集类——将数据集封装成一个类 class FaceLandmarksDataset(Dataset): def __init__(self,csv_file,root_dir,transform=None): # csv_file(string):待注释的csv文件的路径 # root_dir(string):包含所有图像的目录 # transform(callabele,optional):一个样本上的可用的可选变换 self.landmarks_frame=pd.read_csv(csv_file) self.root_dir=root_dir self.transform=transform def __len__(self): return len(self.landmarks_frame) def __getitem__(self, idx): img_name=os.path.join(self.root_dir,self.landmarks_frame.iloc[idx,0]) image=io.imread(img_name) landmarks=self.landmarks_frame.iloc[idx,1:] landmarks=np.array([landmarks]) landmarks=landmarks.astype('float').reshape(-1,2) sample={'image':image,'landmarks':landmarks} if self.transform: sample=self.
目的:直接打包迁移anaconda中的python环境 将anaconda中的python虚拟环境,从一台服务器,直接“拷贝”到另一台服务器中。如果重新安装环境,python依赖的各个包还要重新下载安装一遍,贼麻烦!
前提介绍 Ubuntu16.04
anaconda3.5
迁移目标:python3.6(即上图中的env1)
anaconda可以管理多个虚拟环境,在anaconda/envs目录下。假如服务器1上,我们有5个python环境(如上图),我们现在要把env1,复制到新的服务器2上。
迁移过程 将服务器1上的anaconda/envs/env1,复制一份到服务器2的anaconda/envs下.修改pip文件。pip具体路径:anaconda/envs/env1/bin/pip
第一行中的python绝对路径需要修改正确!!!(否则pip install 报错) #!/home/njlz/anaconda3/envs/uphead/bin/python # -*- coding: utf-8 -*- import re import sys from pip._internal.cli.main import main if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit(main()) 注:暂时只遇到pip的问题,也许会出现anaconda/envs/env1/bin/目录中其他的执行命令的报错,大概率也是类似的原因。
Composition API的出现就是为了解决Options API导致相同功能代码分散的现象 看了一下我项目初版的代码,简直是没有体现出Composition API的优势,可以给大家看一下某个组件内的代码
<template> <aside id="tabs-container"> <div id="logo-container"> {{ navInfos.navName }} </div> <ul id="tabs"> <li class="tab tab-search" @click="showSearch"> <i class="fas fa-search tab-icon"/> <span>快速搜索</span> </li> <li class="tab tab-save" @click="showSaveConfigAlert"> <i class="fas fa-share-square tab-icon"></i> <span>保存配置</span> </li> <li class="tab tab-import" @click="showImportConfigAlert"> <i class="fas fa-cog tab-icon"></i> <span>导入配置</span> </li> <br> <li v-for="(item, index) in navInfos.catalogue" :key="index" class="tab" @click="toID(item.id)"> <span class="li-container"> <i :class="['fas', `fa-${item.icon}`, 'tab-icon']" /> <span>{{ item.name }}</span> <i class="fas fa-angle-right tab-icon tab-angle-right"
简单的管理后台基本上就是数据的增删改查。主要就是 列表 + form 表单。每个页面的逻辑基本上都相同。不同的地方就是每个页面需要调用的具体 API 及参数。
以前 vue2 的时候最简单的做法是写出来一个页面的逻辑,然后直接 copy 到各个页面中,修改 API 及参数即可。高级一点的是利用 mixin 函数,将可复用逻辑抽离,每个页面引入 mixin。
vue3 之后新增了composition API。本文就是利用composition API,将可复用的逻辑抽离到composition API中,并引入ts,实现一个简单的管理后台功能。
利用@vue/cli创建项目 首先需要将 @vue/cli 升级到最新版。本文用的是4.5.6版本。
vue create admin cd admin npm run serve create选择手动选择Manually select features,会有一些交互性的选择,是否要安装router、vuex等选项,空格可以切换是否选中。我们选中TypeScript、Router、Vuex、CSS Pre-processors。
我们利用axios + axios-mock-adapter + mockjs来进行接口请求、接口模拟及假数据生成,接下来再安装这几个包。
npm install axios npm install -D axios-mock-adapter mockjs 项目整体框架 假设我们的项目包含一个 Header,Header 的作用是切换页面。两个页面,分别为 List 和 About,这两个页面都是简单的列表+增删改查的操作。
路由 需要在 router 中增加一个 list 的路由信息。
const routes: Array<RouteRecordRaw> = [ { path: '/', name: 'Home', component: Home, }, { path: '/about', name: 'About', component: () => { return import(/* webpackChunkName: "
目录 1、多次触发1.1、代码1.2、相关链接 2、不触发2.1、代码2.2、相关链接 3、关闭监听事件参数 1、多次触发 vue中使用bus传值时,接收页面多次触发接收方法,多个页面公用一个bus时会触发所有打开过的bus。
1.1、代码 mounted() { bus.$on("busMethod", (data) => { console.log(data); }); }, beforeDestroy() { bus.$off("busMethod"); }, 1.2、相关链接 链接
2、不触发 2.1、代码 create() { bus.$on("getData", this.getList()); }, beforeDestroy() { bus.$off("getData", this.getList()); }, 2.2、相关链接 sf-vue – 事件总线 EventBus
3、关闭监听事件参数 ● EventBus.$off("eventName", callback); 只移除这个回调的监听器。
● EventBus.$off('eventName'); 移除该事件所有的监听器。
● EventBus.$off(); 移除所有的事件监听器,不需要添加任何参数。
首先说几点安装Pytorch时需要注意的点:
1.如果有能力,最好在科学上网后,利用类似如下命令直接安装:
conda install pytorch torchvision torchaudio cudatoolkit=11.3 这里注意:上述命令行最后没有-c pytorch,这点与官网的不一样,官网给出的是这样的:
加上-c pytorch的意思好像是从清华源下载~~
2.如果能力不足,无法科学上网,则需要手动切换镜像源了,比如切换清华源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn 之后仍然利用下述命令安装:
conda install pytorch torchvision torchaudio cudatoolkit=11.3 注意:这里还是没有 -c pytorch。因为我加上 -c pytorch后发现安装会有问题,所以还是去掉 -c pytorch。
3.如果要安装GPU版本的Pytorch,则需要你的电脑上有NVIDIA显卡,而不是AMD的。之后,打开CMD,输入:
nvidia-smi 则会出现:
其中,CUDA Version表示你安装的CUDA版本最高不能超过11.4。另外,若Driver Version的值是小于400,请更新显卡驱动。
说了半天,重点来了:
当你安装完后,输入:
import torch torch.cuda.is_available() 发现返回值是False,这时候就很难受,明明安装的是GPU版本的,咋会是False呢。
可能的一个原因如下:
输入conda list,你会发现:
好家伙,Pytorch为啥是CPU版的?明明我的安装命令是GPU版的啊。在网上查找一番,发现原因如下:由于我是利用清华源下载的,可能是清华源没有对应cuda版本的pytorch,所以会装cpu版的。
解决方法:卸载重装,由于我是用conda安装的,所以卸载命令如下:
conda uninstall pytorch 重装方法:
1.最直接的,利用科学上网重装,见上文
2.可以去清华源网站上找对应的版本,安装输入命令行时将cuda版本改掉,网址如下:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
参考:
https://www.jb51.net/article/205490.htm
Pytorch(CPU/GPU版本)安装科普指南 - 知乎
pytorch安装及卸载_diyun的博客-CSDN博客_卸载pytorch
一、公式法 所谓公式法就是针对某个指标,用公式层层分解该指标的影响因素。
举例:分析某产品的销售额较低的原因,用公式法分解:
某产品销售额=销售量 X 产品单价
销售量=渠道A销售量 + 渠道B销售量 + 渠道C销售量 + ...
渠道销售量=点击用户数UV X 下单率 购买转化
点击用户数=曝光量 X 点击率
第一层:找到产品销售额的影响因素。某产品销售额=销售量 X 产品单价。是销量过低还是价格设置不合理?
第二层:找到销售量的影响因素。分析各渠道销售量,对比以往,是哪些过低了。
第三层:分析影响渠道销售量的因素。渠道销售量=点击用户数 X 下单率。是点击用户数低了, 还是下单量过低。如果是下单量过低,需要看一下该渠道的广告内容针对的人群和产品实际受 众符合度高不高。
第四层:分析影响点击的因素。点击用户数=曝光量 X 点击率。是曝光量不够还是点击率太低, 点击率低需要优化广告创意,曝光量则和投放的渠道有关。通过对销售额的逐层拆解,细化评估以及分析的粒度。 公式拆解法是针对问题的层级式解析,在拆解时,对因素层层分解,层层剥尽。
二、象限法 网易云、QQ、酷狗、虾米
用户日活 、年龄层、购买会员数、
通过对两种及以上维度的划分,运用坐标的方式表达出想要的价值。由价值直接转变为策略, 从而进行一些落地的推动。象限法是一种策略驱动的思维,常于产品分析、市场分析、客户管 理、商品管理等。
还有经典的 RFM 模型,把客户按最近一次消费(Recency)、消费频率(Frequency)、消费金额 (Monetary)三个维度分成八个象限。
象限法的优势: 1. 找到问题的共性原因 通过象限分析法,将有相同特征的事件进行归因分析,总结其中的共性原因。例如上面广告的 案例中,第一象限的事件可以提炼出有效的推广渠道与推广策略,第三和第四象限可以排除一 些无效的推广渠道; 2. 建立分组优化策略 针对投放的象限分析法可以针对不同象限建立优化策略,例如 RFM 客户管理模型中按照象限 将客户分为重点发展客户、重点保持客户、一般发展客户、一般保持客户等不同类型。给重点 发展客户倾斜更多的资源,比如 VIP 服务、个性化服务、附加销售等。给潜力客户销售价值更 高的产品,或一些优惠措施来吸引他们回归。
三、二八法/帕累托分析 二八法也可以叫帕累托法则,源于经典的二八法则。比如在个人财富上可以说世界上 20%的 人掌握着 80%的财富。而在数据分析中,则可以理解为 20%的数据产生了 80%的效果需要围 绕这 20%的数据进行挖掘。往往在使用二八法则的时候和排名有关系,排在前 20%的才算是 有效数据。二八法是抓重点分析,适用于任何行业。找到重点,发现其特征,然后可以思考如 何让其余的 80%向这 20%转化,提高效果。一般地,会用在产品分类上,去测量并构建 ABC 模型。比如某零售企业有 500 个 SKU 以及这 些 SKU 对应的销售额,那么哪些 SKU 是重要的呢,这就是在业务运营中分清主次的问题。常见的做法是将产品 SKU 作为维度,并将对应的销售额作为基础度量指标,将这些销售额指 标从大到小排列,并计算截止当前产品 SKU 的销售额累计合计占总销售额的百分比。百分比在 70%(含)以内,划分为 A 类。 百分比在 70~90%(含)以内,划分为 B 类。 百分比在 90~100%(含)以内,划分为 C 类。 以上百分比也可以根据自己的实际情况调整。ABC分析模型,不光可以用来划分产品和销售额,还可以划分客户及客户交易额等。比如给企 业贡献 80%利润的客户是哪些,占比多少。假设有 20%,那么在资源有限的情况下,就知道 要重点维护这 20%类客户。
页面表单 <i-form ref="formValidate" :model="d" :rules="ruleValidate" :label-width="88"> <Form-item label="价格" prop="price"> <i-input v-model="d.price" type="float" placeholder="价格"></i-input> </Form-item> js校验修改前
//新增、修改的校验规则 ruleValidate: { price: [ {required: true, message: '价格不能为空', trigger: 'blur'} , {validator: validatePositiveTwoPointNum, trigger: 'change'}, ], }, 出现问题点:修改操作时表单回填数据,点击保存,校验提示 “价格不能为空”,但断点数据是有的,且数据回填到了输入框,就校验不通过
js校验修改后校验OK
添加type:'float',
//新增、修改的校验规则 ruleValidate: { price: [ {required: true, type:'float',message: '价格不能为空', trigger: 'blur'} , {validator: validatePositiveTwoPointNum, trigger: 'change'}, ], }, 数字的判空校验,这里必须注明数字类型
本文介绍在Linux系统中安装Hardinfo、Sysinfo、Lshw的方法,使用它们以在Linux上查找硬件规格,经测试,在Ubuntu 18.04系统能完美运行,不过也适用于其他Linux发行版。以下介绍的三种工具都能获取Linux系统的所有硬件(和软件)细节。
1、Hardinfo安装和使用方法
Hardinfo将为您提供系统的硬件和软件详细信息,要说明的是,这些信息在lshw中不可用。
HardInfo可以收集有关系统硬件和操作系统的信息,执行基准测试,并以HTML或纯文本格式生成可打印的报告。
如果Ubuntu中未安装Hardinfo,请使用以下命令安装:
$ sudo apt install hardinfo
安装后,Hardinfo工具可以从终端或菜单中进行。
以下是Hardinfo默认界面的外观:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
正如您在上面的屏幕截图中看到的,Hardinfo具有简单直观的GUI。
所有硬件信息分为四个主要组,即计算机、设备、网络和基准,每个组都显示特定的硬件详细信息。
例如,要查看处理器详细信息,请单击“设备(Processor)”组下的“处理器(Devices)”选项:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
与lshw不同,Hardinfo可帮助您查找基本软件规范,如操作系统详细信息、内核模块、区域设置信息、文件系统使用情况、用户/组和开发工具等:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
Hardinfo的另一个显着特点是它允许我们做简单的基准测试来测试CPU和FPU功能以及一些图形用户界面功能:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
我们可以生成整个系统以及各个设备的报告,要生成报告,只需单击菜单栏上的“生成报告(Generate Report)”按钮,然后选择要包含在报告中的信息:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
Hardinfo也有很少的命令行选项。
例如,要生成报告并在终端中显示它,请运行:
$ hardinfo -r
列表模块:
$ hardinfo -l
有关更多详细信息,请参阅手册页:
$ man hardinfo
2、Sysinfo安装和使用方法
Sysinfo是HardInfo和lshw-gtk实用程序的另一种替代方法,可用于获取下面列出的硬件和软件信息:
系统详细信息,例如分发版本、GNOME版本、内核、gcc和Xorg以及主机名。
CPU详细信息,如供应商标识、型号名称、频率、L2缓存、型号和标志。
内存详细信息,如总系统RAM、可用内存、交换空间总量和空闲、缓存、活动/非活动内存。
存储控制器,如IDE接口、所有IDE设备、SCSI设备。
硬件详细信息,如主板、显卡、声卡和网络设备。
让我们使用以下命令安装sysinfo:
$ sudo apt install sysinfo
Sysinfo可以从Terminal或Dash启动。
要从终端启动它,请运行:
$ sysinfo
这是Sysinfo实用程序的默认界面:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
如您所见,所有硬件(和软件)详细信息都分为五类,即系统、CPU(参考:用top、vmstat、Htop、sar命令在Linux系统中检查CPU使用率/利用率)、内存、存储和硬件,单击导航栏上的类别以获取相应的详细信息:
安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格
更多细节可以在手册页上找到:
$ man sysinfo
3、Lshw安装和使用方法
Lshw(Hardware Lister)是一个简单但功能齐全的实用程序,它提供有关Linux系统硬件配置的详细信息,它可以报告确切的内存配置、固件版本、主板配置、CPU版本和速度、缓存配置、总线速度等,信息可以以纯文本,XML或HTML格式输出。参考安装及使用Lshw在Linux中检查计算机的硬件配置。
它目前支持DMI(仅限x86和EFI)、Open Firmware设备树(仅限PowerPC)、PCI/AGP、ISA PnP(x86)、CPUID(x86)、IDE/ATA/ATAPI、PCMCIA(仅在x86上测试)、USB和SCSI。
1.使用spring的初始化工具来构建项目
2.添加依赖
3.项目结构
4.详细文件
4.1配置文件
server: port: 8888 spring: datasource: driver-class-name: oracle.jdbc.driver.OracleDriver url: jdbc:oracle:thin:@127.0.0.1:11521:helowin username: mark password: 123456 flyway: enabled: false 4.2DTO
@Data @AllArgsConstructor @NoArgsConstructor public class UserDto implements Serializable { private Integer id; private String name; private String pwd; } 4.3Controller
@RestController @RequestMapping("/hel") public class HelloOracle { @Autowired private UserService userService; @GetMapping("/user") public List<UserDto> getUsers(){ List<UserDto> users= userService.getAllUsers(); return users; } } 4.4Service
public interface UserService { /** * 获取所有用户 * @return */ List<UserDto> getAllUsers(); } @Service public class UserServiceImpl implements UserService{ @Autowired private UserDao userDao; @Override public List<UserDto> getAllUsers() { List<UserDto> users=userDao.
首先再pycharm连接服务器的终端输入
echo $DISPLAY 不会有显示,需要再打开其他远程连接软件,如XShell(这个必须搭配Xsever,即Xlaunch软件打开服务器,因为XShell自身不带服务器)、MobaXterm(自身带Xserver)、SecureCRT等软件,通过ssh连接远程服务器,连接上后在终端输入:
echo $DISPLAY 显示
localhost:10.0 可能与我这显示不一样,也可能时显示2.0。不过知道这个之后,回到pycharm连接远程服务器的终端,输入上面得到的结果向下面这样,如果是2.0就把下面10.0改为2.0即可:
export DISPLAY=localhost:10.0 然后再连接远程的终端上输入
xclock 若能显示一个钟表就说明完成了,自己的代码也能显示远程图片了。
其他 选中本地文件能上传上去,但远程端的文件下载不到本地上,这是起初创建远程映射时,没有选择正确的映射文件路径,或者仅仅选择错了路径(比如映射文件路径仅为“/”)。
改变方法:
将deployment path改为你的工作区文件夹,这样在Remote Host上你的映射文件变为浅绿色,你右击Remote Host上的文件就可以download from here,将代码下载到本地映射区间文件夹下(即local path)。修改代码后,你也可以通过鼠标右击代码编辑页面->deployment->upload to xxxx更新代码至服务器上。
首先要对数据组进行扩容,然后定义新的数据组,将旧数据组的值重新赋值,最后开始插入数值
数组插入值:
前提:数组本身有序
插入要保证不会越界
步骤;
1、从后向前遍历
2、每个值要与插入的值进行比较,不符合顺序的后移
3、符合顺序的,要在后方插入
4、如果从头至尾没有插入,则插入在首位
目录
一、QTimer类使用
1、使用start开启 重复循环定时任务
2、单次延迟任务
3、超时为0的任务
4、一个综合点的例子
The QTimer class provides repetitive and single-shot timers. This class provide a high level programming interface for timers.
QTimer类提供重复和单次的定时器。
一、QTimer类使用 1、使用start开启 重复循环定时任务 First create a QTimer and then connect the timeout() signal to the appropriate slots. Call start() on the timer. From then on the timer will emit the timeout() signal at constant intervals.
首先创建一个 QTimer,然后将 timeout() 信号连接到适当的槽。 在计时器上调用 start()。 从那时起,计时器将以恒定的时间间隔发出 timeout() 信号。
Hello World 是由 PS 部分的 UART 和 CPU 上的软件输出的。主要部分是 PS 端实现,第一步我们将在 Vivado 中制作硬件;之后,在SDK中编写Hello World软件。
在 Vivado 中创建硬件 启动 Vivado。选择文件 - >新项目。设置项目的保存目的地和项目名称。这里,项目名称是“project_1”。项目类型应为“RTL 项目”。选择“板”。然后选择 digilentinc.com 作为您的供应商。选择 Zybo Z7-20 作为显示名称。
制作PS端硬件 使用左侧的 Flow Navigator-> IP INTEGRATOR-> Create Block Design 创建一个新的块设计。将默认名称保留为 design_1。
在图表视图中单击“按 + 按钮添加 IP”并选择“ZYNQ7 Processing System”。然后,将放置 PS 部分。然后单击屏幕上的“运行块自动化”。将出现设置窗口屏幕,确保选中“Apply Board Preset”并单击“确定”。
检查创建的块设计 可以通过右键单击图表视图并选择验证设计来检查它。即使是这么简单的设计,也发生了错误。原因是时钟没有正确提供给 M_AXI_GP0_ACLK。
修改块设计 AXI 是用于连接 IP 的总线。当 PS 成为主机并连接到其他从机 IP(例如 AXI GPIO)时使用。M_AXI_GP0_ACLK 是底层时钟。这次没有使用,可以通过关闭AXI_GP0本身的主控功能来纠正,这次我会通过正确设置时钟供应来解决。PS有一个名为FCLK_CLK0的端口,它看起来像一个 50MHz 的输出,将FCLK_CLK0 和 M_AXI_GP0_ACLK连接。
再次尝试验证设计,错误就会消失。
完成硬件设计 以上,仅PS部分的块设计就完成了。对于Hello World,只需要一个CPU和一个UART。将此块设计用作顶层设计。首先,生成一个输出文件并创建一个源文件。接下来,创建用于整个设计流程的 HDL 包装器。
mysql安装(linux环境) 1 下载 http://dev.mysql.com/downloads/mysql/
选择所需系统及版本的包,此次环境以CenOS7 64位安装8.0.26版本的mysql为例。
2 安装&设置 2.1检测是否已经安装了mysql rpm -qa | grep mysql* 2.2安装&启动 将下载的安装包mysql-8.0.26-linux-glibc2.12-x86_64.tar上传/usr/local目录下
解压压缩包,并将目录修改为mysql
[root@localhost local]# tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar mysql-test-8.0.26-linux-glibc2.12-x86_64.tar.xz mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@localhost local]# tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@localhost local]# mv mysql-8.0.26-linux-glibc2.12-x86_64 mysql 在mysql目录下创建data
[root@localhost local]# cd mysql [root@localhost mysql]# mkdir data 创建mysql用户组和mysql用户,并修改mysql目录权限
[root@localhost mysql]# groupadd mysql [root@localhost mysql]# useradd -r -g mysql mysql [root@localhost mysql]# chown mysql:mysql -R /usr/local/mysql 进入/usr/local/mysql/bin目录下并初始化,初始化后会在data目录下生成相关文件
[root@localhost mysql]# cd /usr/local/mysql/bin [root@localhost bin]# .
CMS 收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户交互体验的应用上使用.CMS 收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
作用域:老年代垃圾收集算法:标记 - 清除算法线程数:并发线程特点:以缩短停顿时间为目标 从名字中的Mark Sweep可以看出,CMS 收集器是基于 “标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:
初始标记: 仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快。并发标记:并发标记阶段从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。重新标记: 重新标记阶段是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。这个阶段的停顿时间一般会比初始标记阶段的时间稍长,但也远比并发标记阶段的时间短。并发清除: 清理删除掉标记阶段判断的已经死亡的对象,对未标记的区域做清扫。由于不需要移动存活对象,所以这个阶段也是可以与用户线程并发执行的。 其中初始标记、重新标记这两个步骤仍然需要 “ Stop The World ”,但速度很快。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上 CMS 收集器的内存回收过程是与用户线程一起并发执行的。
CMS 是一款非常优秀的垃圾收集器,有着并发收集(2,4阶段)、低延迟(1,3阶段)的优点。但还远没有完美的程度,至少有三个明显缺点:
CMS 对处理器资源非常敏感,在并发阶段,虽然不会造成用户线程停顿,但是却会因为占用一部分线程而导致应用程序变慢,降低总吞吐量。CMS 无法处理 “浮动垃圾” ,有可能出现 Concurrent Mode Failure 失败进而导致另一次完全 Stop The World 的 Full GC 产生。同样也是由于在垃圾收集阶段用户线程还需要持续运行,那就还需要预留足够内存空间提供给用户线程使用,因此CMS收集器不能像其他收集器那样等待老年代几乎完全被填满了再进行收集,而是当堆内存使用率达到某一阈值时,便开始进行回收。若预留的内存无法满足需要,则会出现一次“并发失败”(Concurrent Mode Failure)。 什么是浮动垃圾?由于并发标记和并发清理阶段,用户线程还是在继续运行的,程序自然就还会伴随有新的垃圾对象不断产生,而且这一部分垃圾对象出现在标记过程结束之后,CMS 无法在当次收集中处理掉这些垃圾,所以只能等到下一次垃圾回收时再进行清理。这一部分垃圾就称为浮动垃圾。
由于使用 “标记-清除” 算法,会导致大量空间碎片产生,可能无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC 但CMS只能使用标记-清除算法,因为当并发清除时,如果用整理算法,对象的移动会使得地址被修改,用户线程则无法正确使用该对象。整理算法更适合 “Stop The World” 的场景下使用。
当然也可通过设置参数设置几次GC之后进行碎片整理。
G1 收集器 G1 (Garbage-First) 是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足 GC 停顿时间要求的同时,还兼具高吞吐量的性能特征。被视为 JDK1.
今天登录WIN10系统时偶然看到登录界面多了一个管理员账号,而且有密码,我登不上去。我印象中我是只有一个账号的。
翻译翻译,看看是什么牛马。
马上右键删除该账户,免得被删文件或盗取资料。
很有可能是下载的文件中携带了木马病毒,从而在入侵电脑上新建一个账户,入侵者就可以通过该账号登录你的系统,然后删除或盗取你电脑上的资料,非常危险,而且这种病毒一般是不容易被发现的,因为也没有人会天天查看自己电脑上的账户,或者天天扫描杀毒。
不过,奇怪的是火绒居然没有提示我下载的文件有病毒,幸好登录桌面的时候碰巧看到了左下角有两个账户存在。所以说,安装杀毒软件是很有必要的,还要养成定期杀毒的好习惯。
马上用杀毒软件快速扫描一下,果然有病毒。
先简单介绍一下,左移运算符和右移运算符的功能: 计算机中的数字是以二进制补码的形式存放的,而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动。
左移的结果: 1.左移会让最高位溢出(也就是把最高位抛弃)
2.接着向低位补0
注意:无论是正数还是负数左移,最低位都是补0!!! 举个正数左移的栗子: 将10左移2位的代码图:
内存中10左移2位的变化图: 因此最终结果是:40
举个负数左移的栗子: -10左移2位:
因此,最中结果是:-40
右移的结果: a.对于正数而言: 1.右移会让最低位溢出(也就是把最低位抛弃)
2.接着向最高位补0 b.对于负数而言: 1.右移会让最低位溢出(也就是把最低位抛弃)
2.接着向最高位补1 注意:正数右移最高位补0,负数右移最高位补1. 举个正数右移的栗子: 10右移2位代码图: 10右移2位内存图:
最终结果:2
举个负数右移的栗子: -10右移两位代码图:
-10右移2位内存图:
最终结果:2
补充几个奇奇怪怪的小tip: a. 10<<33(10左移33位),但是10是int类型的,只有32位,按常理来想被移除完那就全部补0吧,错!!! 当移动位数超过最大位数后,系统会进行取余操作,即33%32=1,因此它会左移1位哒,是不是被坑了,哈哈哈哈哈哈哈哈哈哈哈。
补充一点:对于无符号的来说,当移动超过本身位数后就变为0.
b. 10<<-1(10左移-1位),正常来想,左移-1位,那不就是右移1位么,错!!!在系统中,左移-1位等价于左移31位(原因:32位-1位=31位)。 球球了,点个赞,支持一下吧,画图好累......
使用spotbugs的时候,加载find-sec-bugs插件,但是由于我之前删了一些东西,导致界面抛出了空指针异常,而且没有错误的日志错误堆栈之类的。
先在IDEA中设置remote debug:
复制命令,然后加入到启动命令中。
于是使用调试命令启动:
[~/GitProjects/spotbugs-4.4.2]$ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar ./lib/spotbugs.jar [21:43:17] Listening for transport dt_socket at address: 5005 在java.lang.NullPointerException下断点。
发现原来是有些文件被删除了。
于是找到find-sec-bugs的代码,删掉相关的文件名字符串,重新编译,再将find-sec-bugs插件放到spotbugs的pluin目录下即可。
一、Python中常见的异常 异常描述BaseException所有异常的基类Exception常规错误的基类NameError尝试访问一个没有声明的变量引发的错误IndexError索引超出序列范围引起的错误IndentationError缩进错误ValueError传入无效的参数KeyError使用映射中不存在的键引发的错误IOError输入/输出操作错误ImportError导入模块/对象失败AttributeError对象没有这个属性引发的错误TypeError类型不合适引发的错误MemoryError内存溢出错误(对于Python 解释器不是致命的)ZeroDivisionError除数为0引发的错误AssertionError断言语句失败SyntaxErrorPython 语法错误 二、异常处理语句 1. try…except语句 try 语句的工作原理如下:
首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。如果没有触发异常,则跳过 except 子句,try 语句执行完毕。如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 如果异常的类型与 except 关键字后指定的异常相匹配,则会执行 except 子句,然后跳到 try/except 代码块之后继续执行。如果发生的异常与 except 子句 中指定的异常不匹配,则它会被传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常 且执行将终止并输出如上所示的消息。 try: 可能出现错误的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑 在使用try…except语句捕获异常时,如果在except后面不指定异常名称,则表示捕获全部异常。
1.单分支
try: ab except NameError as e: #我们可以使用except与as+变量名 搭配使用,打印变量名会直接输出报错信息 print(e) #name 'ab' is not defined 2.多分支
import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("
1.登录 token 和 session的选择 客户端和服务器是否存在跨域问题,存在使用token,反之使用session
token原理 2.前端 新增单文件 vue组件
<template> </template> //模板区 <script> //行为区 export default { } </script> <style lang="less" scoped> //样式区 scoped 代表样式只在当前组件生效 </style> router.js 中增加路由规则
App.vue中增加路由占位符
访问根路径,重定向到/login
style 使用的less,要添加less和less-loader // 最新版本 可能会报错 npm install less less-loader --save-dev //卸载命令 npm uninstall less-loader //安装其他版本 npm install less-loader@4.1.0 //全局安装其他版本 npm install less-loader@4.1.0 -D //--save-dev 安装到开发环境 npm install less@3.12.2 less-loader@4.1.0 --save-dev //页面中使用 <style lang='less'> @import url("./statistical.less"); </style> 全局样式 入口文件中导入css
登录界面
目录 一、Azkaban概论1.1 为什么需要工作流调度系统1.2 常见工作流调度系统1.3 Azkaban 与 Oozie 对比 二、Azkaban集群安装2.1 集群模式安装2.1.1 安装包准备2.1.2 配置 MySQL2.1.3 配置 Executor Server2.1.4 配置 Web Server 2.2 Work Flow 案例2.2.1 HelloWorld2.2.2 作业依赖案例2.2.3 自动失败重试案例2.2.4 手动失败重试案例 三、Azkaban进阶3.1 JavaProcess 作业类型案例3.2 条件工作流案例3.2.1 运行时参数案例3.2.2 预定义宏案例 3.3 定时执行案例3.4 邮件报警案例3.4.1 登录邮箱开启SMTP3.4.2 默认邮件报警案例 3.5 电话报警案例3.5.1 第三方告警平台集成3.5.2 Azkaban多Executor模式注意事项 一、Azkaban概论 1.1 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:Shell脚本程序,Java程序,MapReduce程序,Hive脚本等;各任务单元之间存在时间先后及前后依赖关系;为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;
1.2 常见工作流调度系统 简单的任务调度:直接使用 Linux 的 Crontab 来定义;
注⚠️:Crontab不能处理具有依赖关系的任务调度!复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如 Ooize、Azkaban、 Airflow、DolphinScheduler 等。 1.3 Azkaban 与 Oozie 对比 Ooize 相比 Azkaban 是一个重量级的任务调度系统,功能全面,但配置使用
也更复杂。如果可以不在意某些功能的缺失,轻量级调度器 Azkaban 是很不错的候选对象。
Fiddler中选择要操作的请求,右键选择Replay→Request sequentially
Repeat Count输入框输入请求次数,确定
查看结果
EL表达式 EL表达式的格式是:${ } 如果是null时输出空白
EL输出四大作用域的顺序时从小到大
EL输出复杂的对象
jsp是什么? 底层是servlet的程序,响应数据的封装页面
访问jsp页面,tomcat会翻译成一个java源文件和字节码文件。
这个java文件继承HttpJspBase 间接继承 HttpServlet
https://www.runoob.com/jsp/jsp-directives.html
<%@ page contexType="",>
language 编译语言java
contentType 连接类型text/html; charset=utf-8
pageEncoding 页面本身的字符集
import 导包
autoFlush 设置是否开启缓存默认true
buffer 缓冲大小默认8Kb
errorPage 错误页面路径
isErrorPage 标记该页面是错误页面默认是true
session 访问当前jsp页面,是否会创建HttpSession对象,默认true
extends 设置jsp翻译出来的java默认继承谁
jsp常用脚本 表达式脚本
<%=表达式脚本%>
_jspService()
out.print()
代码脚本
<%
java语句
%>
jsp九大内置对象 request是请求 一次请求时才有效pageContext是PageContextlmpl类 只有当前页面有效session是HttpSession类 一次会话有效application 是ServletContext 整个web工程都有效
上面四个是四大域对象,优先从小到大使用config 是ServletConfigoutpageexceptionresponse是响应 jsp的out和response.getWrite().write("…")区别 out.flush()执行后out的缓冲会追加到response缓冲末尾
out.print可以输出任何数据
out.write只适合输出字符串
jsp 常用标签之静态包含 一般网页有:
头部信息,
主体信息,
尾部信息
静态包含(常用)
<%@ include file=" jsp页面"%>
特点:1.不会翻译被包含的jsp页面
2.是直接把被包含的jsp页面的代码拷贝到包含的位置执行输出
动态包含
JspRuntimeLibrary.include可以传递参数
<jsp:include page="
个人纯手写,本人也是小白,有错还望不吝指教,不喜勿喷。谢谢。
1、查看电脑当前Python环境
2、Python安装
步骤一:添加解释器到win path
步骤二:自定义选择安装选项
勾选第一条
此时下方路径应显示为:
C:\Program Files (x86)\Python37-32
或者:
C:\Program Files\Python37-32
管理员用户控制台输入 python,会有如下打印信息
3.1、Python包的安装
安装:pip install 包名
安装指定版本的:pip install 包名 版本号
卸载:pip uninstall 包名
查看当前电脑Python环境的已安装包列表:pip list
导出包列表txt:pip3 freeze > package.txt
从包列表文件安装: pip install -r package.txt
pip3 freeze > package.txt
导出的txt文件默认路径为(当前用户的根目录):
C:\Users\Administrator
3.2、Python包的安装-pip install
有的时候报错是因为网络慢,因为包的默认镜像源在国外,但国内也有相应的镜像源
如:
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
使用方法:
pip install 包名 -i http://mirrors.aliyun.com/pypi/simple/
3.3、Python包的安装-更新pip
在我们安装pip包的时候可能会遇到pip控件自身版本低的问题,如下图
解决方法:
使用提示中的: pip install --upgrade pip
进行更新
3.4、Python包的安装-查看包列表
查看包列表:pip list
可查看包是否已安装及包的版本
js保留两位小数方法总结 - 半指温柔乐 - 博客园
设定面板:
xtset stkcd time
xtreg y x1 x2 x3 i.time i.stkcd # 固定时间、企业
xtreg y x1 x2 x3 i.time # 固定时间
xtreg y x1 x2 x3 i.stkcd # 固定企业
xtreg y x1 x2 x3 i.industry # 固定行业
xtreg y x1 x2 x3 ,fe # 固定企业
虚拟化软件根据侧重不同 大致分为两类
侧重服务器虚拟化 一类是侧重服务器虚拟化方面
ESXi:是一个裸机管理程序,只有150多MB,可以以镜像的方式直接安装在Windows或Linux上。支持多种系统虚拟化如windows,linux,solaris,macOS,通过直接访问和控制底层资源,来对硬件资源整合以此降低成本提升性能。特点是占用空间小,支持的系统多
KVM是一个开源的基于 x86 Linux 的完整虚拟化解决方案,它由一个可加载的内核模块( kvm.ko )组成,这个模块提供虚拟化核心架构和处理器规范模块,可以虚拟每个虚拟机的私有硬件如网卡、磁盘等,由于KVM 是基于 Linux 内核实现的,所以他对linux的整合度很高,抽象来说他就是linux内核的一部分
Hyper-V:微软开发的,专为windows定制,也支持linux,但是性能缺失严重
Xen:由剑桥大学开发,设计初衷是一台主机能运行上百台虚拟机,引入了域的概念,虚拟机通过不同的域来分割,支持两种模式的虚拟化:半虚拟化(paravirtualization)和完全虚拟化(full virtualization)与KVM不同的是:当硬件不具备虚拟化能力的时候,Xen可以采用半虚拟化的方式运行虚拟机
侧重于桌面虚拟化 一类侧重桌面虚拟化
VMware workstation
VMware Fusion(Mac)
Oracle VirtualBox现在是由甲骨文公司进行开发, 可虚拟的系统包括Windows(从Windows 3.1到Windows10、Windows Server 2012,所有的Windows系统都支持)、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android等操作系统!
背景 介绍 架构 使用 接口 参考 https://blog.51cto.com/u_9291927/2502063
使用simulink搭建简单的安时积分计算电池的SOC
将ortp源码复制到window上,打开VS2019,文件----打开-----项目/解决方案
打开 ortp\build\win32nativ下的VS项目
导入完成
直接运行
编译报错,查看
屏蔽它
编译成功,添加dll或者lib使用库
库路径
\ortp\build\win32native\Debug
添加工程在exe/ortp/
第一层
# CMake 最低版本号要求 cmake_minimum_required(VERSION 3.0.0) # 项目名称 project(1) # 第二种编译方式,手动添加 file(GLOB MY_SOURCE_DIR ./source/*.c ./source/1/*.c) set(MY_INCLUDE_DIR ./include ./include/1) # 向工程添加多个指定头文件的搜索路径 include_directories (${MY_INCLUDE_DIR}) #链接线程库 LINK_LIBRARIES(-lm) # 向当前工程添加存放源文件的子目录 add_executable (main ${MY_SOURCE_DIR}) # 生成文件路径 指定为项目根目录的bin路径 set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/exe) add_subdirectory (source/2-ortp) 2-ortp
add_subdirectory (./rtpsend) add_subdirectory (./rtprecv) add_subdirectory (./mrtpsend) add_subdirectory (./mrtprecv) rtpsend
# CMake 最低版本号要求 cmake_minimum_required(VERSION 3.0.0) # 第二种编译方式,手动添加 file(GLOB ORTP_SOURCE_DIR ./*.c) set(ORTP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/1-ortp/) # 向工程添加多个指定头文件的搜索路径 include_directories (${ORTP_INCLUDE_DIR}) #链接线程库 LINK_LIBRARIES(-lm) # 找库 find_library(ORTP_LIB oRTP.
使用baseMapper.selectObjs()方法即可,然后再根据需要转为相应的类型。
例子如下:根据follower_id查询target_id的集合,然后转为String类型。
//得到targetId的值列表 List<Object> objects = followMapper.selectObjs( new QueryWrapper<Follow>().select("target_id").eq("follower_id", followerId) ); //转为String类型后返回 List<String> targetIdList = objects.stream().map(o -> (String) o).collect(Collectors.toList());
CSS3中transform属性 在css3中transform主要包括:
1、旋转(rotate)
rotate()在一个给定度数顺时针旋转的元素。负值表示元素按逆时针旋转。单位deg,设置的值为正数表示顺时针旋转,如果设置的值为负数,则表示逆时针旋转
transfrom: rotate(30deg); 2、扭曲(skew)
skew()包含两个参数值,分别表示X轴和Y轴倾斜的角度,如果第二个参数为空,则默认为0,参数为负表示向相反的方向倾斜
skewX():表示只在X轴(水平方向)倾斜
skewY():表示只在Y轴(垂直方向)倾斜
倾斜/扭曲;参数表示倾斜角度,单位deg
skew(x,y)使元素在水平和垂直方向同时扭曲(X轴和Y轴同时按一定的角度进行扭曲变形),如:
transfrom: skew(30deg,30deg); skewX(x)仅是元素在水平方向扭曲变形(X轴扭曲变形),如: transfrom: skewX(30deg); skewY()仅是元素在水平方向扭曲变形(Y轴扭曲变形),如:
transfrom: skewY(30deg); 3、缩放(scale)
scale():该元素增加或减少的大小,取决于宽度(X轴)和高度(Y轴)的参数。用于对元素进行缩放,可以通过transform-orgin对元素的基点进行设置,同样基点在元素中心位置;基中X表示水平方向缩放的倍数,Y表示垂直方向的缩放倍数,而Y是一个可选参数,如果没有设置Y值,则表示X,Y两个方向的缩放倍数是一样的,并以X为准。
transform: scale(2,1.5); sccleX():使用[sx,1]缩放矢量执行缩放操作,sx为所需参数。scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1)
transfrom: scaleX(2); sccleX():使用[1,sy]缩放矢量执行缩放操作,sy为所需参数。scaleY表示元素只在Y轴(水平方向)缩放元素
transfrom: scaleY(2); 4、移动(translate)
tarnslate()根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。
translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动),向右向上为证书,向左向下位移则为负“-”,translateX(x)仅水平方向移动(X轴移动)。translateY(Y)仅垂直方向移动,使用方法如下:
translate: translate(100px, 20px); translate: translateX(100px); translate: translateY(20px); 5、矩阵变形(matrix)
matrix()和2D变换方法合并成一个。matrix方法有六个参数,包含旋转,缩放,移动(平移)和倾斜功能。
矩阵:matrix 以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵。就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素,此属性值使用涉及到数学中的矩阵
改变元素基点transform-orgin
2D转换元素能够改变元素x和y轴。transform-orgin(x,y):用了设置元素的运动的基点(参照点)。默认点是元素的中心点。其中X和Y的值可以是百分值,em,px,其中x也可以是字符参数值left,center,right;
Y和X一样除了百分值以外还可以设置top,center,bottom,这个看上去有点像background-position设置一样,对应写法如下:
1、top left | left top 等价于 0 0 | 0% 0%
2、top | top center | center top 等价于50% 0
1.点中某行任意位置Ctrl+c 复制整行
2.复制历史 Ctrl+shift+v 3.Main方法 psvm main 4.剪切光标所在行 Ctrl+x
5.Alt+shift+上下 当前行向上向下移动
移动多行:shift+上,选中两行,Alt+shift+上下移动
6.Home键跳到行首,End键跳到行尾
Ctrl+左右,跳过一个词
Ctrl+shift+左右,选中一个词
7.Alt+左右 左右切换Tabs
8.打开所在文件夹 show in Explorer
9.导航栏切换 点击上面直接切换
10.Ctrl+shift+R/F 全局查找/替换
11.Ctrl+shift+N 按文件名查找文件 12.纵向选择多列:按住Alt不放,鼠标点击拖动
13.Ctrl+Alt+V 自动生成返回值 补全代码,相当于.var
14.指定for循环 变量名.for
判断是否为null 变量.null
15.Todo待办事项
16.Ctrl+shift+Alt+ j 选中当前文件中,所以一样的字符串
Ctrl+shift+右 选中一个词
1. 流的概念 stream即一系列数据,当不同介质之间有数据交互的时候Java就使用流来实现。当建立文件输入流后,这个流就可以用来把数据从硬盘读取到JVM(内存)中。流分为输入流(InputStream)和输出流(OutputStream)。
2. 流的种类 目前我接触到的流主要分为2类,一类是字节流(byte),另一类是字符流(char)。
关系如下:(当看到水印的时候就知道这图我绝对是借鉴的,我的xmind崩了)
2.1字节流 字节流即以字节的方式读取和写入数据。
写入:FileInputStream
读取:FileOutputStream
/* * 以字节流的形式读取数据 * */ public static void read(File file){ try(FileInputStream fis=new FileInputStream(file)){ byte[] all=new byte[(int)file.length()]; //将数据写入all数组中 fis.read(all); for(byte b:all){ System.out.println(b); } }catch (IOException e){ e.printStackTrace(); } } /* * 以字节流的形式向文件中写入数据 * */ public static void write(File file){ try(FileOutputStream fos=new FileOutputStream(file)){ //1.先判断一下文件路径是否存在,不存在的话新建个相应目录 if(!file.exists()){ //2.如果文件不存在的话找到file的目录,新建 file.getParentFile().mkdirs(); //3.下面这步是根据file创建空白文件,可以不写,因为outputStream在写出的时候只要路径正确,如果没有文件会自动进行创建 file.createNewFile(); } byte[] words={'a',99}; fos.write(words); }catch (IOException e){ e.printStackTrace(); } } 2.1.1数据流 数据流可以直接对文件进行字符串的读写,但是写好的文件需要指定的流进行读取。
1.放置—指示—编译屏蔽
2,灰色区域内的电路将不起作用,编译或者更新到PCB时也不会起作用
一、题目描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2:
输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2] 提示:
1 <= values <= 10000最多会对 appendTail、deleteHead 进行 10000 次调用 二、保姆级参考代码 // 登录 AlgoMooc 官网获取更多算法图解 // https://www.algomooc.com // 作者:程序员吴师兄 // Java 中的 Stack 类设计有问题,大部分情况下是使用 LinkedList 来构建栈,但为了结合动画更好的理解这道题目,所以依旧使用 Stack class CQueue { // 队列的特点,先进先出 // 栈的特点是先进后出 // 创建两个栈 // 创建栈 stack1 用来充当队列 Stack<Integer> stack1; // 创建栈 stack2 用来辅助 stack1 执行队列的一些复杂操作 Stack<Integer> stack2; // 这个函数是 creat queue // 意思就是初始化队列 // 由于题目要求我们用两个栈实现队列,所以在这个函数中初始化的是两个栈 public CQueue() { // 初始化 stack1 stack1 = new Stack<Integer>(); // 初始化 stack2 stack2 = new Stack<Integer>(); } // 这个函数的意思是在队列的尾部添加元素 // 使用栈来完成这个操作的话就是在 stack1 的后面添加元素就行 public void appendTail(int value) { // 直接将元素存放到 stack1 中 // 比如原队列为 // ------------- // 队尾 1 2 3 4 5 队头 // ------------- // 当前 value 为 6 // 那么由 stack1 和 stack2 组成的队列就是 // ---------------- // 队尾 6 1 2 3 4 5 队头 // ---------------- stack1.
第1章 debezium概述 1.1 debezium是什么 Debezium 是一组分布式服务,用于捕获数据库中的更改,以便您的应用程序可以查看这些更改并对其做出响应。 Debezium 在更改事件流中记录每个数据库表中的所有行级更改,应用程序只需读取这些流以查看更改事件发生的相同顺序。
1.2 debezium的依赖 Debezium 构建在 Apache Kafka 之上,并提供与 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。 Debezium 在 Kafka 日志中记录数据更改的历史记录,从您的应用程序使用它们的位置。 这使您的应用程序可以轻松正确且完整地使用所有事件。 即使您的应用程序意外停止,它也不会错过任何内容:当应用程序重新启动时,它将继续使用它停止的事件。
第2章 环境搭建 2.1 所需软件及测试版本 jdk-8u211-linux-x64.tar.gz
apache-zookeeper-3.5.7-bin.tar.gz
kafka_2.11-2.4.0.tgz
debezium-connector-oracle-1.7.0.Final-plugin.tar.gz
instantclient-basic-linux.x64-21.3.0.0.0.zip (oracle客户端)
oracle 11g R2
2.2 数据库准备 (1)设置Oracle LogMiner所需的配置
[root@tDataAnalysis01 config]# su - oracle [oracle@tDataAnalysis01 config]$ sqlplus / as sysdba SQL> alter system set db_recovery_file_dest_size = 10G; SQL> shutdown immediate; SQL> startup mount; SQL> alter database archivelog; SQL> alter database open; (2)保证Database log mode显示为Archive Mode
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
创作立场声明:以下所有网站都是我经常使用,并且免费的,各位值友可以放心使用!
大家好,我是江南俏才子,新人求支持、求关注,谢谢! 资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源, 资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源, 资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
网上付费资源太多,找资源没有渠道,头脑一片空白,你有没有这种遭遇?
大家好,我是江南俏才子,今天为大家带来了15个完全免费的资源网站,能白嫖不说,质量也丝毫不逊色于付费网站,这15个网站我给分为六大类,可以根据分类快速跳转到所需要的类型
一、学习考试类
1、问答酷
https://www.asklib.com/
一个非常全面的考试题库搜索网站,这个网站不仅适合大学生,也对很多需要考证的人士十分有用。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
这里提供的题库搜索包含财务类、计算机类、资格类、招录类、学历类、医学类。题库的类型涉及的比较全面,它不仅给我们提供了考试的题库搜索,还提供了这一个题目的答案解析。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
我们可以在线可以直接进行测试,测试完成之后,这里还会给我们提供相似的题目来进行巩固,可以说非常的强大。
2、考试酷
https://www.examcoo.com/
这是一个可以进行各种模拟考试的网站,或者说它是一个强大的综合题库中心,目前收录的试卷共有172万份,试卷188万套,共涉及12大类,以及数不清的职位和证书,比如会计资格证等。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
点开之后会展示更加详细的分类和科目,更六的是它还能直接进行线上测试,和考试一样,交卷就能评分,妥妥的刷题必备网站。
3、第一教程网
https://www.diyijc.com/
觉得刷题不够,那么我们就来直接学习。这是一个非常良心的教学网站,从学前教育到小学、初中、高中、大学、甚至是考研,这里都给我们提供了免费的课程资源,同时在学习视频观看过程中,不会有任何的广告,就是这么良心。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
当然它的功能并不仅仅局限于此,它同时为我们提供了各种资格证的资料,例如英语四六级教师资格、财务会计文化考试等等,它全部免费亲传给你。
二、图片资源类
1、彼岸图网
https://pic.netbian.com/index_2.html
这是我最喜欢的壁纸网站,没有之一。首先这里都是分辨率超高的壁纸,图片的质量可以完全不用担心。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
它的壁纸类型丰富,4K风景、4K动漫、4K科技,随意打开一个里面的资源,都会让你欲罢不能,不下载都对不起自己、
2、壁纸网
http://www.bizhi88.com/
这个网站是英文版的,但是丝毫不影响我们的使用。它的界面足以征服任何一个壁纸站,在这里我们可以按照屏幕的分辨率、壁纸的分辨率进行选择。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
这里壁纸的类型更是超级丰富,不过这里面的资源偏限于科技类型的,图片的质量也是相当不错的,点击之后就可以直接进行下载,非常的方便。
三、办公工具类
1、PDF转换
https://www.pdf365.cn/
安利给经常需要压缩图片、GIF、PDF文件的小伙伴,除了我提到的压缩功能,网站还支持pdf合并和分割,而且网站做得也很简洁美观,体验感非常的棒。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
目前来看,这里所有的功能全部都是免费使用的,每使用一个功能,界面也会进行相应的变化,使用方法也超级简单,直接点击上传文件就可以了,不得不说还是非常厉害的。
2、LightPDF
https://lightpdf.com/zh/
它所包含的功能,可以说是超级的齐全了。大家一眼就可以看到,它几乎支持所有格式之间的转换,同时网站完全免费。
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
资源网站推荐 篇九:这15个免费网站,帮你找到你想要的所有资源,
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用 Spring Boot 的开发风格做到一键启动和部署。
通俗地讲,Spring Cloud 就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架),主要贡献来自 Netflix OSS。
1.组件认识 2. 组件对比
最近给了一个新的需求,就是选择多个发货记录后导出发货记录及发货详情,要求导出的Excel格式如下
一个表格表示一条发货记录,里面的详情是不确定条数的。
因为我之前的其他的导出都是使用easyExcel的模板填充做的,所以我想这个能不能也用模板填充实现。
但存在一个问题就是发货记录是不确定个数的,但模板是写死的。
后面看到一些文章,发现一个思路:可以将多条发货记录使用模板生成多个sheet,然后再将多个sheet合并成一个。
一、首先是实现将一个模板填充多个sheet(参考 https://blog.csdn.net/once10/article/details/119616071) 1、实体对象 TrackingdeliveryExcelVO
package com.hx.admin.erp.response; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * <p> * 物流发货单查询返回VO * </p> * * @author wxb * @since 2021-10-18 */ @Data @EqualsAndHashCode(callSuper = false) public class TrackingdeliveryExcelVO implements Serializable { private static final long serialVersionUID = -2334403249810086977L; /** * id */ @ApiModelProperty("id") private Integer id; /** * 物流公司名称 */ @ApiModelProperty("物流公司名称") private String logisticsName; /** * 物流公司联系人 */ @ApiModelProperty("
#Python输出不重复的字符 #输入一个字符串,把最左边的10个不重复的字符(大小写算不同字符)挑选出来 #如果不重复的字符不到10个,则按实际数目输出 #输入格式:输入一个字符串s #输出格式:输出一个字符串,包含字符串s最左边10个不重复的字符 #输入样例1:Hello world , hello python #输出样例1:Helo wrd,h def unique(s): set1 = set([]) out = "" for i in range(len(s)): c = s[i] if c not in set1: out = out + c set1.add(c) return out[0:10] def main(): string = "Hello world , hello python" ret = unique(string) print(ret) if __name__ == '__main__': main() 运行结果:
安装python后,查看python是否安装成功,在cmd输入python ,提示“无法启动此程序,因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dlll_api-ms-*.dll文件丢失成功解决方法”
通过网络查询后,都说是VC++运行库的问题
方法一:出现这个问题是因为本地api-ms-win-crt-runtime-l1-1-0.dll 版本过低或者不存在。
Visual C++ Redistributable for Visual Studio 2015 安装包的官方下载地址:
https://www.microsoft.com/zh-cn/download/details.aspx?id=48145
于是下载安装还是无法解决
方法二(无效):
下载 api-ms-win-runtime-1-1-0.dll 进行替换
32位&64位对应路径:
C:\Windows\System32 (Windows 7/8/2008r2) C:\Windows\SysWOW64 (Windows 7/8/2008r2) 方法三:(成功解决)
只需要安装两个系统更新补丁: KB2999226、KB3118401
KB2999226 微软下载链接
Update for Universal C Runtime in Windows
KB3118401 微软下载链接
Update for Universal C Runtime in Windows
下载后安装即可正常使用程序。