命令行访问openstack并创建用户等详细步骤

使用命令行对openstack创建组别成员和外部网络,云主机并远程访问2。在访问之前需要准备虚拟机(VMware)远程访问软件(MobaXterm)。 1.先登录openstack,挂载镜像后安装python-openstackclient,进入openstack管理员模式 2.创建组别用户和密码 3.退出openstack管理员模式,进入交互模式创建外网 4.创建网段、网关、禁用dhcp、创建外网子网 5.退出交互模式进入openstack管理员模式创建镜像并挂载 6.拷贝管理员文件并修改配置文件 7.用普通用户登录进入交互模式,创建私网(拷贝私网名称,创建云主机要用) 8.创建私网子网 9.创建路由,关联公网与私网(外网和私网) 10.创建密钥并复制 11.创建安全组并放开两条规则 12.创建云主机(镜像、云主机类型、安全组、密钥对、网络、云主机名称) 13.查看云主机状态和网络状态 14.本地访问(复制网址到浏览器) 访问成功 15.创建浮动ip并在windows下测试能否ping通(win+r,输入cmd打开任务管理器,ping浮动ip地址) 16.远程访问(先将Linux里的密钥对拖到Windows里) 17.远程访问成功 以上就是命令行访问openstack并创建组别用户等的详细步骤,并配有成功后的截图。照着步骤来不会出错,希望大家都可以掌握命令行配置openstack。 

6个AI网站

1、啦啦爱:https://www.lalal.ai/?referral=KqDfDRcy&utm_source=referral_promo&utm_medium=link&utm_campaign=KqDfDRcy 2、AI写作:https://wenxin.baidu.com/ernie3 3、AI绘画:https://wenxin.baidu.com/ernie-vilg 4、线稿自动上色:https://petalica.com/ 5、歌词生成:https://wenxin.baidu.com/wenxin/pc/lyrics 6、学术灵感:https://easydl.zzh.coderai.cn/demo-5

vue3+qrcode插件实现下载二维码图片(.png、.svg格式)

注释:qrcode可通过canvas的toDataURL方法下载对应的png图片,比较恶心的是下载svg格式(必须记录一下) 安装一下qrcode插件 npm i qrcode --save 或 yarn add qrcode 页面引入 import qrcode from 'qrcode'; // 引入qrcode vue文件使用 <div class="qrcode-box"> <canvas id="qrcode" ref="qrcodeRef" :width="qrCodeSize" :height="qrCodeSize" /> <div id="qrcode-svg-container"></div> </div> <style scoped lang='less'> .qrcode-box { // 无需显示二维码(隐藏处理) position: absolute; left: -999px; top: -999px; } </style> js 处理 <script setup lang='ts'> import { reactive, ref, nextTick, onMounted, unref } from 'vue'; const qrAccURL = ref<string>(''); // 二维码内容地址 const qrcodeRef = ref<null>(); // 二维码DOM const qrCodeSize = ref<number>(200); // 二维码大小 const qrCodeType = ref<number>(1); // 二维码类型 1为图片 2为svg // 点击下载登记二维码事件 const onClickDownQrCodeButton = (size:number, type:number) => { qrCodeSize.

0-1背包问题(回溯法)

0-1背包问题是动态规划、贪心策略的一个子问题。回溯算法同样可以适用于0-1背包问题。下面使用回溯算法解0-1背包问题。 文章目录 一、问题描述二、算法设计三、实例1、输入:2、2个可行解:3、最优解:<0,1,1,1> 四、搜索空间1、子集树的运行2、实例:V={12,11,9,8}, W={8,6,4,3}, B=133、搜索空间:子集树,2^n片树叶4、可行解5、最优解 五、代码实现 一、问题描述 有n种物品,每种物品只有1个。 第i种物品价值为vi , 重量为wi, i=1,2,…, n。问如何选择放入背包的物品,使得总重量不超过B, 而价值达到最大? 思路:有n种物品,每个物品只有1个,放入背包可以有选择的,也可以不放。每种物品有两种选择,暴力破解就是这个样子,把所有可能的组合全部拿出来,观察能放进去的组合里面的最大的价值,那就是找到的解。如果把这个问题变成一个搜索树,也可以解的,其实相当于找一个向量。 二、算法设计 这个物品到底放不放进去的问题,找出这个向量是和这个物品的个数是有关系的,物品有n个,每个物品是放或者不放。这是一个搜索的二叉树,称之为子集树 三、实例 1、输入: V={12,11,9,8}, W={8,6,4,3}, B=13 2、2个可行解: <0,1,1,1>, 选入物品2,3,4,价值为28, 重量为13 <1,0,1,0>,选入物品1,3,价值为21, 重量为12 3、最优解:<0,1,1,1> 四、搜索空间 1、子集树的运行 最开始对于第1个物品而言,放或者不放。接下来在考虑对第二个物品而言,放或者不放。所以子集数会有物品数+1层,路径左边是装这个物品,路径右边是不装这个物品。 2、实例:V={12,11,9,8}, W={8,6,4,3}, B=13 3、搜索空间:子集树,2^n片树叶 第一层是第一个物品,第二层是第二个物品……每个物品占一层。采用装与不装进去到达叶结点。 4、可行解 例如装第1个物品,不装第2个物品,装第3个物品,不装第4个物品。这个路径就是<1,0,1,0>,这个路径是能装进去的,而且得到一个没有超过背包的容量能够把物品装进去的可行解,但是不一定是最优的。子集树中的虚线表示空,不再搜索。 <1,0,1,0>这个路径,第1个物品已经装进去了,重量是8,那么剩下的(13-8=7)。第2个物品是6,只有不装不然无法再装其他物品了。选择装第3个物品,剩余的空间是1(13-8-4=1),第4个物品是3,所以最后只装了第1个物品和第3个物品,并且重量还有剩余。 5、最优解 另外一条路径,不装第1个物品,装第2个物品,装第3个物品,装第4个物品。这个路径就是<0,1,1,1>,这个价值加起来是最大的。 五、代码实现 #include <iostream> using namespace std; #define N 5 //默认有4个物品。第一个不使用 int w[N]; //每个物品的重量 int v[N]; //每个物品的价值 int x[N]; //x[i]=1:物品i放入背包,0代表不放入 int n,c; //n:一共有多少物品,c:背包的最大容量 int SumWeight = 0; //当前放入背包的物品总重量 int SumValue = 0; //当前放入背包的物品总价值 int OptimalValue = 0; //最优价值;当前的最大价值,初始化为0 int OptimalSolution[N]; //最优解;OptimalSolution[i]=1代表物品i放入背包,0代表不放入 /* *回溯算法 参数t表示当前处在第几层做抉择,t=1时表示当前在决定是否将第一个物品放入背包 */ void backtracking(int t) { //叶子节点,输出结果 if(t>n) { //如果找到了一个更优的解 if(SumValue>OptimalValue) { //保存更优的值和解 OptimalValue = SumValue; for(int i=1; i<=n; ++i) OptimalSolution[i] = x[i]; } } else { //遍历当前节点的子节点:0 不放入背包,1放入背包 for(int i=0; i<=1; ++i) { x[t]=i; if(i==0) //不放入背包 { backtracking(t+1); } else //放入背包 { //约束条件:当前物品是否放的下 if((SumWeight+w[t])<=c) { SumWeight += w[t]; SumValue += v[t]; backtracking(t+1); SumWeight -= w[t]; SumValue -= v[t]; } } } } } int main() { cout<<"

Modbus RTC 协议实现点表查询功能

Modbus 协议是常见的一种通信协议,那么在应用层软件上怎么去设计,才能使其能够快速的响应以及具有高度的可移植呢?在这里介绍一个我经常用到的一个Modbus协议软件设计框架。即通过查表的方式,快速的去响应主从机的动作。 Modbus RTC 协议的帧格式如下: 发送: 从站地址功能码起始地址线圈数量CRC1字节(1~147)1字节(0x1)2字节(0x0000~0xFFFF)2字节(1~2000)2字节 接收: 从站地址功能码字节数线圈状态CRC1字节(1~147)1字节(0x1)1字节(N)N字节2字节 根据协议的帧格式,点表中,需要添加的几个元素为: 1、寄存器首地址 2、寄存器个数 3、数据类型 4、占的比重 5、读写的数据 6、回调函数 通过代码实现如下: /*数据类型*/ typedef enum { MBDG_TYPE_U8, MBDG_TYPE_S8, MBDG_TYPE_U16, MBDG_TYPE_S16, MBDG_TYPE_U32, MBDG_TYPE_STR, }T_Data_Type; /* 读写属性定义 */ typedef enum { READ_ONLY = 1, WRITE_ONLY, RW_BOTH, }E_Attribute; typedef struct { u16 uRegAddr; u16 uRegLen; u16 uType; u16 uRate; u16 uAttr; void *pData; void (*pFunc)(); }T_MB_Para; #definePARALLEL_MODULE_PROTO_TYPE_ADR 0x00 u16 Proto_Type = 0; /*点表数据*/ static const T_MB_Para tMBpara[] = { {PARALLEL_MODULE_PROTO_TYPE_ADR,1,MBDG_TYPE_U16,1,READ_ONLY,&Proto_Type,NULL},} #define MBDG_PARA_LEN (sizeof(tMBpara) / sizeof(tMBpara[0])) 在这里,tMBpara[]就是开头提到的点表,把需要读写是寄存器直接在tMBpara[]里面添加就行,通信时,直接去操作这个数组即可。

几种常用的数组遍历方法

整理一下常用的几种遍历方法,for和while循环就不再说了,说一下其他几种非常好用的方法 1.for in for in可定是接触比较早的遍历数组的方法,其实它也可遍历对象(遍历字符串也是可以的!),这个方法主要是针对对象,遍历数组最好不要用!!!实例演示一下 遍历数组 <script> var arr = ['a', 'b', 'c', 'd']; // 遍历数组 key是索引 for (var key in arr) { console.log(arr[key] + '---' + key); } </script> 遍历对象 var obj = { name: '张三', age: '20', sex: '男', } // 遍历对象 key是属性 obj[key]是属性值 for (let key in obj) { console.log(obj[key] + '---' + key); } 遍历字符串 和数组类似 // 遍历字符串 key是索引 var str = 'abcd'; for (let key in str) { console.

如何将图片清晰度变高?电脑怎么调照片清晰度?

每次处理图片时看到模糊的图片都很头疼,但是又不知道该怎么去提高图片清晰度,其实可以修改图片分辨率提高图片dpi使图片画质变高,那么如何修改分辨率(在线修改照片分辨率(DPI) 调整图片DPI 照片dpi修改工具-压缩图)呢?使用图片在线清晰处理工具来在线修改分辨率,操作简单使用方便,赶紧一起来看看吧。 在浏览器中搜索“压缩图”,导航栏中选择【修改dpi】。 上传图片,将dpi修改设置成300,点击生成后保存即可。 简单的几个步骤就可以在线变清晰图片质量也得到了提升,平时在提交考试照片、打印图片的时候都可以使用这款图片处理工具来修改图片dpi,支持图片改大小、转格式、抠图等等,欢迎收藏体验!

图像处理小知识点整理一

1.傅立叶变换与小波变换 傅立叶变换FFT 傅立叶变换是将信号完全的放在频率域中分析,但无法给出信号在每一个时间点的变化情况,并且对时间轴上任何点的突变都会影响整个频率的信号。 傅立叶变换的基是不同频率的正弦曲线,所以傅立叶变换是把信号波分解成不同频率的正弦波的叠加和,不能有效代表突然的变化。 小波变换wavelets 小波变换是以某些特定的函数为基(不止是一个),将数据信号展开成级数系列,它是时间和频率的局部变换,可同时在时域和频率中对数据进行多尺度联合分析,具有多尺度细化分析的功能。因此,我们可以在不同的分解层上和不同的小波基函数对信号进行有效的分析。 小波,不严格的说即有限持续时间的波形,其平均值为零。小波变换就是把一个信号分解成一系列的小波,小波有不同的大小和形状,多种小波的可用性是小波分析的关键优势。 将小波与正弦波进行比较,正弦波是傅里叶分析的基础,正弦曲线的持续时间没有限制—负无穷延伸到正无穷。正弦曲线是平滑的,小波往往是不规则和不对称的。 scaling & shifting 缩放:拉伸或收缩信号 小波在频域中具有带通特性 center frequnecy,拉伸小波有助于捕获信号中缓慢变化的变化,压缩小波有助于捕捉突变。 shifting移动 移动小波只是意味着沿信号长度延迟或推进小波的开始。 小波分析中的两个主要变换是连续与离散小波变换。 CWT(continuous wavelet transform)连续小波变换的关键应用是时频分析和时域频率成分滤波; DWT(discrete wavelet transform)离散小波变的关键应用是信号和图像的去噪和压缩,因为它有助于表示许多自然产生的信号和具有较少系数的图像 。 2.上采样upsampling 与下采样subsampling 上采样 放大图像(或者称为上采样upsampling或者图像插值interpolating)的主要目的是放大原图像,从而可以使图像在更高的显示设备上。图像放大几乎是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。 下采样 缩小图像(或称为下采样subsampling或者降采样downsampled)的主要目的有两个: 1.使得图像符合显示区域的大小; 2.生成对应图像的缩略图。 对图像的缩放操作并不能带来更多关于该图像的信息,因此图像的质量将不可避免受到影响。然而,确实有些缩放方法能够增强图像的信息,从而使得缩放后的图像质量超过原图质量。 对于一幅尺度为M*N,对其进行s倍下采样,即得到(M/s)*(N/s)尺寸的图像(s应该是M和N的公约数)。如果该图像是矩阵形式,则其本质上是将原始图像s*s窗口内的图像变成一个像素点,该像素点的值为该窗口内所有像素的均值。 3.哈尔小波 这位博主讲解的很详细了,就不自己整理了,指路⬇️: 小波变换一之Haar变换 小波变换二之Haar变换 小波变换三之Haar变换

CSDN首页源码,惊现辞职感言。。。

就在大前天的文章下,有一个读者给我留言,说让我去看看前端同学写的辞职感言。 并且贴心的给出了地址:view-source:https://www.csdn.net/ 好奇心下,在浏览器上访问了一下,果然发现了一段感言,截图如下: 应该是CSDN即将辞职的一名前端程序员,在离职的时候,首页上留下了一段文字,被网友们给发现了。 不过CSDN的动作也很快,我访问2个小时后,这段文字又从首页上消失了。 至于这个前端程序员的故事,大家也都没有听到后续,如果有认识的读者可以让联系我。 也许可以把这个故事,让他用另外一种方式讲完,也祝他顺利找到新的工作。 2 环普 在西安当地,有一个叫做环普科技园的地方,有很多的办公大楼,目前是西安程序员密度最高的地方。 西安的程序员市场中,至少有一半都是外包,而环普这一个地方,集中了西安一半以上的外包公司。 前两天我在群里,看到这样一个截图: 找西安几个在环普上班的几个小伙伴,确认了一下,消息属实。 已经不记得这是环普,今年以来第几次传出裁员的消息了,这两年几乎每隔上一段时间就会有。 这是因为外包的工作属性决定的。 外包的项目,基本上都是华为、中兴、银行等等,一些大型的甲方公司,将公司的非核心业务外包出来。 自从华为增长遇到困境,很多对应的项目都出现了收缩,那么华为这条线上没有项目,外包公司就会整个项目线裁掉。 像汇丰、其它大公司情况类似。 3 变化 大疫三年,没有人不受到影响,包括公司。 不过,现在慢慢也有了变化,随着政策的逐步放开,经济也会慢慢恢复到正常,这些大公司的利润也会慢慢恢复。 到那个时候,用人需求也会慢慢回归。 目前这个阶段,就像黎明前的黑暗一样,估计还要持续上6-12个月,等疫情彻底好转。 我相信,一切都会慢慢好一点。 另外,还有一点想说的。 任何的选择都是有代价的,上项目期间一般外包公司为了抢人,给的工资都会比其它公司要高上那么一点。 但这都是有代价的。 比如外包的长时间加班赶项目,上班没有归属感,还有就是稳定性相对差很多,没有项目裁人是日常操作。 只是这两年,更加突出而已。 在没有选择的情况下,外包算是一个相对比较好的过渡,但拉开更长的时间,还是应该找一个有自己产品的公司。 更能锻炼技术,也更稳定一点。 最后说一件重要的事,我最近建了一个【晋级的程序员】社群,旨在帮助新手小白快速上手找到编程的乐趣,里面沉淀了大量编程相关经验教程以及学习资料,目前社群人数已经超过2500人,欢迎大家加入:

银河麒麟操作系统V10SP1创建网页快捷方式至桌面的方法

修改浏览器配置文件添加快捷方式 1.在桌面点击鼠标右键,选择‘’打开终端‘’,终端界面显示‘桌面’ 2.在终端界面输入命令行 sudo vim qaxbrowser-safe.desktop (奇安信浏览 器的快捷方式) 进去后按‘/’然后输入‘Exec’,最后按回车键。会跳到 108 行。(或者可以 直接找到 108 行) 3.光标移到‘Exec’行,按字母‘a’开始编辑,在%U 后面添加–new-windows www.baidu.com,现在则跳转到百度网页。 然后移动到‘Icon’那行,修改为你图片的指定路径。路径最后记得加上图片的 名字。 如何查看图片的路径: 找到图片右键点击属性,位置那栏就是路径。 4. 按左上角的‘Esc 键’,然后按‘:’,最后输入 wq,保存文本退出 5. 找到奇安信浏览器图标,选中然后右键重命名,改为你自定义的名字。 注意: ①需要重命名后图标才会变。 ②图片路径需要找到和图片不能删除和移动,若改动则配置文件需跟着改动。 ③需要在桌面打开。

银河麒麟桌面V10SP1版本系统休眠唤醒鼠标键盘失效解决方法

使用银河麒麟桌面系统有时会出现系统休眠后再唤醒,鼠标键盘失效的问题,可尝试以下方法解决。 1.检查是否安装 laptop-mode-tools 工具 执行命令: dpkg -l | grep laptop-mode-tools 如果执行命令无结果输出,表示未安装(如果已安装,忽略第2步) 2.安装 laptop-mode-tools 包 执行命令: sudo apt update sudo apt-get install laptop-mode-tools 安装完成后查看结果 3.判断 Laptop 是否启用了 laptop_mode 模式 执行命令: cat /proc/sys/vm/laptop_mode 如果显示结果为0,则表示未启动,如果为非0的数字则表示启动了(一般是2) 4.启动 laptop_mod 直接在终端中输入 sudo laptop_mode start 启动了 laptop_mode 之后,在系统挂起后,基本上就不会遇到鼠标键盘无法唤醒的情况了。 5.查看在/etc/laptop-mode/laptop-mode.conf 中的配置 查找 ENABLE_LAPTOP_MODE_ON_BATTERY ENABLE_LAPTOP_MODE_ON_AC ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED 当用电池,外接电源,合上显示屏的时候是否启用 LAPTOP_MODE全部设置为 1 就可以了。 6.启动 laptop_mode 并查看结果: 执行命令: sudo laptop_mode start 注:为了解决鼠标键盘自动休眠导致的失灵问题,需要执行命令: sudo gedi /etc/laptop-mode/conf.d/runtime-pm.conf 把 AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST="" 改为 AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST="usbhid usb-storage" 注意:这一步一定要做。

NODE_npm设置国内源(淘宝镜像源)的几种方式,解决下载速度慢的问题

1.说明 刚安装的npm使用默认的源会感觉特别特别慢,所以,非常有必要使用国内的源,比如说众所周知的淘宝镜像源 2.全局设置 查看当前源 npm config get registry 设置为淘宝源 npm config set registry https://registry.npm.taobao.org # 还原默认源:npm config set registry https://registry.npmjs.org/ 3.临时使用 上面那种设置是全局的,以后每次都会自动读取已经设置好的源,如果只是一次性使用,可以使用下面的命令 npm --registry https://registry.npm.taobao.org install XXX(模块名) 4.使用cnpm cnpm是一个命令,用它来代替npm npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install XXX(模块名) 5.使用nrm npm install -g nrm nrm use taobao nrm ls # 查看当前可用源命令

Python入门(第二篇)Python环境与下载

在windows平台下Python环境搭建: 1.第一步:进入Python官网(Python.org)下载 Python安装包 选择windows下载最新的版本 1.32位系统选择32的,64位系统选择64的。 第二步:安装下载好的Python.exe 第三步:运行Python Windows查找命令中输入cmd,进入命令行窗口,再输入:Python 输入:Python("hello world") 最后输出:hello world, 就说明运行成功了!

同一台机器,不同服务,不同JDK,如何巧妙配置各自JDK启动

我们开发和部署的时候,难免遇到资源紧张,同一台机器,部署好几个服务,而不同服务依赖的JDK也不同,而我们配置环境变量只能一份,而我们服务都要启动,这样我们就需要每个服务都配置自己的JDK。 我们以SpringBoot项目为例。服务器是windows系统,我的配置路径是这样的。 由于SpringBoot的jar包同级config配置优先级最高,所以我们把配置放在外面,方便修改。 目录中包含启动,停止,重启脚本。还包含我们需要的jdk,还有jar包。 启动脚本: @echo off START "XXXServer" jdk1.8.0_241\bin\javaw -jar XXXServer.jar 停止脚本: @echo off set port=8091 for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do ( echo kill the process %%m who use the port taskkill /pid %%m -t -f goto q ) :q 重启脚本: @echo off set port=8091 for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do ( echo kill the process %%m who use the port taskkill /pid %%m -t -f goto start ) :start START "

飞书电脑端打开共享文档后无权限(已解决)

问题背景 飞书共享文档在手机上有权限但是在电脑上没有权限 问题分析 主要原因就是PC端打开的页面,里面的账号并不是默认和飞书软件的账号保持一致,而是和之前在该浏览器上登录过的账号保持一致。 问题解决 手动切换一下浏览器的账号即可 最后说一下,飞书账号专属的飞书助手,里面有人工服务,有问题可以直接问,很多时候飞书相关的问题都可以通过这个方式来解决

centOS7安装oracle

目录 1.将Oracle安装包拷贝到安装机器的指定目录 2.关闭防火墙 3.安装依赖包 4. 验证依赖包 5.创建Oracle用户 6.创建oradata目录,解压Oracle安装 ​编辑 将/oradata上当及目录内的所有文件和文件夹的归属都修改为oracle用户 操作oracle用户 7.修改系统配置参数 8.配置Oracle安装目录 9.配置环境变量 10.修改安装配置文件 11.安装数据库 安装前将/oradata文件及目录下的所有文件文件夹的权限都属于oracle用户 12.进入Oracle 1.将Oracle安装包拷贝到安装机器的指定目录 2.关闭防火墙 [root@localhost install]# systemctl stop firewalld.service [root@localhost install]# systemctl disable firewalld.service 3.安装依赖包 yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33*.devel compat-libstdc++-33 compat-libstdc++-33*.devel gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libaio-devel*.devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.devel libXi libXi*.i686 libXtst libXtst*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 4. 验证依赖包 rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel 5.

Akka 学习(四)Remote Actor

目录 一 介绍1.1 Remote Actor1.2 适用场景1.3 踩坑点 二 实战2.1 需求2.2 Java 版本2.2.1 效果图2.2.2 实体类2.2.3 服务端Actor 处理2.2.4 服务端配置文件2.2.5 客服端Actor处理2.2.6 客服端配置文件2.2.7 测试 2.3 Scala 版本2.3.1 效果2.2.3 服务端Actor处理2.3.4 客户端Actor处理2.3.5 测试 参考文章 Gitter Chat,Akka 在线交流平台Akka Forums,Akka 论坛Akka in GitHub,Akka 开源项目仓库Akka Official Website,Akka 官网Akka Java API,Akka 应用程序编程接口《Akka入门与实践》 [加]Jason Goodwin(贾森·古德温) 文章系列 Akka 学习(一)Actor 初步认识与环境搭建 已完成 Akka 学习(二)第一个入门程序 已完成 Akka 学习(三)Actor的基本使用 已完成 Akka 学习(四)Remote Actor 已完成 Akka 学习(五)消息传递的方式 已完成 Akka 学习(六)Actor的监督机制 已完成 Akka 学习(七)Actor的生命周期 已完成 Akka 学习(八)路由与Dispatcher 已完成 Akka 学习(九)Akka Cluster 已完成 Akka 基础篇就此结束了,Akka基础篇主要介绍Akka的基本概念与一些基本术语,使用方式

java时间日期类

java时间日期类 时间日期类一、Date类一)构造方法二)常用方法三)Date子类 二、DateFormat类Date -> String (格式化)String -> Date (解析) 三、SimpleDateFormat类一)构造方法常用方法时间模式字母 四、Calendar类一)常用字段(都是静态常量)二)常用方法需求:键盘录入年份,求当年二月份的最大天数 五、JDK8 第三代时间类一)LocalDate类1、常用方法DateTimeFormatter类 二)LocalTime类1、常用方法 三)LocalDateTime类1、常用方法 四)Instant 时间戳类 时间日期类 一、Date类 java.util.Date类封装当前的日期和时间,精确到毫秒,其中大部分方法都已过时 一)构造方法 方法描述Date()根据当前的默认毫秒值创建日期对象Date(long date)分配Date对象并初始化此对象,以表示自从标准基准时间以来的指定毫秒数 注意:标准基准时间也称为历元,即1970年1月1日00:00:00 GMT(注意时差) // 分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 Date d = new Date(); System.out.println(d); // 格式;2022年9月13日 下午12:51:46 此方法已过期 System.out.println(d.toLocaleString()); // 分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 long date = 1000*60*60; Date d2 = new Date(date); System.out.println(d2); 二)常用方法 方法描述long getTime(); 获取当前时间,以毫秒为单位void setTime(long time); 设置时间boolean after(Date when)测试此日期是否晚于指定日期。boolean before(Date when)测试此日期是否早于指定日期。int compareTo(Date anotherDate)比较两个指定日期。boolean equals(Object obj)比较两个相等的日期。 //1创建Date对象 //今天 Date d=new Date(); System.

QT error问题

error: LNK1181: 无法打开输入文件“release\main.obj” qt MSVC版,编译时出现如下错误:error: LNK1181: 无法打开输入文件“release\main.obj”,原因:工程路径中包含有空格 (工程路径中有目录或文件命名带有空格) 其次工程路径不要有中文,否则会遇到一些奇怪的问题。

在运行yolo时的一些报错及解决方法

Pytorch虚拟环境简介 Torch是一个用于深度学习的=数学计算库,而Pytorch则是一个基于Torch的Python机器学习库,可看作其提供了Torch应用于Python的接口。而搭建Pytorch虚拟环境,通俗地讲,就是搭建一个包含了Pytorch的相关包的Python解释器的环境,即是专门用于处理基于Python的深度学习的问题的环境。 虚拟环境 它是一个虚拟化的概念,从电脑独立开辟出来的环境。通俗的来讲,虚拟环境就是借助虚拟机来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互相隔离,互不影响 虚拟环境的作用 在一些项目开发中,我们需要一些项目的框架,但是可能每个项目使用的框架并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。这样显然会非常麻烦,大大降低工作的效率,而虚拟环境则很好的解决了这个问题,我们可以将不同框架分别安装在不同的环境中,当需要时只需要我们切换环境就可以了 ———————————————— 先进入pytorch环境的话可以通过cmd,输入conda env list,之后查看所想进入的环境名,输入conda activate xxx即可 问题1:ModuleNotFoundError: No module named ‘tensorboard‘ 解决方法:在pytorch环境下conda install -c conda-forge tensorboard,#由于pytorch本身不自带tensorboard包,一般这样报错都是由于未安装tensorboard包导致的。 #可以通过pip 加载清华镜像源进行安装 sudo pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboard 如果正确安装tensorboard之后,重新运行代码,还是报错找不到在torch.utils.tensorboard中找不到SummaryWriter该怎么办。 别着急,因为SummaryWriter是存在于tensorboardX(其作为tensorboard的子模块)因此同样通过pip进行安装: sudo pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboardX 如果正确安装tensorboardX依旧找不到SummaryWriter 请将报错的: from torch.utils.tensorboard import SummaryWriter 改为: from tensorboardX import SummaryWriter 问题2:AttributeError: module 'distutils' has no attribute 'version' 解决方法:在pytorch环境下pip install setuptools==59.5.0 问题3:ModuleNotFoundError: No module named 'pandas'(一开始也有几个这种类似的问题,但是当时忘记记录了,不过都很简单) 解决方法:回溯到问题处,然后鼠标瞄住,点安装即可 问题4:ModuleNotFoundError: No module named 'cv2'

es——java实现基本搜索功能

在输入框输入搜索关键字、点击页面过滤项、翻页、排序都会导致请求发出,查询商品信息: 需要实现的功能包括: 关键字搜索 分类、品牌、价格过滤 排序 分页 高亮 竞价排名 接口说明: controller层: /** * 关键字搜索,分页 */ @PostMapping("/list") public PageDTO<ItemDoc> list(@RequestBody RequestParams params){ log.info("关键字搜索,分页===前后端联通==" + params); this.isearchService.list(params); return this.isearchService.list(params); } service层: /** * 搜索关键字,分页 */ PageDTO<ItemDoc> list(RequestParams params); service实现类: @Autowired private RestHighLevelClient client; /** * 搜索关键字,分页 */ @Override public PageDTO<ItemDoc> list(RequestParams params) { try { //准备Request SearchRequest request = new SearchRequest("item"); //设置请求参数 buildBasicQuery(params, request); //排序 sort if (!StringUtils.isBlank(params.getSortBy())) { if ("sold".equals(params.getSortBy())) {//按评价排序 request.

架构设计(限流)

架构设计(限流) 限流算法 漏斗算法:接受存储客户端请求(有最大值限制),后端匀速处理请求 令牌桶算法:与漏斗算法相比,令牌桶算法可以快速处理短期突发流量 客户端请求过来时,如果可以从桶中获取令牌,则执行请求,桶中令牌数减1; 如果不能获取令牌,客户端请求则进行等待; 后台线程定时向桶中添加令牌,桶中存放令牌数有最大限制 固定时间窗口限流:固定时间段内,拒绝处理超过阀值的请求 说明:如果流量不均匀,可能出现在极短时间内处理超过阀值数量的请求,给后端服务器造成压力 滑动时间窗口限流 将滑动窗口分割成多个小时间段窗口,每隔一个小时间段,滑动窗口向前移动 统计滑动时间窗覆盖的时间段的请求数量,如果超过设定的阀值,则拒绝请求 固定时间窗口相当于滑动时间窗口的特殊情况,时间窗口分隔的越多,限流统计越精确; 滑动时间窗口移动单位式分割的时间段,还是有可能出现任意一个滑动时间段的请求数超过阀值的情况 漏洞算法、令牌桶算法对流量控制更为精准 队列限流 如果请求不需要立刻响应,又需要处理流量高峰,可将请求发送到队列,异步处理请求 sentinel 限流 流量控制策略 # QPS流量控制:每秒请求数超过预设的阀值后,触发流量控制 直接拒绝:默认的流量控制措施,超过阀值后,直接拒绝新的请求 冷启动:系统请求长期处于低水位,当流量突然增加后,直接将系统拉升到该水位可能将系统压垮, 冷启动让流量缓慢增加值阀值,给系统预热时间,避免冷系统被压垮 匀速器:让系统匀速处理请求,类似于漏斗算法,主要用于处理间隔性突发流量, 某一时间突然收到大量请求,接下来处于空闲状态,可利用空闲时间继续处理请求,而不是直接拒绝请求 # 并发线程数流量控制:线程数超过阀值,拒绝请求 sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数, 如果超出阈值,新的请求会被立即拒绝 # 基于调用关系的流量控制 调用方限流:default(不区分调用者)、针对特定调用者({some_origin_name})、其他调用者(other)限流 同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default 调用链入口限流:一个资源有多个入口(entry、entry2),可选择只针对入口entry限流 关联流量控制:两个资源之间具有资源争抢或者依赖关系时,这两个资源便具有关联关系; 如两个资源分别对数据库的同一字段进行写操作,一个资源频繁进行写操作, 便会对另一资源的写操作产生影响,此时可考虑对频繁操作的资源进行限流

本地 vm - xshell 互通

** 在VMware虚拟机安装centos7,使用xshell连接访问,下面就跟大家分享下如何连接。 ** 软件准备: VMware虚拟机 链接:https://pan.baidu.com/s/1jpNBXSwijgF-9LDiQPyZ_w 提取码:521h (感谢大佬分享) centos7系统: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.14c2f5adAJDEvh xshell7: https://www.xshell.com/zh/xshell/ 配置准备: 步骤一:设置系统的网络配置类型. 1)点击编辑虚拟机 2)接着进入虚拟机设置界面,选择“网络适配器”。如图: 3)接着,在网络适配器的右侧,选择“NAT模式”完成后,点击下方的“确定”。如图: 4)也有人,选择“自定义—VMnet 8(NAT模式)”,完成后,点击确定(我觉得都可以,测试下,都可以远程连接上)。如图: 5)完成后,进入第二步骤。 步骤二:查看虚拟机中的网段 1)首先,打开虚拟机,在编辑中找到“虚拟网络编辑器”,如图: 2)接着,进入虚拟机网络配置界面。如图: 3)接着,在虚拟机网络编辑器界面中,选择“VMnet8”。如图: 4)接着, 在VMnet信息界面中,找到“子网ip”,记住此IP地址(配置根据截图中来如修改)如图: 5)接着,点击界面中“NAT设置”,进入设置界面(具体设置内容如图,IP地址根据自己的ip修改,但是需要在同一个IP段)。如图: 6)完成后,进入第三步骤。 步骤三:设置系统中的静态IP 1)首先,进入系统,打开终端。如图: 2)接着,在终端界面输入:ip address,回车,出现如图内容。如图: 3)接着,如果您的输出内容中没有IP地址,这时候就需要修改IP地址。具体修改如下:首先,输入如下两个命令: 先输入 [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 7)接着修改如图所示: ONBOOT=no把它修成ONBOOT=yes, BOOTPROTO=dhcp修改成BOOTPROTO=static 9)接着,在末尾添加上固定IP地址以及子网掩码(IP地址、DNS、默认网关以及子网掩码需要跟之前设置的在同一IP段内,具体如下: IPADDR=192.168.247.132 NETMASK=255.255.255.0 PREFIX=24 GATEWAY=192.168.247.2 DNS1=114.114.114.114) 10)退出并保存 11)这样,设置系统中的静态IP教程就完成了。接下来配置配置虚拟机的IP地址。 步骤四:配置虚拟机的IP 1)首先,找到系统右下角任务栏的“网络显示图标”,并点击鼠标右键,在弹出框中选择“打开网络和共享中心”。如图: 2)接着,在弹出的“网络状态”界面中,找到“更改适配器设置”。 3)接着,进入网络连接界面。找到“VMware Network Adapter VMnet8” 接着,右击,在弹出的对话框中选中属性。 接着,在VMware Network Adapter VMnet8属性中,选中“Internet 协议版本4(TCP/IPv4)”然后点击下方的属性。如图: 接着,进入IP地址设置界面,具体设置如图:(备注:图中的ip地址设置要跟步骤三设置的IP地址不一样,以防冲突不能访问,但是需要在同一个IP段内) 完成后,点击确定退出。 完成后,进入第五步骤。 步骤五:xshell连接Linux 1)打开安装好的xshell,新建会话,在主机的地方输入我们在centos设置好的IP地址(在第三步骤好的IP地址),完成后点击连接。如图: 2)接着,在弹出的对话框中,输入系统账户,点击“确定”如图: 3)接着,等待系统连接上centos系统。连接成功入下截图。如图:

乐观锁带来的ABA问题的解决

乐观锁: 比较乐观,它认为一般情况下不会发生锁冲突,所以只有在进行更改操作的时候才会对锁冲突进行检查,如果检查出来冲突,就不做任何修改,如果没有冲突才进行修改 乐观锁通常使用CAS(比较并替换)机制来实现,它包含3部分内容 v:内存中的值 A:预期旧值 B :新值 乐观锁(CAS)在JAVA中应用:Unsafe 和 AtomicXXX类 CAS存在ABA问题: 张三进行转账操作(卡里有100元) 1.第一次点击转账按钮: -50元(V=100,A=100 ,B=50) 2,第二次点击转账按钮:-50元(V=100,A=100 ,B=50) 3.发工资了,+50 当第二次点击和发工资两个操作先 第一次转账 一步执行, 卡里的钱经过了 -50 再 +50 的操作, 但是数字经过运算后的结果和之前一致, 这时第一次转账操作开始运行, 单独使用CAS后,只能对比数字的大小是否一致, 无法判断数字是否经过更改 我们原本的意图是,只转账一次就停止, 需要两次转账里成功一次,另一次再进行 V和A的对比时 发现V已经发生变化而取消 另一次转账 所以单纯的使用 一个V已经没用了,我们需要引入另一个参数来辅助判断V的变化 ABA 问题解决方案: AtomicStampedReference 引入版本号,每次操作后让版本号+1,执行时对比 版本号和值,就可以解决ABA问题

matlab将一个矩阵所有行的元素合并成一列/一行

用a=[1 2 3 4;5 6 7 8] 举例 K>> a=[1 2 3 4;5 6 7 8 ] a = 1 2 3 4 5 6 7 8 1. a(:) K>> b=a(:) % 注意这里顺序是不对的 b = 1 5 2 6 3 7 4 8 K>> c=a';b=c(:) % 需要额外转置一下 b = 1 2 3 4 5 6 7 8 2. reshape将矩阵重排 reshape(M, m, n)将矩阵M重排成m * n K>> b=reshape(a',1,8) b = 1 2 3 4 5 6 7 8 反过来,若想将一行元素拆分成几行,直接用reshape是不行的,如图:a矩阵拆分成b之后现在想再组回去,数字顺序和原来不同,具体操作如下

pyinstaller 打包去除黑框并加入icon

打包去除黑框并加入icon pyinstaller pyinstaller -F --add-data "assets/*;./assets" -i "assets/icon.ico" main.py --noconsole --clean pyportable_installler from pyportable_installer import full_build full_build('pyproject.json')

删除有序数组中的重复项、组合总和算法思路

题目01 删除有序数组中的重复项 II 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3] 解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。 示例 2: 输入:nums = [0,0,1,1,1,1,2,3,3] 输出:7, nums = [0,0,1,1,2,3,3] 解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。 关键字:数组 思路: 1.循环数组nums,循环时,判断每个数字是否满足条件,若满足则赋值,不满足不赋值。 2.初始时允许前两个赋值,因为前两个一定不会重复超过三次。 3.从第三个数字开始,要求当前数字要大于当前数字的前两个数字的值,因为最大只允许两个重复。 题目02 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

Python实现PDF文件切割保存到本地

实现从阿里oss读取数据去切割pdf from PyPDF2 import PdfFileReader, PdfFileWriter import logging, os import uuid, tablestore as ots, time, json, oss2, io import requests, shutil, urllib3 import pdfplumber import subprocess import re from oss2.compat import to_bytes ''' 注意: 页数从0开始索引 range()是左闭右开区间 ''' oss_region = '' oss_accessKeyId = '' oss_accessKeySecret = '' ossbucket = '' oss_endpoint = '' def handler(event, context): event_json = json.loads(event) print(event_json) split_pdf(event_json.get('file_path'), int(event_json.get('start_number')), int(event_json.get('end_number')), event_json.get('new_file_name')) # 获取oss对象 def get_oss_client(): auth = oss2.

Docker安装最新版MySQL5.7(mysql-5.7.40)教程(参考Docker Hub)

一、前言 MySQL官方安装包下载地址: https://dev.mysql.com/downloads/mysql/ Docker Hub官方网址: https://hub.docker.com/ 【MySQL系列安装部署教程】 写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档) 最新MySQL-5.7.40在云服务器Centos7.9安装部署 笔者参考了Docker Hub中关于MySQL官方教程文档去写最新 MySQL5.7 容器安装部署教程,在此之前笔者写过一篇博客【写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)】,那篇博客写的很详细,有兴趣的读者可以去阅读,文章被华为云开发者联盟社区收录了。 本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错,请点点赞,加关注,谢谢! 二、安装部署 1、在Docker Hub中搜索关键字“mysql”,查看MySQL的最新稳定版,包含MySQL8和MySQL5.7系列。对应的MySQL页面有教程,读者也可自行去看,但是不是很完整,笔者的教程参考官网且有改动。 (1)Docker Hub中搜索“mysql”。 (2)选择官方的“mysql”。页面是MySQL在Docker中的版本的相关介绍,这里有这么一个规律:5.7.40, 5.7, 5, 5.7.40-oracle, 5.7-oracle, 5-oracle 其实都是同一个版本,它们的镜像ID都是相同,在页面中放在同一行展示的,都是同一个版本,笔者验证过。页面同时也有操作教程。 Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql 2、切换到“Tags”页面,复制指定的MySQL版本拉取命令,例如 docker pull mysql:5.7 。 3、先创建三个目录,创建MySQL容器时会挂载为容器的卷(Volume),用于Docker和宿主机(Centos)之间共享文件,包括配置文件、数据文件和日志文件。 什么是卷(Volume)?命令 docker -v 中的“-v”就是这个卷,“-v”只是“--volume”的简写。 Docker官方文档解释卷的含义:https://docs.docker.com/storage/volumes/ 使用 -p 创建多级目录,即 mydata 目录下创建 mysql 目录, mysql 目录下又创建 log 、data 、conf 三个目录: mkdir -p /mydata/mysql/log mkdir -p /mydata/mysql/data mkdir -p /mydata/mysql/conf 4、拉取MySQL5.7镜像。 docker pull mysql:5.7 5、创建容器:使用自定义的 custom.

Python入门(第一篇)

Python 简介: Python是什么? Python是当今世界最流行的程序语言之一。 由荷来人,吉多.范苏姆(Guido van Rossum) 1989年发明,1991年公布。官网:www.python.org Python的特点: 1. 可读性强: 2.简洁: Python完成同样功能只用其他语言一半的代码,其实就是提高了一倍的生产率。 3.开源: Python是开源语言,软件更容易移植到其他的平台。 4.标准脚本语言: 脚本程序是指只有需要被调用时,才会被动态的解释执行。 Python应用场景: 1.人工智能(Al Artificial intelligence) 2.web应用开发 3.科学计算和数据分析 4.桌面软件 5.网络爬虫 6.游戏开发 注意: Python有两大版本,分别是Python2和Python3。 强烈推荐大家用Python 3。

第二季1:MPP模块概述

以下内容源于海思官方文档内容,如有侵权请告知删除。 一、MPP模块概述 海思的媒体处理软件平台(MPP,Media Process Platform)有利于应用软件的快速开发。因为该平台屏蔽了一些与芯片相关的复杂的底层处理,给应用软件提供了一些API来完成相应功能。 该平台支持应用软件快速开发以下功能:输入视频捕获、H.265/H.264/MJPEG/JPEG/MPEG4 编码、H.264/MPEG4/MPEG2解码、视频输出显示、视频图像前处理(包括去噪、增强、锐化、Deinterlace)、编码码流叠加OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。 MPP模块的手册《HiMPP IPC V2.0 媒体处理软件开发参考.pdf》提取码:1111位于“01.software\board\document_cn”目录。 二、系统架构 MPP 平台支持的典型的系统层次如上图所示,主要分为以下层次: (1)硬件层。硬件层由 Hi35xx 芯片加上必要的外围器件构成。外围器件包括 Flash、DDR、视频 Sensor 或 AD、音频 AD 等。 (2)操作系统层。基于 Linux 3.4 的 OS 系统。 (3)媒体处理平台,即MPP。基于操作系统层、控制芯片完成相应的媒体处理功能。它对应用层屏蔽了硬件处理细节,并为应用层提供 API 接口完成相应功能。由上图可知,MPP模块以ko和api形式提供,和驱动处于同一层次。 (4)其他驱动。除媒体处理平台外,海思为 Hi35xx 芯片的其他相关硬件处理单元提供了相应的驱动,包括 GMAC、SDIO、I2C、USB、SSP 等驱动。 (5)应用层。基于海思媒体处理平台及其他驱动,由用户开发的应用软件系统。 三、MPP架构概述 MPP模块内部主要处理流程包括两大模块,即视频处理模块、音频处理模块。 其中视频部分包括:视频采集输入(VI)/ 视频解码输入(VDEC)、视频处理(VPSS)、视频编码(VENC)/ 区域管理(REGION)/ 视频侦测分析(VDA)/ 视频输出(VO)等模块。音频部分包括:音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)等模块。 (1)VI 模块,捕获视频图像,可对其做剪切、缩放等处理,并输出多路不同分辨率的图像数据。 (2)解码模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H264/MPEG4/MPEG2 格式的视频码流进行解码。 (3)VPSS 模块接收 VI 和解码模块发送过来的图像,可对图像进行去噪、图像增强、锐化等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。 (4)编码模块接收 VI 捕获并经VPSS 处理后输出的图像数据,可叠加用户通过 Region模块设置的OSD 图像,然后按不同协议进行编码并输出相应码流。 (5)VDA 模块接收 VI 的输出图像,并进行移动侦测和遮挡侦测,最后输出侦测分析结果。 (6)VO 模块接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置的输出协议输出给外围视频设备。

java之JdbcTemplate技术

之前去连接一个数据库,我们注册驱动,得到连接对象,然后得到语句句柄,再来执行,这玩意有点麻烦,每次都要这样写一套,然后才能进行sql语句的查询和其他操作。 那么后来我们把连接对象与关闭对象这个工作给拿了出来,把需要里注册的数据库连接,用户名,密码,数据库名都放到一个properties的配置文件里面。 先来看这个配置文件utils.properties配置文件,这个文件直接放在了src目录下面 其实driver这个数据库驱动的注册完全可以省略,因为数据库管理接口在调用getConnection()的时候,就已经给我们注册了驱动,话不多说,看看单独抽离出来的JdbcUtils文件 package utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; //工具类,我们要从配置文件中取数据 @SuppressWarnings("all") public class JDBCUtils { private static String url; private static String root; private static String password; private static String driver; //我们要初始化上面属性,然后在内部调用静态函数 static{ Properties properties = new Properties(); //找到资源文件,需要一个类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); InputStream is = classLoader.getResourceAsStream("utils.properties"); try { properties.load(is);//把字节流传入进来 //得到属性,给私有属性赋值 url = properties.getProperty("url"); root = properties.getProperty("root"); password = properties.getProperty("password"); driver = properties.getProperty("driver"); //把驱动注册 Class.

如何确定最初克隆本地 Git 存储库的 URL

问题描述: 我在 GitHub 上提取了一个包含多个 fork 的项目,但忘记了它是哪个 fork。我如何确定我拉了哪个叉子? 解决方案1: 保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com 如果您只需要远程 URL,或者您没有连接到可以访问远程存储库的网络: git config --get remote.origin.url 如果您需要完整输出并且您所在的网络可以访问源所在的远程存储库: git remote show origin 使用 git clone(来自 GitHub 或任何源存储库)时,克隆源的默认名称是“origin”。使用 git remote show 将显示有关此远程名称的信息。前几行应显示: C:\Users\jaredpar\VsVim> git remote show origin * remote origin Fetch URL: git@github.com:jaredpar/VsVim.git Push URL: git@github.com:jaredpar/VsVim.git HEAD branch: master Remote branches: 如果您想在脚本中使用该值,您将使用此答案中列出的第一个命令。 如果将 jgit 与 amazon-s3 一起使用,请使用 git config,如下所述。 虽然与原始问题的目的无关,但请注意,如果尝试获取“推送 URL”并且为指定的远程输入了多个 URL,您将需要使用 git remote show origin(可选地使用 -n 标志由@Casey 提供),或使用@Montaro 和@rodel 建议的git remote -v。

“INNER JOIN”和“OUTER JOIN”有什么区别?

问题描述: 另外,LEFT JOIN、RIGHT JOIN 和 FULL JOIN 如何适应? 保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com 解决方案1: 一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会 假设您要加入没有重复的列,这是一种非常常见的情况: A 和 B 的内连接给出了 A 相交 B 的结果,即维恩图相交的内部部分。 A 和 B 的外连接给出了 A 联合 B 的结果,即维恩图联合的外部部分。 例子 假设您有两个表,每个表都有一个列,数据如下: A B - - 1 3 2 4 3 5 4 6 请注意,(1,2) 是 A 独有的,(3,4) 是常见的,(5,6) 是 B 独有的。 内部联接 使用任一等效查询的内连接给出了两个表的交集,即它们共有的两行。 select * from a INNER JOIN b on a.a = b.b; select a.*, b.* from a,b where a.

写vue3+ jsx+ts语法+ storybook展示的组件库

代码地址 视频 点击进入 前言 视频会不定期更新。 样式上copy的别人 搭建项目 创建项目的时候需要添加css预处理器,后面选第一个sass Button代码 types.ts import { PropType } from 'vue' enum ButtonTypes { LINK = 'link', DANGER = 'danger', PRIMARY = 'primary', DEFAULT = 'default' } enum SizeTypes { LARGE = 'large', SMALL = 'small' } const btnProps = () => ({ label: String, btnType: { type: String as PropType<ButtonTypes>, default: ButtonTypes.DEFAULT }, href: String, disabled: { type: Boolean, default: false }, backgroundColor: String, size: { type: String as PropType<SizeTypes>, default: SizeTypes.

threejs-材质

文章目录 前言材质的常用属性基础属性融合属性高级属性 常用的材质MeshBasicMaterial()MeshDepthMaterial()联合材质createMultiMaterialObject ( geometry, materials: Array )法线材质MeshNormalMaterial()Lambert材质MeshLambertMaterial()Phong材质MeshPhongMaterial()标准格材质MeshStandardMaterial()物理材质MeshPhysicalMaterial()线材质LineMaterial() 效果示例 前言 threejs材质讲解:材质常用属性,材质种类,效果示例 材质的常用属性 基础属性 id // 标识符,创建时自增 uuid // 唯一标识 name // 材质名称 opacity // 不透明度,[0,1],transpant为true时生效 transpant // bool overdraw // 过度描绘 visible // 是否可见 side // 侧面,定义为哪一面使用材质:Three.FrontSide,Three.BackSide,Three.DoubleSide needsUpdate // bool,为true时,使用最新的材质属性而不是缓存 colorWrite // bool,为true时,不会输出真实的颜色 flatShading // bool,平面着色,为flase时光照效果更加平滑 lights // bool,为true时接收光照 dithering // bool,开启时使用颜色抖动 shadowSide // 产生投影的面,与side对应的面相反 vertexColors // 顶点颜色 fog // bool,雾化效果 融合属性 渲染的颜色与背景交互的方式 blending // 材质与背景融合的方式 blendSrc // 融合源 blendDst // 融合目标 blendequation // 融合人透明度,结blendSrc,blendDst自定义融合方式 blendSrcAplha // 为 blendSrc指定透明度 blendDstAplha // 为 blendDst指定透明度 高级属性 WebGL底层相关的一些参数,不常用

【计算机考研408-计算机网络-教书匠视频笔记】主机访问浏览器的全部过程

主机H1利用浏览器通过该域名请求访问web服务器 由于题目给定主机H1的ARP表是空的 (1)主机H1首先会发送ARP请求报文,ARP请求报文会被封装在以太网的MAC帧中发送 ARP请求报文:FF-FF-FF-FF-FF-FF 源MAC地址:00-11-22-33-44-cc(即主机H1的MAC地址) ARP协议的作用:由IP地址查找对应的MAC地址ARP请求报文会被封装在以太网广播帧中,整个过程都是在数据链路层中进行的 (2)该ARP请求报文进入以太网交换机,以太网交换机进行自学习和转发帧的操作,登记ARP报文的源地址和进入交换机时的端口号(这就是所谓的自学习) 题目给定以太网交换机的交换表是空的 自学习后的交换表 (3)由于该ARP请求报文是广播帧,故不用查表,直接从其他所有的端口转发出去 本地域名服务器会收到H2主机会收到R路由器也会收到 (4)本地域名服务器从该广播帧中解析出ARP请求报文,从而知道该ARP请求报文是询问自己的,故接收该ARP请求报文,并向主机H1发出ARP响应报文欲告知自己的MAC地址。 路由器R从该广播帧中解析出ARP请求报文,知道不是询问自己的,从而丢弃该报文,H2同理丢弃。 ARP响应报文被封装在以太网单播帧中发送 ARP响应报文:00-11-22-33-44-cc(目的地址,主机H1的MAC地址)00-11-22-33-44-bb(源地址,本地域名服务器的MAC地址) (5)该单播帧ARP响应报文从交换机的1号端口进入交换机,故交换机更新交换表,更新完后,在交换表中查找该单播帧的目的MAC地址,发现对应的端口号为4,故从该端口4转发出 (6)主机H1收到来自交换机端口4转发的ARP响应报文,通过解析该报文,发现是发送给自己的,于是知道了本地域名服务器的MAC地址,并更新ARP表 现在主机可以向本地域名服务器发送DNS请求报文了,以便获取web服务器域名所对应的IP地址DNS是基于UDP的,根据域名查询出IP地址 DNS查询流程简化如下(这里我使用的是递归与迭代相结合的方式), a.查询本地域名服务器,本地域名服务器中没有记录所以进行b b.访问DNS根服务器,根服务器通过查询知道了该域名是归.com顶级域名服务器管理的,所以告知本地域名服务器去查询顶级域名服务器,所以去进行c c.本地域名服务器,去查询.com域服务器(顶级域名服务器),然后该服务器告知,负责abc.com区域的服务器知道,我告诉你他的地址,你去问他把 d.最后,访问abc.com域服务器,得知此域名对应的IP地址 DNS请求报文的封装情况, (7)主机收到DNS响应报文从而知道了web服务器的IP地址,通过比较前25比特网络前缀,知道了web服务器与主机H1不在一个网络当中 (8)于是,主机H1要通过访问R路由器也就是默认网关192.168.1.1来访问web服务器 主机H1查找ARP表发现,默认网关192.168.1.1的MAC地址,找不到 (9)主机H1再次发送ARP请求报文,通过路由器R的IP地址来查询其相应的MAC地址,ARP请求报文被封装在以太网广播帧中发送 目的地址:FF-FF-FF-FF-FF-FF源MAC地址:00-11-22-33-44-cc (10)路由器R从该广播帧中解析出ARP请求报文,知道这是询问自己,所以接收该报文(其他的设备发现不是给自己的,丢弃该报文),响应该报文 (11)路由器R给主机H1发送ARP响应报文,告知自己的MAC地址,ARP响应报文被封装在以太网单播帧中发送 该ARP响应报文进入交换机后,更新交换表,如下 (12)更新完后,对该单播帧进行转发,根据目的MAC地址查询交换表,发现应该从4号端口中转发出去 (13)主机H1收到单播帧,从中解析出ARP响应报文,从而知道了路由器R该接口的IP地址所对应的MAC地址,将其记录到ARP表中 (14)先主机H1可以通过路由器R访问web服务器 (15)主机H1与web服务器之间要先通过TCP连接报文建立连接(即三报文握手) TCP使用熟知端口号80 主机可以在第三个报文段中携带HTTP请求报文 web服务器在收到报文后,将所请求的内容封装成HTTP响应报文 通过已建立的连接发送给主机H1 (16)至此,主机H1访问web服务器的应用场景的全部过程。

SpringBoot dubbo 注解@Reference

本文为joshua317原创文章,转载请注明:转载自joshua317博客 SpringBoot dubbo 注解@Reference - joshua317的博客 @Reference是dubbo的注解,也是注入,他一般注入的是分布式的远程服务的对象,需要dubbo配置使用。 @Autowired org.springframework.beans.factory.annotation.Autowired SpringBoot项目中常用。简单来说就是引入由Spring容器管理的bean。 @Resource javax.annotation.Resource 作用相当于@Autowired,只不过@Autowired是byType自动注入,而@Resource默认byName自动注入。 区别: (1) @reference是dubbo注解,@resource是spring 注解。 (2) @resource作用相当于@Autowired,只不过@Autowired是byType自动注入,而@Resource默认byName自动注入。 (3) @Reference是dubbo的注解,也是注入,但是一般用来注入分布式的远程服务对象,需要配合dubbo配置使用。 (4) @reference和@resource的区别就是@resource是本地spring容器,@reference是把远程服务对象当做spring容器中的对象一样注入。 本文为joshua317原创文章,转载请注明:转载自joshua317博客 SpringBoot dubbo 注解@Reference - joshua317的博客

傅里叶变换(一次搞清楚)

这个算法改变了世界_哔哩哔哩_bilibili 从傅里叶变换 到离散傅里叶变换 再到快速傅里叶变换 这个算法改变了世界_哔哩哔哩_bilibili 看完这个视频不由得感慨万千。 一个伟大命题的提出,必然是因为一个tough问题的出现。 没有问题就没有解决方案,没有问题,你的一切研究也就没什么意义。 从实际入手,去获得解决问题的能力。 当陷入迷茫的时候就是积累蓄力的阶段,不要放弃啊。

Android——Gradle自动打包上传蒲公英并进行钉钉群提醒

开发测试阶段频繁打包未免太过枯燥,自动打包发布解放双手。上一节我们分析了fastlane打包发布的过程,嗯~总体来说有点繁琐,而且Android使用fast lane自动打包网上资料比较少,出错之后解决难度颇大。所以今天我们来用一种更简便的方式进行自动打包发布。 1、Gradle自动打包发布蒲公英 蒲公英上传Apk官方文档 apply from: './dingding.gradle'//引用钉钉通知方法 def apkFileName = "${buildTime()}_test_v${rootProject.ext.android["versionName"]}_release.apk" def apkFilePath = "${projectDir.absolutePath}/build/outputs/apk/test/release/${apkFileName}" private def uploadPGY(String filePath) { def stdout = new ByteArrayOutputStream() exec { executable = 'curl' args = ['-F', "file=@${filePath}", '-F', "_api_key=${rootProject.ext.pgy["apiKey"]}", rootProject.ext.pgy["uploadUrl"]] standardOutput = stdout } String output = stdout.toString() def parsedJson = new groovy.json.JsonSlurper().parseText(output) println parsedJson.data.buildQRCodeURL println "蒲公英上传完成 版本号:" + parsedJson.data.buildVersion println "开始发送钉钉群通知" def downloadUrl = "https://www.pgyer.com/" + parsedJson.data.buildShortcutUrl postDingMsg(parsedJson.data.buildQRCodeURL, downloadUrl) } task uploadApk(dependsOn: '打包Task名称') {//可以从Gradle的Task列表中选取,也可以点击查看Generate Signed Bundle/Apk执行的task是什么,复制出来就好了 group = "

【redis已解决】Warning: no config file specified, using the default config. In order to specify a config

Warning: no config file specified, using the default config. In order to specify a config file use /redis-6.2/redis-server /path/to/redis.conf 点击这个报错 表示没有指定配置文件,使用默认配置。要指定配置文件,请使用redis-server /path/to/redis.conf 1、在cmd中redis-server.exe redis.windows.conf 启动成功 2、创建一个bat的后缀文件 (如果你怕麻烦就使用批处理) redis-server.exe redis.windows.conf 直接点击start.bat就可以直接运行配置文件 就可以解决本文的问题

Java异常(比较全)

前言:想要学好异常,需要了解JVM虚拟机知识,这里涉及面试常问的内存溢出错误解决办法 一、异常是什么? 定义 程序 编译时/运行过程中,由于某些原因导致程序出错,从而结束程序运行,这就称为异常 java异常的结构图(超类、子类关系等结构,此结构不是太全,可看下面“七、常见错误异常附录”) Java 中所有的错误和异常最终都继承自 java.lang.Throwable 这个类。 (当然,Object类是Java中所有类的父类,也是Throwable的父类。不过这儿讨论的是异常,所以我们常说,异常的超类是Throwable 类。) Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。 Throwable下面一层只派生出2个子类:Error类 和 Exception类。 2.1 错误:Error类以及它的子类的实例,代表了JVM本身的错误。 错误不能被程序员通过代码处理,Error很少出现。 因此,程序员应该关注Exception为父类的分支下的各种子异常类。 2.2 异常: Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。 可以被Java异常处理机制使用,是异常处理的核心。(Exception分为:RuntimeException和非RuntimeException ) 二、error 和 exception区别 ? 相同点: 一、都继承自Throwable类 二、都没有自己实现的方法,都是继承Throwable和Object的 三、都有四个构造方法,参数及实现的功能一样 不同点: 一、Error属于系统级错误称之为“错误”,不可被捕获,也就是无法用try catch/throw机制; Exception属于应用程序级错误称之为“异常”,可以通过捕获避免,也就是可以用try catch/throw机制; 二、Error无需在程序中以throw子句中抛出; 而Exception需要抛出 三、存在Error错误程序不能运行或是运行中断; 存在Exception错误程序可运行并抛出 三、unchecked异常和checked异常的区别 Java 定义了两种异常( C# 只有unchecked异常 ): 非受查异常 (Unchecked exception) / 运行时异常: Error和子类、 继承自 Exception 的 RuntimeException和子类都称为非受查异常/运行时异常, 就是代码不需要强制处理它们的异常也能通过编译,所以它们称作 unchecked exception。RuntimeException(运行时异常)不需要try…catch…捕获机制或throw抛出机制去强制处理。 编译器不强制记录异常,但是!我们一般都建议手动捕获异常,做自己的逻辑处理。 生产中,非受查异常中的RuntimeException异常最常见~ 受查异常 (checked exception) / 编译时异常: 继承自 Exception 的 非RuntimeException:IOException及子类、ReflectiveOperationException及子类、SQLException、InterruptedException等等,都是受查异常/编译时异常。代码需要强制处理抛出的异常,要么用 try catch 语句,要么直接用 throws 语句声明,否则编译不通过!!!

Qt扫盲-QString使用总结

QString使用总结 一、概述二、初始化字符串1、极速版2、原理版 三、操作字符串1、极速版1. 增加2. 删除3. 修改4. 插入5. 转换 2、原理版 四、查询字符串五、字符串格式转换六、Null 字符串和 Empty 字符串的区别七、字符串参数格式化八、更高效的字符串构造九、最大大小和出现内存不足的情况 这里是我对帮助文档的一些理解,再复习复习一下之前的知识点。 我把文字分成了两部分,一半是给喜欢了解一下原理的,一部分是直接上手就行的。 一、概述 QString 是Qt 的一种基础数据类型,也是对字符串的一个封装。其实他的操作和标准库的std::string字符串的基本是一致的。但是还是有些区别。 QString 存储以数据长度为16位2字节 QChar类型的字符串,也是说每个字符类型是 QChar ,其中每个 QChar 对应于一个UTF-16 代码。(如果代码值高于 65535 的 Unicode 字符使用两个连续的 QChar来存储)这其实和 c++标准库的std::string使用一致,但是std::string的字符是char类型,8位一字节长度(用的Utf-8)。这里我们知道QString 和 std::string编码格式不一样,不能直接相互操作,得转码后才能用哦 Unicode 是一种国际标准,支持当今使用的大多数书写系统。是一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符。会将一个码位编码为 1 到 4 个字节。它是 US-ASCII (ANSI X3.4-1986) 和 Latin-1 (ISO 8859-1) 的超集,所有 US-ASCII/Latin-1 字符都位于相同的代码位置。也就是说Unicode包括了 上述位置的编码 QString在内部实现的时候 使用隐式共享(写入时复制)来减少内存使用并避免不必要的数据复制。这也有助于减少存储 16 位字符而不是 8 位字符的固有开销(QChar 比 char 空间大)。 隐式共享可以参考我之前的博文: Qt扫盲–隐式共享基本原理 除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位“0”终止字符串(也即是char类型字符串)。在大多数情况下,QString 是您想要使用的类。它在整个Qt API中使用,Unicode支持确保您的应用程序易于翻译,如果您想在某个时候扩展应用程序市场。QByteArray 适合的两种主要情况是需要存储原始二进制数据时,以及内存保护至关重要时(在嵌入式系统中)。 二、初始化字符串 1、极速版 //不带参构造 QString str; //从const char * 字面量字符串构造 QString str_1 = "

Spark-SQL连接Hive 的五种方法

提示:文章内容仅供参考! 目录 一、 Spark-SQL是什么 二、 Hive and SparkSQL 三、Spark-SQL 特点 四、Spark-SQL连接Hive 1)内嵌的 HIVE 2)外部的 HIVE 3)运行 Spark beeline 4)运行Spark-SQL CLI 5)代码操作Hive 一、 Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 二、 Hive and SparkSQL SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL-on-Hadoop 的效率,大量的 SQL-on-Hadoop 工具开始产生,其中表现较为突出的是: ⚫ Drill ⚫ Impala ⚫ Shark 其中 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上。

按比例随机分配训练集和测试集和数组间隔取值

按比例随机分配训练集和测试集 dividerand 参考:使用随机索引将目标分为三组 - MATLAB dividerand- MathWorks 中国 语法 [trainInd,valInd,testInd] = dividerand(Q,trainRatio,valRatio,testRatio) 采用要划分的目标数、用于训练的向量比率、用于验证的向量比率和用于测试的向量比率,并返回训练索引、验证索引和测试索引。 输入: Q — 目标数量,要划分的目标数量,指定为标量。 trainRatio — 训练比率, 即训练集占比(默认0.7 ) valRatio — 验证比率(默认0.15) testRatio — 测试比率(默认0.15) 输出: trainInd — 训练索引,以行向量形式返回。 valInd — 验证索引 testInd — 测试索引 举例: [trainInd,~,testInd] = dividerand(P,0.7,0,0.3) % 此时行为特征数,列为样本数 train=trainInd ; test=testInd; [trainInd,~,testInd] = dividerand(size(P,1),0.7,0,0.3) % 此时行为特征数,列为样本数 train=P(trainInd,;) test=P(testInd,:) trainLable=label(trainInd,;); testLable=label(testInd,;); randperm 也可以用randperm函数来随机排列所有的数据 [M,~]=size(feactotal); p = randperm(M); % 随机排列所有的数据获得索引 train=feactotal(p(1:M*0.7),:); % 按照7:3划分训练和测试集 test=feactotal(p(M*0.7+1:end),:); 数组间隔取值 A(a0:num_d:a1,:) % 间隔提取矩阵A的数据,起始行为a0,间隔行数为num_d,终止行为a1 %% 举例 >> A=[1 2 3;4 5 6; 7 8 9]; >> A(1:2:end,:) % 提取矩阵A的奇数行数据 ans = 1 2 3 7 8 9 A(end:-1:1,:) A(:,end:-1:1) % 分别返回A矩阵行倒序和列倒序的矩阵。

Spark-SQL连接JDBC的方式及代码写法

提示:文章内容仅供参考! 目录 一、数据加载与保存 通用方式: 加载数据: 保存数据: 二、Parquet 加载数据: 保存数据: 三、JSON 四、CSV 五、MySQL 一、数据加载与保存 通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet 加载数据: spark.read.load 是加载数据的通用方法。如果读取不同格式的数据,可以对不同的数据格式进行设定。 spark.read.format("…")[.option("…")].load("…") ➢ format("…"):指定加载的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和 "textFile"。 ➢ load("…"):在"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"格式下需要传入加载 数据的路径。 ➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable 我们前面都是使用 read API 先把文件加载到 DataFrame 然后再查询,其实,我们也可以直接在文件上进行查询: 文件格式.`文件路径` spark.sql("select * from json.’/opt/module/data/user.json’").show 保存数据: df.write.save 是保存数据的通用方法。如果保存不同格式的数据,可以对不同的数据格式进行设定。 df.write.format("…")[.option("…")].save("…") ➢ format("…"):指定保存的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和 "textFile"。 ➢ save ("…"):在"csv"、"orc"、"parquet"和"textFile"格式下需要传入保存数据的路径。 ➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable 保存操作可以使用 SaveMode, 用来指明如何处理数据,使用 mode()方法来设置。 例如:df.write.mode("append").json("/opt/module/data/output") 二、Parquet Spark SQL 的默认数据源为 Parquet 格式。Parquet 是一种能够有效存储嵌套数据的列式

【已解决】redis启动错误: Warning: no config file specified, using the default config. In order to specify a

Warning: no config file specified, using the default config. In order to specify a config redis启动报如下错误: 意思是:启动时无法找到配置文件,远程无法连接 解决方法: 第一种:在cmd命令行中执行redis-server.exe redis.windows.conf 第二种:在redis的根目录下新建一个start.bat文件,将redis-server.exe redis.windows.conf放在文件里,双击start.bat即可启动。 也可以解决上述问题 下面说说一个小问题: 如何更改密码? 首先如果是想一劳永逸,那么在redis.windows-service.conf文件中找到 requirepass foobared这一行(我是用EditPlus工具打开的,可以使用笔记本打开) 在下面加一行 requirepass 123456 保存之后就可以了 注意:可能需要在redis.windows.conf中与上文配置一样的,也找到 requirepass foobared这一行(我是用EditPlus工具打开的,可以使用笔记本打开) 在下面加一行 requirepass 123456 (这两个文件中都配置一下密码) 然后运行客户端,使用auth验证一下密码 ok 即为成功 如果出现 表示你的密码没有设置好,或者是忘记保存,也可能是出现以下问题,这是redis启动错误,按照上文就可以解决了。 还有一个设置短期密码的,只有在redis运行的时候有效,当重新启动就不会有效,又变为初识的密码,比如我的密码是 123456 但是当你重新启动redis,再校验 希望大家多多指教

“RDD、DataFrame、DataSet的概念、区别联系、相互转换操作”

提示:文章内容只供参考! 目录 一、RDD的概念 二、DataFrame 是什么 三、DataSet 是什么 四、创建 DataFrame 五、RDD 转换为 DataFrame 六、DataFrame 转换为 RDD 七、创建 DataSet 八、RDD 转换为 DataSet 九、DataSet 转换为 RDD 十、DataFrame 转换为 DataSet 十一、DataSet 转换为 DataFrame 十二、RDD、DataFrame、DataSet 三者的关系 三者的共性 三者的区别 一、RDD的概念 RDD 是Spark的核心抽象,即 弹性分布式数据集(residenta distributed dataset)。代表一个不可变,可分区,里面元素可并行计算的集合。其具有数据流模型的特点:自动容错,位置感知性调度和可伸缩性。 在Spark中,对数据的所有操作不外乎创建RDD、转化已有RDD以及调用 RDD操作进行求值。 二、DataFrame 是什么 在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中 的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。

Python 中__new__详解及使用介绍

Python new 的作用 在Python中__new__方法与__init__方法类似,但是如果两个都存在那么__new__闲执行。 在基础类object中,__new__被定义成了一个静态方法,并且需要传递一个参数cls。Cls表示需要实例化的类,此参数在实例化时由Python解析器自动提供。 new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决定是否要使用该init()方法,因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。 new()方法的特性: new()方法是在类准备将自身实例化时调用。 new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。 实例 class Person(object): def __init__(self, name, age): self.name = name self.age = age def __new__(cls, name, age): if 0 < age < 150: return object.__new__(cls) # return super(Person, cls).__new__(cls) else: return None def __str__(self): return '{0}({1})'.format(self.__class__.__name__, self.__dict__) 12345678910111213 print(Person(‘Tom’, 10)) print(Person(‘Mike’, 200)) 结果: Person({‘age’: 10, ‘name’: ‘Tom’}) None Python3和 Python2中__new__使用不同 Python2的写法 注意 Python 版本大于等于2.7才支持 class Singleton(object): def new(cls,*args, **kwargs):

以Web of Science 为例,使用Citespace进行文献计量分析的一般步骤

0. 背景 最近需要用到Cite Space对Web of Science (WoS) 的一些文献数据进行分析。虽然以前学过一些,但是都忘得差不多了,故翻出以前学习的资料,整理在此,常用常新,也方便自己以后复习。 1. 本地新建文件夹 桌面或其他路径新建一个文件夹,命名随意。此处为方便区分,用“WoS”命名。 在WoS文件夹内新建四个文件夹,命名必须如下!不可随意命名!! 2. 通过Web of Science 检索所需数据 得到搜索结果后,点击“导出”,选择“纯文本文件”。如下图所示。 因为每次最多只能导出500条,所以先导出1-500。如下图所示。 命名格式一定要用”download_“开头。如下图所示。 重复下载行为,下一次导出501-1000,重复直到全部导出为止,此处因为做演示,所以只导出1000条。如下图所示 3. 通过Cite Space清洗(预处理)从Web of Science 下载的数据 打开Cite Space,点击”Data——Import/Export“。如下图所示。 有的可能会跳出这个,不用管它,点击”Skip MySQL for now”跳过。如下图所示 点击"WoS",按下图分别设置好一开始新建的"input"和“output”文件夹。如下图所示。 点击选择“Artcle”和“Review”,然后点击“Start”。如下图所示。 过了几秒之后,它会输出一些信息,然后好了,关掉。 之后就去一开始新建的“output”文件夹,发现已经出现了预处理后的文件。如下图所示。 将其复制粘贴到“data”中去。如下图所示。 4. 通过Cite Space对文献数据作关键词(Keyword)分析 点击“New”。如下图所示。 随意设置一个"Title",再分别设置一开始新建的“project”和“data”文件夹。然后选择“WoS”,最后"Save"。如下图所示。 然后设置想要分析的时间范围及切片长度、选择“关键词分析”、选择“Pruning(剪枝)”方式,最后点击”GO!“。如下图所示。 会出现这个弹窗,点击”Visualize“即可出现可视化视图。如下图所示。 一开始图片背景是黑色的,表示正在运行处理数据,等你觉得运行的差不多了(图片舒展程度够了)就可以手动左上角点击暂停。如下图所示。 或者一直等下去它也是会自动停止的,只是时间较长,而且没必要。 通过”Control Panel(控制面板)”可以进行一些操作。如下图所示。 “Threshold”可以调整图像上节点是否显示字体,当其值为0的时候,每个节点都会显示自身的关键词。 “Font Size”字面意思,就是调整显示的字体大小。 “Node Size”可以调整节点的大小,每个节点的大小不同,节点关键词出现的频率越高,则该节点就越大。 目前节点的图形形状还比较奇怪,可通过“Nodes——Node Shape (Keywords, Terms)——Circle”可以将节点显示的图形设置为圆形。如下图所示。 点击“Lables——Lable Background Color——Article Lables”,如下图所示。 在弹出的面板中,点击“HSV(H)”,将“透明度”拉到最大,点击右上角“x”关闭。如下图所示。 4. 1 合并节点(将后一个节点合并到前一个节点) 若两个节点内容很相似,如下图的“Validity”和“Validation”,可将其合并为同一个节点。如下图所示。 首先,通过“Threshold”和“Font Size”等,找到第一个节点“validity”,点中它。如下图所示。