前端实现批量导出图片并打包压缩功能

需求 管理后台需要批量导出二维码图片 实现难点 选择相应的图片批量导出或直接批量导出并压缩在一个文件夹里 思路分析 1.先将选中二维码的地址存在一个数组中 2.依次请求图片并将其下载 3.后用jszip压缩文件 4.最后用file-saver生成文件 实现 实现的代码如下 import axios from 'axios' import JSZip from 'jszip' import FileSaver from 'file-saver' getFile = (url) => { return new Promise((resolve, reject) => { axios({ method: 'get', url, responseType: 'arraybuffer' }).then(data => { resolve(data.data) }).catch(error => { reject(error.toString()) }) }) }; } // 批量下载 handleBatchDownload = async(selectImgList) => { const data = selectImgList; const zip = new JSZip() const cache = {} const promises = [] await data.

akka介绍

akka简介 一开始想接触到akka,是在看一些并发相关资料的时候,查了下akka的官方介绍,介绍如下:Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用,使构建高并发的分布式应用更加容易。 听到高并发和分布式这两个关键字就已经足够让人想去探索究竟是什么样的框架,当深入查看各种资料后,发现当前大数据领域火热的spark、flink底层的分布式计算和通信实现都是akka,是不是很意外。虽然它是由scala编写的,但也同时提供java api接口,所以使用java一样可以使用akka。 akka是基于actor模型的实现,actor模型也就是响应式模型,它和我们常用的基于方法堵塞式的调用不同,而是基于消息的异步调用。 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),并且一次一次actor只能处理一条消息,这就相当于java里的一个单例对象的一个加了synchronized修饰符的方法的调用,但actor不同的是它通过从邮箱存储消息,然后消息的处理是按顺序的。如果要进行并行的消息处理,就需要创建多个actor,多个actor之间消息数据是并行的。 Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成 状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题 行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态 邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息 Actor的基础就是消息传递。如下图所示: Akka的五大特性 1)易于构建并行和分布式应用 (Simple Concurrency & Distribution) Akka在设计时采用了异步通讯和分布式架构,并对上层进行抽象,如Actors、Futures ,STM等。 2)可靠性(Resilient by Design) 系统具备自愈能力,在本地/远程都有监护。 3)高性能(High Performance) 在单机中每秒可发送50000000个消息。内存占用小,1GB内存中可保存2500000个actors。 4)弹性,无中心(Elastic — Decentralized) 自适应的负责均衡,路由,分区,配置 5)可扩展(Extensible) 可以使用Akka 扩展包进行扩展。 整个akka体系由如下几部分组成: akka-actors akka的核心,一个用于并发和分发的模型,没有线程原语的所有痛苦 akka-stream 一种直观而安全的方式来实现异步、非阻塞的回压流处理。 akka-http 现代的、快速的、异步的、流的HTTP服务器和客户端。 akka-cluster 通过在多个节点上分布您的系统来获得弹性和弹性。 akka-sharding 根据用户的身份,在集群中分配您的参与者。 Distributed Data 最终一致,高度读取和写入可用,低延迟数据 Akka Persistence 为参与者的事件包允许他们在重新启动后到达相同的状态。 Akka Management 在云系统上运行Akka系统的扩展(k8s,aws,…) Alpakka Akka流连接器用于集成其他技术 简单入门使用案例: 首先maven的pom加入akka的依赖 <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor_2.12</artifactId> <version>2.5.3</version> </dependency> 创建actors 要创建actor需要继承AbstractActor 类并重写它的初始行为方法createReceive ,actor接收消息后会触发createReceive方法被调用,所以actor收到消息的处理动作主要在该方法。 createReceive 没有参数返回的结果是AbstractActor.Receive. 可以通过receiveBuilder()来接收消息以及它的类型,从而判断该如何处理消息。

'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte(爬虫问题)

问题背景(注:python3): 用urllib.request抓去网页提示: print(reponse.read().decode('utf-8')) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte 而requests就没有出现问题。 原因:headers中有 'Accept-Encoding': 'gzip, deflate, br' 这行代码代表:本地可以接收压缩格式的数据。 服务器在处理时将大文件压缩再发回客户端,IE在接收完成后在本地对这个文件又进行了解压操作。 出错的原因是:程序没有解压这个文件 解决:删掉这行代码

小程序 web-view 打开 微信公众号文章

首先微信小程序不能不能随便打开一个网址就能进行访问。 必须要配置业务域名。 但是,如果小程序和微信公众号进行了关联,则直接可以打开这个公众号到文章。 我已经测试过了。肯定好用。 还有一种方案,打开别人公众号的文章,你在自己服务器上,爬别人的文章,通过自己的服务器返回,就OK。

JavaScript实战014:简单的滑动轮播图

今天要做的是轮播图的功能,本来想用vue来实现的,后来想想还是用JavaScript先做个用下,为了简单一开始我们只实现最简单的基本功能,后面在添加更多的功能,这样容易理解和学习,下面的今天实现的功能,效果图如下。 在设置好的时间间隔内对图片进行自动轮播; 点击左右箭头进行图像的切换; 鼠标移入/移出控制轮播图的停止/继续; 第一步: 先写出HTML基本代码,这里我们只轮播了3张图片(放了4张图是为了实现无缝轮播),然后用了一个2个psn标签做左右切换的按钮,通过它来控制图片的上一张和下一张的切换。 <body> <div class="Carousel"> <div id="picture"> <img src="../assets/images/1.png" alt=""> <img src="../assets/images/2.png" alt=""> <img src="../assets/images/3.png" alt=""> <img src="../assets/images/1.png" alt=""> </div> <span class="arrow arrow_left"><</span> <span class="arrow arrow_right">></span> </div> </body> 第二步: 样式布局,最外面的div是用来定义图片显示区域的,所以这时多出的位置我们要用overflow:hidden;将其隐藏起来。 .Carousel{ position: relative; //相对定位,方便子元素定位 width:600px; //宽 height:400px; //高 margin:50px auto; //外边距 overflow: hidden; //隐藏 border:10px solid rgba(189, 184, 184,0.5); //这是外边框 z-index: 1;//参考值,方便把左右键的按钮放在上层 } 而第二层div则是用来承载要轮播的图片的,这里我们要将图片平铺成一行,方便我们后期移动,所以这里要用到绝对定位,而图片我们则使用浮动将其平铺成一行即可(关闭overflow:hidden属性我们看到的就是图片在移动的效果),当然现在这几行代码是移动不起来的,要加上JavaScript才行的。 #picture{ position: absolute; //绝对定位 width: 2400px;//如果不知道有多宽,直接用百分比,比如1000%,多出去的不用管 height: 400px; //高 } #picture img{ float: left; //浮动 width:600px; height:400px; } 第三步:

Unity Hololens入门,如何使用hololens

本着学习的态度,恰好手里有一台hololens,开始研究一下这个东西。 HoloLens 是微软研发的一款混合现实的设备。 我使用的unity版本为2018.3.0 下面先介绍如何创建一个unity的HoloLens项目。 首先创建一个unity项目,起名为MixRealityDoc。 选中MainCamera ,将camera 的位置姿态归为原点,直接reset即可。 创建一个cube,位置改为(0,0,2)姿态改为(45,45,45)大小改为(0.25,0.25,0.25) 保证你已经安装了Universal Windows Platform的安装包就是,并切换平台为windows Platform 如下图。 点击player Setting选择XR settings 勾选 Virtual Reality Supported如下图 点开window ->XR ->Holographic Emulation ,用于连接你的HoloLens 点开如下图所示。 EmulationMode改为 Remote to Device,设置好即可。 打开Hololens 在store 中找到 Holographic Remoting Player并下载,打开后即可连接你的unity 运行unity程序即可看到cube

移动端meta标签的使用

<!-- 页面宽度等于视口宽度,不允许用户缩放--> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <!-- 设置缓存 --> <!-- 设定网页的到期时间 --> <meta http-equiv="Expires" content="-1"> <!-- 清除缓存(再访问这个网站要重新下载!) --> <meta http-equiv="Cache-Control" content="no-cache"> <!-- 禁止浏览器从本地机的缓存中调阅页面内容,访问者将无法脱机浏览 --> <meta http-equiv="Pragma" content="no-cache"> <!-- author用于定义网页作者 --> <meta name="author" content="aicoder.com"> <!-- 就是当点击网页添加至主屏幕功能时,会在主屏幕上生成一个图标。点击该图标会进入webapp功能。就是模拟本地应用的模式来浏览web页面。 --> <meta name="apple-mobile-web-app-capable" content="yes"> <!-- 当启动webapp功能时,显示手机信号、时间、电池的顶部导航栏的颜色。默认值为default(白色),可以定为black(黑色)和black-translucent(灰色半透明)。这个主要是根据实际的页面设计的主体色为搭配来进行设置。 --> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- 添加到主屏幕后,app全屏显示 --> <meta content="yes" name="apple-touch-fullscreen" /> <!-- 默认设备会自动识别任何可能是电话和邮箱的字符串。设置telephone=no可以禁用这项功能。 --> <meta content="telephone=no,email=no" name="format-detection" /> <!-- UC浏览器私有 --> <!-- 全屏模式 --> <meta name="full-screen" content="yes"> <!-- 应用模式 --> <meta name="

Vue自定义组件:颜色选择器及其实现原理

老样纸,先上效果图: demo操作地址:plain-ui demo 打开这个页面之后,在Form中打开ColorPicker颜色选择页面 先对这个效果图做一个简单介绍: 这个组件左边的实例是启用了设置透明度alpha值的,而右边的禁用了,所以是看起来两种不同的效果;这两个实例通过v-model绑定了同一个值,所以在点击确定按钮的时候,两个都产生了相应的变化,因为右边的没有启用透明度,所以转化得到的值会自动转化为不带透明度的16进制,这个转化的结果是可以设置的,支持rgb以及16进制(hex),默认是16进制;从上至下,第一个正方形是用来选择饱和度(saturation)以及亮度(value),第一个七彩的滑条是用来选择色相(hue),第三个是记录历史选择的颜色,可以点击历史选择的颜色快速选中颜色;第行是颜色输入框,输入颜色,回车之后会更新显示输入的颜色,点击确定按钮这个组件实例会派发input事件,值就是选中的颜色; 接下来介绍这个组件的实现原理 在实现这个组件的时候,网上各种百度谷歌博客网页,大多数都是介绍啥啥啥组件怎么用,哪个现成的比较好用,就没看到那篇博客详细说明了这个东西的实现原理,每个东西是怎么来的,这里我研究了一番之后,决定将解析过程写下来,避免过一段时间就忘了。 首先介绍一个核心概念:HSV颜色模型 1) 先上图: 2)在HSV颜色模型中,HSV三个字母分别代表色调(hue)、饱和度(saturation)、亮度(value),首先色调的取值范围是0 ~ 360,表示0度到360度,对应图中圆锥上方彩色的度数,0度以及360度都表示红色,120度表示绿色,240度表示蓝色;饱和度的取值范围为0 ~ 100,可以理解为点到彩色圆中心的距离,观察一下上面的图,在圆锥彩色圆中,圆心是白色的,这时饱和度为0,当饱和度为100时,颜色就是圆最外层的颜色,也就是最“饱和”的颜色,所以这个饱和度可以理解为在彩色圆中的点到彩色圆中心的距离,从立体角度来看,就是圆锥体内的点,到圆锥内部中心轴的距离;亮度为圆锥体内的点所在的平面到圆锥顶点的距离,为0,表示亮度为0,这时就是黑色的,如果为最大值100,表示点在彩色圆上;当hsv为0,100,100表示为红色; 3)看这个图,在圆点上下移动的时候观察value,在圆点左右移动的时候观察saturation: 可以观察到,当saturation越小时,越趋近于白色(饱和度低),当value越小时(亮度低),越趋近于黑色,当saturation以及value都为100时,就是当前色调的颜色; 相关组件罗列(按照实现的顺序): 1)pl-color-hue-slider(色调滑条选择组件,图中七彩横条滑动的组件); 2)pl-color-sv-picker(饱和度以及亮度选择组件,图中正方形元素); 3)pl-color-alpha-slider(透明度选择组件,本文最开始的图中第一张图色调滑条选择组件下面的有透明格子的组件); 4)pl-color(显示颜色的小圆圈组件); 5)pl-color-history(显示历史选择颜色的组件,点击可以得到选择的历史颜色); 6)pl-color-picker-panel(整个颜色选择面板组件); pl-color-hue-slider没啥技术含量,就是背景色是: background: linear-gradient(90deg, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);然后有个div可以拖拽左右移动,这个左右移动是通过left属性控制的,通过left值与整个滑条可滑动宽度(滑条宽度减去滑块宽度)之间的比例([0,100])得出[0,360]的度数; pl-color-sv-picker要比pl-color-hue-slider要稍微复杂一点点,就是横轴left值是饱和度,纵轴top值是100-亮度,然后这个白色、黑色以及对应色调颜色的渐变颜色面板的原理是有三个div,第一个div背景色是色调色,第二个div是白色渐变色background: linear-gradient(to right, white, #ffffff00),从左至右,第三个div是黑色渐变色background: linear-gradient(to top, black, #ffffff00),从下至上,最后三个div覆盖在一起就可以得到这个黑白彩渐变的面板; pl-color-alpha-slider透明度组件原理与pl-color-hue-slider原理基本一致; 剩下的pl-color-history以及pl-color-picker-panel的实现过程与颜色选择器的核心原理没啥关系,这里就不提了; 因为这个组件隶属于我个人组件库,目前组件库不是开源的,所以这个组件的源码不便展示。

Ajax详细参数介绍

$.ajax({ type:'post', //String 默认为GET timeout:'2000', //Number 设置超时时间(毫秒) url:{""}, //String 发送请求的地址 async: false, //同步(默认true,异步加载) dataType:"json", //String xml、html、script、json、jsonp、jQuery、text data:{'userName':userName}, //发送给后台的请求数据 "userName":userName或者 data: {username:$("#userName").val(),password:$("#password").val()}, //提交前回调函数(发送请求前可以修改XMLHttpRequest对象的函数) beforeSend:function(XMLHttpRequest){ this; //调用本次Ajax请求时传递的options参数 }, //请求成功后处理(data可能是xmlDoc、jsonObj、html、text;textStatus (请求状态):success、error、notimodified、timeout) success:function(data,textStatus){ this; //调用本次Ajax请求时传递的options参数//window.location.href = data.getCodeUrl;/*location.reload();*/ }, //请求失败后调用(通常情况下textStatus和errorThrown只有其中一个包含信息) error: function (XMLHttpRequest,textStatus,errorThrown) { this; //调用本次Ajax请求时传递的options参数 console.log("error-----------"); }, //请求完成后处理(请求成功或失败时均调用) complete:function(XMLHttpRequest,textStatus){ this; //调用本次Ajax请求时传递的options参数 } });

【机器学习大数据篇】Windows和PC机上搭建Spark+Python开发环境的详细步骤

0 准备工作 查看操作系统的版本信息:计算机>>右键“属性”>>查看版本信息,如Windows10专业版64位。 1 安装Anaconda 1.1 下载 注意选择与操作系统匹配的版本,截止写本教程时,官方版本为Anaconda5.0.1,内部封装的为Python3.6,也可根据需要下载封装其他版本Python的Anaconda3 下载地址为:https://www.anaconda.com/download/ 1.2 安装 根据安装向导逐步进行,注意安装路径中的文件夹名称不要存在空格 1.3 配置环境变量 配置系统变量PATH,添加…\Anaconda3\Scripts及…\Anaconda3(根据安装路径确定) 【注意】此图PATH变量中也显示了后续安装过程中添加的信息 1.4 测试 测试Python:在cmd中输入Python命令,查看Python版本信息 测试Conda:在cmd中输入conda或pip命令,查看具体信息 2 安装Java 2.1 下载 下载JDK8,选择与操作系统匹配的版本,注意勾选同意其使用协议后下载 下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.2 配置环境变量 新建系统变量JAVA_HOME,值为Java安装路径 新建系统变量CLASSPATH,值为“.%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”(注意最前面的圆点) 配置系统变量PATH,添加%JAVA_HOME%\bin及%JAVA_HOME%\jre\bin 2.3 测试 在cmd中输入java –version命令,查看Java版本信息 3 安装Spark 3.1 下载 下载Spark2.2.0,注意与操作系统版本一致 下载地址为:http://spark.apache.org/downloads.html 3.2 安装 只需解压程序包,并拷贝至存放路径,注意安装路径中的文件夹名称不要存在空格 3.3 配置环境变量 新建系统变量SPARK_HOME,值为Spark安装路径 配置系统变量PATH,添加%SPARK_HOME%\bin及%SPARK_HOME%\sbin 3.4 配置日志显示级别 选择…\spark\conf\目录下log4j.properties.template,复制为log4j.properties 将log4j.properties中,"INFO, console"改为"WARN, console" 4 配置Hadoop支持模块 4.1 下载 下载Hadoop支持模块 下载地址为:https://github.com/LemenChao/Introduction-to-Data-Science/blob/master/Hadoop/hadoop.dll-and-winutils.exe-for-hadoop2.7.3-on-windows_X64-master.zip 4.2 安装 只需解压程序包,并拷贝至存放路径,注意安装路径中的文件夹名称不要存在空格 4.3 配置环境变量 新建系统变量HADOOP_HOME,值为Hadoop安装路径 配置系统变量PATH,添加%HADOOP_HOME%\bin 5 测试Spark

IntelliJ IDEA 中看到 classes, sources, javadocs 三种jar的区别和各自的作用

在 intelliJ idea 里面看到 ,Project Structure——》 Libraries ——》 Sources 的路径是红色的 看图会比较好。以guava包为例来说明。 可以看到在这看整个maven项目的依赖时,发现如图的情况,这红色是什么情况,是报错吗?需要处理吗?这3个不同jar都是什么东西,各自有啥作用。大概会有这么些疑问吧。️。 假如在依赖库如上的情况下,你点进去,看guava的源码,会有下图的效果。 给你2个选择,一个是选则source,一个是下载source。注意,这个时候,你看到的文件是class文件,是可以直接运行的文件,之所以能看到内部的具体实现,是idea给你自动逆转换啦。感谢idea吧 (记得当年刚刚工作的时候,使用的eclipse,然后debug的时候,假如要进入这些个没有sources的jar的时候,就进不去这个class文件,他还傻乎乎的给个弹窗,让我倒入sources文件,还是idea高级,直接喊你下载。) 这个时候点击download sources,下载源码。 这个时候,你看到的文件,就变成啦Java文件,而且,还带上了很多的注释。 这个时候,再看仓库library的变化 可以看到刚刚还是红色的sources文件,现在有啦,下面的Javadoc还没有。 然后,再看mven的repository里面的情况 可以看到jar类型的文件jar包,这地方有2个。 (有么有疑惑,这个带sources的jar怎么比classes的jar还小呢?因为Java文件在编译生成class文件的时候,会对代码进行优化,这个优化是针对运行的,所以,由Java文件变class文件,他到底是变大,还是变小,这个是不确定。) 三个jar包同时存在的也不是没有,看下面 最后,说一下,各自的作用。 classes的jar,是正儿八经运行项目的时候使用的,因为这个是直接编译好的class文件,可以直接被虚拟机运行的。 sources的jar,就是给开发人员看的,自己在学习和debug的时候,可以看到jar包里面的各种注释说明,方便学习。 Javadoc的jar,也和sources的jar一个道理吧,起到辅助的作用吧。这个不是必须的,guava就没有提示你下载这个,就已经显示了很多的注释了。 所以, 最开始的那个图里面的只要classes的jar不报错,下面的2个jar,可有可无。不是什么问题。 了解原理就好啦。 我写完文章,给自己点个赞,不过分吧, 不过分,那我可就点啦啊。 我先点为敬,你们随意。大家随意。不要客气。。。 作者:李学凯 来源:CSDN

springBoot整合ElasticSearch(仿佛在填一个天坑。。。)

看了一下springBoot的书,书里介绍了一个全文检索的中间件ElasticSearch,大概了解了一下全文检索的原理,就想着,搭个环境试下。。。试下试下就掉坑里了。搭这个鬼环境搭了一整天,各种问题,简直是脑爆。最后终于跑起来了环境,csdn里写个记录,github丢个源码就跑。万一,哪天项目用到这个鬼东西了呢。。。 填完坑之后我得出的结论就是,springBoot的版本和ElasticSearch的版本一定要对应,不然各种坑啊坑啊。 项目里用的springBoot的版本是1.5.8,对应elasticsearch-2.4.6。elasticsearch-2-4-6 参考了各种资料,出了各种BUG,最后还死在了一个yml配置,如下: 这个yml配置也是我复制别人的。我自己是本地跑的,根本就没用到集群,最后也不知道是不是配置这个集群名导致出了各种问题,最后去掉了这个集群名,问题就解决了。 DEMO项目丢到github上去了。地址:https://github.com/howlXu/springboot-elasticsearch 参考了很多文章,鉴于最后跑的DEMO是直接复制别人的,懒得改啦。直接把参考DEMO的地址放下面好啦。其他还参考挺多的,星期五下午到星期六上午,全在百度,stackoverflow,google。哎。 谢谢这位大神:https://www.cnblogs.com/dalaoyang/p/8990989.html

shell读取文件

shell读取文件的方式有两种,while循环读和for循环读 while循环读方式 #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH cat filename | while read line do etho $line done for循环读方式 #/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH for line in `cat filename(待读取的文件)` do echo $line done 这两种方式的另外的写法 #/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH while read line do echo $line done < filename while和for对文件的读取是有区别的 while对文件读是逐行读完后跳转到下行 for对文件的读是按字符串的方式进行的,遇到空格什么后,再读取的数据就会换行显示 while相对for的读取很好的还原数据原始性 matthew@ubuntu:~/workspace/shell$ cat 011.txt 1111 2222 3333 aaaaa bbbbbbbbbbbbbbbbbbbb ccccccccc ddddddddd matthew@ubuntu:~/workspace/shell$ matthew@ubuntu:~/workspace/shell$ ./for.sh 1111 2222 3333 aaaaa bbbbbbbbbbbbbbbbbbbb ccccccccc ddddddddd matthew@ubuntu:~/workspace/shell$ matthew@ubuntu:~/workspace/shell$ .

centos7终端命令查看图片

[260254@localhost 图片]$ display 2019-02-16\ 08-58-57\ 的屏幕截图.png [260254@localhost 图片]$ eog 2019-02-16\ 08-58-57\ 的屏幕截图.png [260254@localhost 图片]$ xdg-open 2019-02-16\ 08-58-57\ 的屏幕截图.png This tool has been deprecated, use 'gio open' instead. See 'gio help open' for more info. [260254@localhost 图片]$ gio open 2019-02-16\ 08-58-57\ 的屏幕截图.png ps:除第一个打开的是ImageMagick,其他的都是打开系统自带的图片编辑器

uni-app项目中使用scss语法

最近正在学习uni-app开发,我先把文档浅略翻了遍。发现组件和接口几乎都是按照微信小程序走,但是视图层上的语法又是按照vue的语法走的。所以开发过程一定要注意这点。 然后我想在uni-app项目中使用scss语法。但是具体怎么安装呢?历经曲曲折折的道路,终于实现了。下面是我的安装过程,有相同错误的可以参考下! 我的win7 64位系统,我的开发工具是HbuilderX。 1、最简单的方法如下: 点击菜单栏中的“工具 – 插件安装 – scss/sass编译” 点击安装,如果成功了,就可以正常使用了。 很不幸的是,我的提示失败了 2、我又找到D:\HBuilderX\plugins\compile-node-sass插件目录,执行npm install,仍然提示失败: 然后我去社区提问了,经提示查看了错误日志,显示了一大堆错误,还是不知道如何解决: 然后,我去百度找答案了。。。 出来的都是node-sass安装错误流程,大多是说npm安装不成功的可以使用cnpm淘宝滤镜。 最后抱着试试的心理,一步一步尝试下来,竟然成功了!! 3、安装node-sass流程 3-1、先下载python,然后设置环境变量。附上安装步骤地址【http://www.runoob.com/python/python-install.html】 3-2、安装cnpm。附上安装步骤地址【http://npm.taobao.org/】 3-3、再次进入D:\HBuilderX\plugins\compile-node-sass插件目录,执行cnpm install,可喜可贺,终于安装成功了! 然后,启动我们的项目,给style标签添加lang=“scss”,启动“运行到浏览器”。发现又报了如下错误,悲剧! 然后,继续到社区上搜索答案。附上地址【http://ask.dcloud.net.cn/question/63952】 4、具体做法如下: 按照控制台提示操作。 4-1、运行cmd, 4-2、然后执行控制台的mkdir命令 然后没有curl的朋友请跟着我这么做。 4-3、进入到刚刚mkdir创建的目录 4-4、从node-sass github官方下载下来,然后,然后,重点是先将下载的文件重命名为“binding.node”。然后在拷贝文件到刚刚mkdir创建的目录。 下载地址:https://github.com/sass/node-sass/releases/download/v4.11.0/win32-ia32-57_binding.node 最后,重启项目,提示编译成功啦,可喜可贺!!!

知否?知否?情人眼里出代码

今天是 0214 ,打乱一下数字就是 1024,程序员最喜欢的一个数字之一。 当然,除此之外,今天也是一年一度的 情人节。 这个日子肯定少不了表白。那程序员怎么去表白?当然是 写—代---码! 每到情人节,脑洞大开的程序员们就纷纷出动,想出了各种别出心裁的表白代码。虽然结局不一定美好,但这些也是一种撩妹手段。 从古 采葛: 一日不见,如三月兮 顾城 :《门前》至今 春风十里不如你舒婷:致橡树一见钟情 一见钟情,相濡以沫,不忘初心,真爱永恒直到死之前,每天爱你多一点 爱你一万年 爱你爱到天荒地老山无陵, 江水为竭, 冬雷震震, 夏雨雪, 天地合, 乃敢与君绝!欢迎工作一到五年的Java工程师朋友们加入Java高级架构:978315887 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

Docker中mysql大小写敏感配置不起作用的问题排查

由于linux中mysql的的表名是区分大小写的。所以需要配置my.conf。 所以在docker中需要把配置文件带进去。在宿主机的目录中新建my.conf文件,然后写入如下配置。 [mysqld] user=mysql lower_case_table_names=1 在启动docker时,把文件挂载进去,我用的是这个命令 docker run -d -e MYSQL_ROOT_PASSWORD=HAHA123 --name mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/usr/data:/usr/data -v /data/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 mysql:5.6 一般来讲这样启动一切应该就正常了,但是我在环境中却碰到了这个问题,mysql忽略了配置文件,导致依然大小写敏感。 Warning: World-writable config file '/etc/mysql/my.cnf' is ignored 然后继续百度,有人提到是mysql认为这个my.cnf文件的权限太大,任何人可编辑,太危险了,所以就忽略了这个配置文件。 原来是这样子的,为了方便ftp操作,运维把整个data文件夹都设置成了777权限,所以这个cnf文件也配置成了777权限,加载到docker里依然是777权限,这个倒是我之前没有碰到过的,知道问题原因就好解决了,改这个文件的权限就可以搞定了。 重启docker,终于大小写不敏感了 转载于:https://www.cnblogs.com/JangoJing/p/10368519.html

Golang 实现etcd键值对的写入查看,并在租约时间内存在

etcd版本3.2,开放端口2379 package main import ( "context" "fmt" "go.etcd.io/etcd/clientv3" "time" ) func main() { const ( key1 = "/etc/etcd/etcd.conf" val2 = "etcd.conf" keepTime = 100*time.Second //续租时长 ) var ( config clientv3.Config client *clientv3.Client Newlease clientv3.Lease leaseResp *clientv3.LeaseGrantResponse kv clientv3.KV err error putResp *clientv3.PutResponse getResp *clientv3.GetResponse keepaliveResp *clientv3.LeaseKeepAliveResponse keepRespChan <-chan *clientv3.LeaseKeepAliveResponse ) config = clientv3.Config{ Endpoints: []string{"192.168.1.102:2379"}, DialTimeout: 10 * time.Second, } if client, err = clientv3.New(config); err != nil { fmt.

JAVA回调函数简单讲解 CallBack

回调,其实就是有个回应的那种感觉。 那么,接下来,我们就用消息推送的场景,简简单单地讲解下回调函数的使用。 直接看代码, 先创建一个回调接口, MessageCallBack /** * @Author : JCccc * @CreateTime : 2019-2-12 * @Description :回调函数需要执行的内容 * @Point: Keep a good mood **/ public interface MessageCallBack { //成功 public void onSccuess(String message, String account); //失败 public void onFailure(String message, String account); //重连等等 } 接下来,是模拟消息发送的客户端, MessageClient /** * @Author : JCccc * @CreateTime : 2019-2-12 * @Description : * @Point: Keep a good mood **/ public class MessageClient implements MessageCallBack { private String message; private String account; //重写回调接口的方法 @Override public void onSccuess(String message, String account) { System.

CSDN取消手机绑定

今天登陆发现被强制要求绑定手机号了,但是我的手机号绑定了另一个csdn 所以联系了qq客服,排队之后就会很耐心的帮你处理了 客服二维码

SpringBoot 改Banner

Banner是springBoot启动中显示的横幅。有一个Banner类可以控制,全局配置也可以配置是否显示。 以前大概也猜到这个鬼东西能修改,但是没想到修改起来如此简单。 如果不修改Banner类,那么启动springBoot的时候显示出来是下面的情况。 修改Banner的显示样式十分简单,只需要在resources路径下新建一个banner.txt文件,txt里的内容就会显示到Console(控制台)上。 如下图所示。 参考SpringBoot精髓7.1.3节。作者李家智。 顺带吐槽一句,想不到大佬也这么有童(wu)心(liao)。

gitlab 社区版或企业版 的区别

来自:https://about.gitlab.com/install/ce-or-ee/ 介绍 如果您对使用GitLab感兴趣,我们建议您下载并安装GitLab企业版,即使您不确定是否会订阅GitLab企业版的许可。您仍然可以使用GitLab Community Edition的所有特性,而不需要许可证或注册。 许可模型 GitLab是建立在开放核心模型之上的。这意味着GitLab有两个版本:社区版和企业版。 GitLab Community Edition是开放源码的,拥有MIT的外籍许可证。GitLab Enterprise Edition构建在Community Edition之上:它使用相同的核心,但在此基础上添加了其他特性和功能。这是在专有许可下进行的。 对于这两个版本:GitLab中的所有javascript代码都是开源的。所有由GitLab编写的javascript代码都在同一个MIT许可下。 为什么使用企业版 为了能够使用GitLab Enterprise Edition特性,您需要一个订阅,它将为您提供许可证。如果您使用的是未经许可的Enterprise Edition,那么您只使用经过MIT许可的函数。 这意味着,如果您在没有许可证的情况下安装了GitLab Enterprise Edition,您将不会注意到与典型的Community Edition实例的区别,但是您有额外的优势: 如果您想在任何时候试用Enterprise Edition特性,您可以在不需要设置新实例或升级现有实例的情况下这样做。您只需在GitLab中启动试验。如果您对Enterprise Edition特性不满意,您的实例将在试用期满后自动恢复到Community Edition特性。 要从Community Edition升级到Enterprise Edition,您必须确保使用的是相同的版本,并遵循特定的步骤,这些步骤通常需要停机。使用Enterprise Edition,只需单击一次即可在Community Edition特性和完整的Enterprise Edition特性套件之间进行更改。 安装GitLab企业版。 为什么使用社区版 如果您只想下载开源软件,社区版是最好的选择。此发行版不包含专有代码。从功能上讲,它的行为与没有许可证的Enterprise Edition相同。 请注意,如果您决定在将来迁移到Enterprise Edition,则需要进行升级,并且可能需要停机。 安装GitLab社区版。

Skimage图像处理教程 0)目录

Skimage是python一个强大的图像处理的包,对于学习数字图像处理的小伙伴们来说是一个很实用的包,数据都是基于numpy格式所以熟悉numpy操作的小伙伴们会用的更方便,当然,不懂的话也没有影响。 下面就是每一讲的目录,持续更新中…… 1)安装,读写和调用示例图片 2)色彩空间变换 3)曝光度调整 4)形态学膨胀腐蚀开闭运算 5)其他形态学运算 6)图形绘制 未完待续……

人工智能导论笔记-第六章-遗传算法

遗传算法: 基本思想:在求解问题时从多个解开始,然后通过一定的法则进行逐步迭代以产生新的解 遗传算法的基本要素: 编码 生成初始种群 适应度函数 个体选择概率 个体选择方法 交叉操作 变异 编码: 位串编码: 将问题空间的参数用一维数组表示 (1)二进制编码:用若干二进制数表示一个个体,将原问题的解空间映射到位串空间B={0,1}上,然后在位串空间上进行遗传操作 优点:类似生物染色体的组成,算法易于用生物遗传理论解释,遗传操作如交叉、变异等易实现;算法处理的模式数最多 缺点:相邻整数的二进制编码可能具有较大的Hamming距离,降低了遗传算子的搜索效率;要先给出求解精度 (2)Gray编码:将二进制编码通过一个变换进行转换得到的编码 实数编码: 采用实数表达不必进行数制转换,可直接在解的表现型上进行遗传操作 多参数映射编码的基本思想:把每个参数先进行二进制编码得到子串,再把这些子串连成一个完整的染色体 多参数映射编码中的每个子串对应各自的编码参数,所以,可以有不同的串长度和参数的取值范围 适应度函数的尺度变换: 欺骗问题:在遗传算法中,将所有妨碍适应度值高的个体产生,从而影响遗传算法正常工作的问题统称欺骗问题 过早收敛:缩小这些个体的适应度,以减低这些超级个体的竞争力 停滞现象:改变原始适应值的比例关系,以提高个体之间的竞争力 适应度函数的尺度变换或者定标:对适应度函数值域的某种映射变换 (1)线性变换: f'=af+b;满足f'avg=favg,f'max=Cmult*favg (2)幂函数变换: f'=f^k (3)指数变换: f'=e^-af 选择: (1)适应度比例法: 各个个体被选择的概率和其适应度值成比例 个体i被选择的概率: (2)排序方法: 线性排序: 非线性排序: 交叉: 一般的交叉方法: (1)一点交叉: 在个体串中随机设定一个交叉点,实行交叉时,该点前或后的两个个体的部分结构进行交换,并生成两个新的个体 (2)两点交叉: 随机设置两交叉点,将两个交叉点之间的码串相互交换 修正的交叉方法: (1)部分匹配交叉PMX: A=9 8 4 | 5 6 7 | 1 3 2 B=8 7 1 | 2 3 9 | 5 4 6

QQ好友列表的实现(QQ9.0版本样式) -- 使用QTreeView

文章结构 最终实现效果基本功能代码主要结构FriendTree类主要工作解析ItemDelegate类主要工作解析 工程源码路径/下载地址 最终实现效果 以上是实现的最终样式,自己电脑上安装的QQ9.0版本,就按这个版本来了。 基本功能 实现的一些基本功能总结: 分组展示好友列表 ,一个组下多个好友;Item上绘制头像、在线状态、个性签名、用户名+昵称(依据是否VIP设置成不同颜色)、视频通话图标;头像、在线状态、视频通话图标采用svg图标格式hover效果,鼠标移至Item不同位置,ToolTip显示不同的信息,如鼠标移动至头像时提示“鼠标移到头像上啦!”,鼠标移到视频通话按钮上显示"视频通话"等,默认显示用户名+昵称+QQ号。当鼠标移动到某个好友Item上时,对应Item显示视频通话图标。双击Item事件,打开聊天(仅演示捕获事件,进行弹窗提示事件处理结果);点击视频通话图标,进行视频通话(仅演示捕获事件,进行弹窗提示事件处理结果) 代码主要结构 说明:公共UI库主要是一些通用的处理,比如DelegatePainter类,专门用来绘制文本、图片等,TreeView增加了一些自定义的事件信号,在此处不一一赘述,若有需要,可直接拿过去复用即可,也可以自己定义其他信号等。我们的好友列表TreeView是继承此类的。源码路径见文章最后。 FriendTree类主要工作解析 前提:使用上面提到的公共Ui库。 下面讲解下FriendTree主要做的事情,类头文件如下: #pragma once #include <QTreeView> #include "PublicGui/TreeView/TreeView.h" #include "GlobalDefines.h" using namespace publicgui; namespace qqfriendlist { class ItemDelegate; class FriendTree : public TreeView { Q_OBJECT public: FriendTree(QWidget *parent = Q_NULLPTR); ~FriendTree(); // 赋值 传入分组/好友结构数据 void setValues(const std::vector<Group>& groups); private: void initUi(); void initConnection(); // 自定义的hover处理 void onHoverHandle(const QModelIndex& index, int role); // 自定义的点击事件处理 void onClickedHandle(const QModelIndex& index, int role); private: QStandardItemModel* m_model{ nullptr }; // model ItemDelegate* m_delegate{ nullptr }; }; } 以下四个成员函数

hack-checkbox

checkbox选择按钮要用我们自己的样式,看到这个的时候,很可能会以为需要checkbox才能实现,用css可能很难。其实狠简单。 <style> .checkbox input{ display: none; } .checkbox input + label { background: url(checkbox1.png) left center no-repeat; background-size: 20px 20px; padding-left: 20px; } .checkbox input:checked + label { background-image: url(checkbox2.png) } </style> <body> <div class="checkbox"> <input type="checkbox" id="handsome"> <label for="handsome">我很帅</label> </div> </body> 首先没有选中的时候,设置一个背景,再设置一个padding,这样就可以显示出来,然后将背景的大小设置成跟padding一样大。选中的话,我们给了一个input:checked这样一个状态。这个状态是css提供的。然后使用了一个+。+号是后续的兄弟元素。也就是当checkbox选中的时候,label的样式就换个背景,这个选择器和+号就是点睛之笔。 同样的思路也可以用于radio. 转载于:https://www.cnblogs.com/wzndkj/p/10348783.html

Hadoop 集群搭建

目录 1、基础集群环境准备 1.1、修改主机名 1.2、设置系统默认启动级别 1.3、配置 hadoop 用户 sudoer 权限 1.4、配置 IP 1.5、关闭防火墙/关闭 Selinux 1.6、添加内网域名映射 ​ 1.7、安装 JDK 做完以上步骤后,可以开始克隆虚拟机。因为以上系统的配置,都是一些基础性的操作。 都是必须的。 1.8、同步服务器时间 1.9、配置免密登录 2、Hadoop 集群环境安装 hadoop 分布式集群安装 3、集群初步使用 3.1、Hadoop 集群启动 3.2、HDFS 初步使用 3.3、mapreduce 初步使用 1、基础集群环境准备 1.1、修改主机名 1、 在 root 账号下用命令:vi /etc/sysconfig/network 或者如果配置了 hadoop sudo 权限,则在 hadoop 登录情况下使用命令: sudo vi /etc/sysconfig/network 2、 修改好后,保存退出即可 1.2、设置系统默认启动级别 1、在 root 账号下输入 vi /etc/inittab 1.3、配置 hadoop 用户 sudoer 权限 1、 在 root 账号下,命令终端输入:vi /etc/sudoers 2、 找到 root ALL=(ALL) ALL 这一行,然后在他下面添加一行: hadoop ALL=(ALL) ALL 保存,退出 1.

客户端注册eureka服务失败registration failed Cannot execute request on any known server

SpringBoot 2.0.3.RELEASE SpringCloud Finchley.RELEASE 启动 eureka 客户端,报如下错误: 2019-02-01 11:36:56.933 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Application version is -1: true 2019-02-01 11:36:56.933 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server 2019-02-01 11:36:57.375 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : The response status is 200 2019-02-01 11:36:57.377 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 30 2019-02-01 11:36:57.

した、でした、しました的用法

した是说过去做了,是变为了た形的做 でした 是です的た形 用于口语化时的句尾(但日本人口语时也有不那么用的),没意思 しました 也是口语化的た形变化 也没有特别的意思,跟在句尾,是します的变形 した 是 しました 的简体说法。 前面接サ変动词的词干(汉字部分) 如: 食事した → 食事しました 简体和敬体的区别在于: 1. 简体多用在报章杂志的书面语以及关系密切的朋友之间的口语 2. 敬体一般用在普通日记体或者一般关系的口语(比如和不认识的路人,或者和师长父母同事等) 3.初学者首先要求掌握敬体,然后才是简体 而 でした 是です的过去式,前面是接名词、形容动词的 如: 学生でした きれいでした 簡単でした 补充: 其实,です ます 的过去式分别是 でした ました 这个不能称为“た形”的。 动词的活用中有连用形,而た形 和 て形 分别是动词连用形的两种形态。 但是です ます 它们是助动词,助动词是不说连用形连体形这类的活用的,虽然他们也是按照规律变化,但是通常我们不讨论です ます这两个助动词的活用的。 因此,在称谓上,不能将之理解为です的“た形”或者ます的“た形”。

前端路由跳转基本原理

目前前端三杰 Angular、React、Vue 都推介单页面应用 SPA 开发模式,在路由切换时替换 DOM Tree 中最小修改的部分 DOM,来减少原先因为多页应用的页面跳转带来的巨量性能损耗。它们都有自己的典型路由解决方案,@angular/router、react-router、vue-router。 一般来说,这些路由插件总是提供两种不同方式的路由方式: Hash 和 History,有时也会提供非浏览器环境下的路由方式 Abstract,在 vue-router 中是使用了外观模式将几种不同的路由方式提供了一个一致的高层接口,让我们可以更解耦的在不同路由方式中切换。 值得一提的是,Hash 和 History 除了外观上的不同之外,还一个区别是:Hash 方式的状态保存需要另行传递,而 HTML5 History 原生提供了自定义状态传递的能力,我们可以直接利用其来传递信息。 下面我们具体看看这两种方式都有哪些特点,并提供简单的实现,比如基本的功能,更复杂的功能比如懒加载、动态路径匹配、嵌套路由、路由别名等等,可以关注一下后面的 vue-router 源码解读方面的博客。 1. Hash 1.1 相关 Api Hash 方法是在路由中带有一个 #,主要原理是通过监听 # 后的 URL 路径标识符的更改而触发的浏览器 hashchange 事件,然后通过获取 location.hash 得到当前的路径标识符,再进行一些路由跳转的操作,参见 MDN location.href:返回完整的 URL location.hash:返回 URL 的锚部分 location.pathname:返回 URL 路径名 hashchange 事件:当 location.hash 发生改变时,将触发这个事件 比如访问一个路径 http://sherlocked93.club/base/#/page1,那么上面几个值分别为: # http://sherlocked93.club/base/#/page1 { "href": "http://sherlocked93.club/base/#/page1", "pathname": "/base/", "hash": "#/page1" } 注意: Hash 方法是利用了相当于页面锚点的功能,所以与原来的通过锚点定位来进行页面滚动定位的方式冲突,导致定位到错误的路由路径,因此需要采用别的办法,之前在写 progress-catalog 这个插件碰到了这个情况。

C语言实验——打印菱形

1174 #include<stdio.h> int main() { int n,i,c,t; scanf("%d",&n); for(i=1;i<=n;i++) { for(t=i;t<n;t++) { printf(" "); } for(c=1;c<=i;c++) { printf("*"); } for(c=i-1;c>0;c--) { printf("*"); } printf("\n"); } for(i=n-1;i>0;i--) { for(t=i;t<n;t++) { printf(" "); } for(c=1;c<=i;c++) { printf("*"); } for(c=i-1;c>0;c--) { printf("*"); } printf("\n"); } return 0; }

kubernetes部署nfs-subdir-external-provisioner

nfs-subdir-external-provisioner简介 nfs-subdir-external-provisioner可动态为kubernetes提供pv卷,是Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有的NFS服务器提供存储。持久卷目录的命名规则为: ${namespace}-${pvcName}-${pvName}。 项目地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner 搭建NFS服务器 集群外准备一个节点10.0.0.5作为NFS server服务器,这里作为测试,使用docker部署NFS服务器: docker run -d --name nfs-server \ --privileged \ --restart always \ -p 2049:2049 \ -v /nfs-share:/nfs-share \ -e SHARED_DIRECTORY=/nfs-share \ itsthenetwork/nfs-server-alpine:latest 或者手动方式部署nfs服务器: yum -y install nfs-utils mkdir -p /nfs-share chmod -R 777 /nfs-share cat >> /etc/exports << EOF /nfs-share *(rw,no_root_squash,sync) EOF exportfs -arv exportfs -s systemctl enable --now rpcbind systemctl enable --now nfs-server kubernetes集群所有节点需要安装nfs客户端 yum install -y nfs-utils 作为准备工作,我们已经搭建了一个 NFS 服务器,共享目录为 /nfs-share。下面部署nfs-subdir-external-provisioner。

26、jdbc操作数据库(3)

1、结果集的元数据操作 ResultSetMetaData 是描述ResultSet的元数据对象,可以通过元数据对象获取结果集的列信息,使用方式如下: public void query() { Connection connection = DBUtil.getConnection(); String sql = "SELECT ID,UNAME u,PASSWORD FROM USER"; PreparedStatement prepareStatement = null; ResultSet resultSet = null; try { prepareStatement = connection.prepareStatement(sql); //获取到结果集CallableStatement resultSet = prepareStatement.executeQuery(); // 通过 结果集的getMetaData() 获取到元数据对象 ResultSetMetaData metaData = resultSet.getMetaData(); System.out.println("获取数据列数"+metaData.getColumnCount()); System.out.println("第二列的字段名是:"+metaData.getColumnName(2)); System.out.println("第二列的字段别名是:"+metaData.getColumnLabel(2)); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(resultSet, prepareStatement, connection); } } 2、使用jdbc进行批量处理 当一次处理多条记录时,可使用jdbc进行批量操作,其基本思路是现将要执行的sql进行积攒,然后一次性发送到数据库进行执行,示例代码如下: //获取连接 Connection connection = DBUtil.getConnection(); String sql = "

二叉树的递归的算法

二叉树的递归算法 #define max 30 #define NULL 0 #include <stdio.h> #include <stdlib.h> typedef struct BNode { char data; /*数据域 */ struct BNode *lchild,*rchild;; //指向左右子女 }BinTree; void preorder(BinTree *t); //声明先根遍历函数 void inorder(BinTree *t); //声明中根遍历函数 void postorder(BinTree *t);//声明后根遍历函数 int leafs(BinTree *b); //声明求叶子数函数 int treedeep(BinTree *p); //声明求树的深度函数 BinTree *swap(BinTree *p); //声明交换二叉树的所有结点的左右子树的函数 //将字符串中的第i个字符开始的m个字符作为数据生成对应的二叉树 BinTree *cre_tree(char *str,int i,int m) { BinTree *p; if(i>=m) //无效结点 return NULL; p=(BinTree *)malloc(sizeof(BinTree));//生成新结点 p->data=str[i]; p->lchild=cre_tree(str,2*i+1,m);//创建新结点的左子树 p->rchild=cre_tree(str,2*i+2,m);//创建新结点的右子树 return p; } void main() { int i,n; char str[max]; BinTree *root;//根结点 printf("

MIME (Multipurpose Internet Mail Extensions)

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。 一个消息重要的有三个地方,路径,提交方式(POST或者GET),消息类型(即MIME),说明传递的是什么类型的数据。 所有的文件类型都有对应的MIME, 如一张图片,后缀是.jpg,有对应的MIME类型,一本书,后缀为pdf,也有对应的文件类型。 http://www.w3school.com.cn/media/media_mimeref.asp 这个手册有点out了,连application/json这么关键的类型都没列出来。

DolphinDB与InfluxDB对比测试报告

DolphinDB是一款分析型的分布式时序数据库,内置处理流式数据处理引擎,具有内置的并行和分布式计算的功能,并提供分布式文件系统,支持集群扩展。DolphinDB以C++编写,响应速度极快。提供类似于Python的脚本语言对数据进行操作,支持类标准SQL的语法。提供其它常用编程语言的API,方便与已有应用程序集成。在金融领域中的历史数据分析建模与实时流数据处理,以及物联网领域中的海量传感器数据处理与实时分析等场景中表现出色。 InfluxDB是一款开源的时序数据库,由Go语言实现。它的核心是一款定制的存储引擎TSM Tree,对时间序列数据做了优化,优先考虑插入和查询数据的性能。InfluxDB使用类SQL的查询语言InfluxQL,并提供开箱即用的时间序列数学和统计函数。适用于监控、实时分析、物联网、传感器数据等应用场景。是目前最为流行的时间序列数据库。 本文将会对DolphinDB和InfluxDB进行性能测试对比。 在本次测试中,硬件配置如下: 设备:DellXPS 8920(07DC) CPU:Inter® Core™ i7-7700 CPU @ 3.60GHz,4核心8线程 内存:16GB 硬盘:512GB SSD 操作系统:Ubuntu 16.04 x64 由于InfluxDB集群版本闭源,所以本次测试使用的DolphinDB和InfluxDB均为单机版本,并且所有配置项都是默认配置。 1. 数据生成 在本次测试中,我们使用NYSE网站上2016年10月24日纽约交易所的股票交易数据生成了Quotes_Big表。在其中取出一部分数据构成Quotes_Small表。表结构如表1所示。Quotes_Big表中的数据量为78,721,394条,Quotes_Small表中数据量为18,314,172条。数据下载链接及预处理脚本详见附录1。 由于DolphinDB和InfluxDB在存储方式上的差异,我们采用如下设计:我们将Time列指定为InfluxDB中的timestamp;将Exchange和Symbol列指定为InfluxDB中的Tag列(类似于带索引的列);将Bid_Price、Bid_Size、Offer_Price、Offer_Size指定为InfluxDB中的field列(类似于无索引的列)。在DolphinD系统中根据Symbol列在磁盘上进行RANGE分区,分为8个区。 表1.数据类型映射 2. 数据库查询性能测试 我们对11种常用的SQL查询进行了对比测试。Quotes_Small表的测试结果如下表2所示,Quotes_Big表的测试结果如下表3所示。其中,对于DolphinDB的测试,我们使用的是DolphinDB官方的GUI;对于InfluxDB,我们使用的是官方的PythonAPI。执行时间以毫秒为单位,只包含查询本身执行的时间,而不包含结果显示的时间。为了减少特殊值的影响,每个查询都执行10次,表中数据是10次查询的总时间。本次测试的脚本详见附录2。 在几乎所有测试中,DolphinDB的性能都领先InfluxDB多倍,某些情况下的差距甚至超过2个数量级(100倍)。InfluxDB唯一领先DolphinDB的测试是在Quotes_Small表的第4个测试项目,这是由于在数据量较小时DolphinDB并行搜索分区的优势不明显。然而,在数据量较大的情况下,DolphinDB在所有测试中上的性能都优于InfluxDB。DolphinDB可以并行搜索分区的设计使它在过滤性查询方面的性能全面超过了InfluxDB。 表2. Quotes_Small表查询性能测试结果(数据量:18,314,172) 表3. Quotes_Big表查询性能测试结果(数据量:78,721,394) 3. 内置函数计算性能测试 我们测试了8个DolphinDB和InfluxDB都提供的常用内置函数。在所有测试中,DolphinDB的性能都优于InfluxDB 1-2个数量级(10-100倍)。由于DolphinDB对带有滑动窗口的函数极好的优化,在“滑动平均值”(moving_average)的测试中,DolphinDB的性能领先InfluxDB 3个数量级以上(>1000倍)。 InfluxDB在Quotes_Big表的标准差与滑动平均值计算中在长时间的卡顿后引发内存不足的问题(out of memory),说明InfluxDB对大规模数据的复杂分析场景支持不足。而DolphinDB在此方面性能优异。 Quotes_Small表的测试结果如下表4所示,Quotes_Big表的测试结果如下表5所示。表格中数据的单位为毫秒。为减少特殊值的影响,每个计算都进行了10次。测试脚本详见附录3。 表4. Quotes_Small表计算性能测试结果(数据量:18,314,172) 表5. Quotes_Big表计算性能测试结果 4. I/O性能测试 我们分别使用了DolphinDB和InfluxDB的JavaAPI,比较了在相同的环境下写入相同规模的数据所需要的时间。由于InfluxDB的默认batch-size为5000,因此在两个数据库的写入程序中,单次插入的数据量都为5000条。我们还比较了从数据库中导出同样规模的csv文件所需要的时间。比较的结果是,无论是写入性能还是导出性能,DolphinDB都优于InfluxDB。对于相同规模的18,314,172条数据,DolphinDB的导出速度为InfluxDB的2倍;写入速度约为12倍。 测试结果如下表6所示。表格中的数据单位为毫秒。测试代码详见附录4。 表6. I/O性能测试结果 5. 磁盘占用空间测试 我们比较了Quotes_Small表和Quotes_Big表由DolphinDB和InfluxDB存储后在磁盘上的占用空间。结果显示,两款数据库都对数据进行了压缩存储,压缩率大致处于同一个数量级,都在20%-30%之间,但DolphinDB的压缩效果更佳。 测试结果如下表7所示,表中的数据单位为MB。 表7. 磁盘占用空间测试结果 6.其他方面对比 DolphinDB除了在基准测试中体现出优越的性能之外,还具有如下优势: (1)InfluxDB通过InfluxQL来操作数据库,这是一种类SQL语言;而DolphinDB内置了完整的脚本语言,不仅支持SQL语言,而且支持命令式、向量化、函数化、元编程、RPC等多种编程范式,可以轻松实现更多的功能。 (2)InfluxDB对于特定文件格式数据例如csv文件的批量导入没有很好的官方支持。用户只能通过开源第三方工具或自己实现文件的读取,规整为InfluxDB指定的输入格式,再通过API进行批量导入。单次只能导入5000行,不仅操作复杂,效率也极其低下。与之对比,DolphinDB的脚本语言中提供了loadText、loadTextEx函数,用户可以在脚本中直接导入txt或csv文件,而且效率更高,对用户更友好。 (3)DolphinDB提供400余种内置函数,可满足金融领域的历史数据建模与实时流数据处理,及物联网领域中的实时监控与数据实时分析处理等不同的场景需求。提供时序数据处理需要的领先、滞后、累积窗口、滑动窗口等多种指标的函数,且在性能上进行了优化,性能极优。 因而与InfluxDB相比,DolphinDB拥有更多的适用场景。 (4)InfluxDB不支持表连接,而DolphinDB不仅支持表连接,还对asof join及window join等非同时连接方式做了优化。 (5)InfluxDB中,对时间序列的分组(GroupBy)最大单位是星期(week);而DolphinDB支持对所有内置时间类型的分组,最大单位为月(month)。因此在时间序列这一特性上,DolphinDB也有更好的支持。 (6)DolphinDB采用分布式表引擎时支持事务,而且在一个分区的多个副本写入时,保证强一致性。

linux修改文件:E212 can't open file for writing

普通用户登录Linux,修改/etc/ssh/sshd_config时,:wq 进行保存退出,退出不了,一直提示 E212 can't open file for writing 意思是不能保存。 原因:权限不够,普通无法保存,需要使用超级用户才可以。 执行切换到超级用户命令: # sudo su

bash: schematool: 未找到命令的解决办法

初始化hive百度了一下是,输入后报错,如下: [root@cluster-1 conf]# schematool -dbType mysql -initSchema bash: schematool: 未找到命令... 于是我就通过yum命令安装嘛,出错,报错如下: [root@cluster-1 conf]# yum -y install schematool 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.tuna.tsinghua.edu.cn base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 mysql-connectors-community | 2.5 kB 00:00:00 mysql-tools-community | 2.5 kB 00:00:00 mysql57-community | 2.5 kB 00:00:00 updates | 3.4 kB 00:00:00 没有可用软件包 schematool。 错误:无须任何处理 后来百度发现是不该进入conf目录下进行,必须转到bin目录下执行hive初始化命令,但还是出错,错误如下: [root@cluster-1 bin]# schematool -dbType mysql -initSchema bash: schematool: 未找到命令.

学生信息管理系统设计

学生信息管理系统设计 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。 试设计一学生信息管理系统,使之能提供以下功能: 系统以菜单方式工作 学生信息录入功能(学生信息用文件保存)—输入 学生信息浏览功能—输出 查询、排序功能—算法 按学号查询 按姓名查询学生信息的删除与修改 C语言课程设计的作业,懵懵懂懂的做了一个,很多代码其实都是一样的,上下可以互相贴 #include<stdio.h>//标准的输入输出函数头文件 #include<string.h>//字符串类头文件 #include<math.h>//数学函数头文件 #include<stdlib.h> char f; FILE *fp;//文件指针 #define M 80 struct student //结构体定义声明 { char num[13];//学号 char name[15];//姓名 int age;//年龄 char x[5];//性别 char year_month_day[15];//出生年月 char address[15];//地址 int iphone;//手机号 char e_mail[20];//邮箱 int xx,yy,wl,cyy,pe;//数学、英语、物理、C语言、体育 }; void input(struct student stu[M]);//输入函数 void output(struct student stu[M]);//输出函数 void lookfor(struct student stu[M]);//查询函数 void order(struct student stu[M]);//排序函数 void delete_s(struct student stu[M]);//删除函数 void modify(struct student stu[M]);//修改函数 void xuehao(struct student stu[M]);//学号查询函数 void xingming(struct student stu[M]);//姓名查询函数 void fileread(struct student stu[M]);//读取文件信息函数 void filewrite(struct student stu[M]);//写入文件函数 int count;//定义一个全局变量 struct student t; int main() { int choice,sum; struct student stu[M]; sum=0; do { printf("

自己编译CTS源码、Android源码(ubuntu)

由于最近在做一些手机CTS测试相关的工作,需要自己编译CTS,在网上逛了一圈后,发现相关的教程版本都比较老,有些是在Windows下的Android studio下编译的,最后结合多家博客教程,完成了CTS源码的编译工作。下面把编译的具体操作流程总结一下: 1、 首先我们需要下载好Android源码,由于国内某墙的限制,可以参考我的这篇博文:https://blog.csdn.net/Dhane/article/details/86481582 2、下载完成后我们可以看到Android源码下有一个cts目录,这个就是cts源码。编译cts源码和编译其他模块差不多,在Android目录下运行以下代码: source build/envsetup.sh lunch //然后选择自己的测试机的架构,一般选择2 arm_x64 make cts //开始编译, 如果性能足够好可以开启多线程同步编译 后面加 -j4 或 -j8 之后耐心等待编译完成就好啦,如果是第一次编译的话,会需要较长的时间。 编译完成后的文件在android/out/host/linux_x86/cts/下的android-cts里,后期如果要进行cts 测试的话只要把android-cts文件夹拷贝出来就行了。 3、cts测试 进入到android-cts/tools/目录下,运行cts-tradefed文件: ./cts-tradefed 然后就到了以下界面啦: 在cts-tf > 后面运行具体的cts测试代码就行啦~ 如果不知道怎么运行可以直接输入cts 然后回车,会出现帮助界面。

2019寒假集训第四场(新生场)

问题 A: 蛇爬树 时间限制: 1 Sec 内存限制: 128 MB 目描述有一条蛇在地上,它想要爬到一棵树的顶端,树的顶端距离地面V米。在白天它能向上爬行A米,而晚上睡觉时,它会滑下B米。那么,这条蛇在第几天能爬到树顶。 输入输入仅一行,三个整数A,B,V(1<=B<A<=1,000,000,000,V≤1,000,000,000),分别表示白天爬行距离,晚上滑下距离,树的高度。 输出输出一个整数,表示几天后可以爬到树顶。 样例输入复制样例数据 2 1 5 样例输出4 #include<stdio.h> int main() { int a,b,v,t=1,f; scanf("%d%d%d",&a,&b,&v); f=a; while(f<v) { f+=a-b; t++; } printf("%d\n",t); return 0; } 问题 B: 组队竞赛 时间限制: 1 Sec 内存限制: 128 MB 目描述每年,A市都会组织程序设计竞赛,他们的比赛与我们的略有不同,是组成小团队进行比赛的,每个队伍有三人组成。根据传统,队员大多数都是男生,因此规定,队伍必须由两个男生和一个女生组成。 可是今年的情况有所不同,由于一个国际交流的活动,该市必须派出K位同学参加国际交流,当然交流没有男女比例的限制。为了顺利的进行国际交流,又要使得参加程序设计竞赛的队伍尽可能的多,就要进行细致的安排。 现在,给定共有M个男同学,N个女同学,需要派遣参加国际交流的为K位同学,请你计算,最多能有多少队伍参加本市的程序设计竞赛。 例如,M=6,N=3,K=2,我们可以派出1位男同学和1位女同学参加国际交流,剩余的5位男同学和2为女同学可以组成2个队伍(剩下的1位男同学就无法参加比赛了)。 输入输入仅一行,包含3个整数M,N,K(0<=M<=100, 0<=N<=100, 0<=K<=M+N),分别表示男生人数,女生人数和参加国际交流的人数。 输出输出一个整数,表示最多可以组织多少个队伍参加比赛。 样例输入复制样例数据 6 3 2 样例输出2 #include<stdio.h> int main() { int m,n,k,a[5]; scanf("%d%d%d",&m,&n,&k); a[0]=m/2; a[1]=n; if(a[0]>a[1]) { a[0]=a[1]; a[1]=(a[0]-a[1])*2+m%2; } else { a[1]=a[1]-a[0]+m%2; } k-=a[1]; if(k!

MFC输出信息

目录 一、目的: 1、MFC中需要输出一些信息进行查看 一、方法 1、定义的数字 :输出(再输出框中能看到) 方法1:wsprintf、OutputDebugString 方法2:TRACE 2、MFC输出自定义的字符串(再输出框中能看到):TRACE 3、提示框:输出文字 方法1:AfxMessageBox 方法2:MessageBox 4、提示框:输出自己定义的数字 ①就是将数字转换为CString类型,然后让提示框输出来 ②Format需要多使用 5、对话框:输出自己定义的字符串\字符 ①制作CString类型变量就可以了 6、编辑框里显示按下某个按键 ①、再资源视图里面,对我们要做的对话框里面做一个编辑框 ②、按键消息里面添加代码:Format对CString处理 7、字符串输出: ①接着上面的制作,输出一下OutputDebugString() 一、目的: 1、MFC中需要输出一些信息进行查看 一、方法 1、定义的数字 :输出(再输出框中能看到) 方法1:wsprintf、OutputDebugString //①成功:新建字符串,让其打印出来 int b=123; wchar_t a[MAX_PATH]={0}; wsprintf(a,L"%d######################################\n",b); OutputDebugString(a); 方法2:TRACE //③成功:使用TRACE int a=123; TRACE("%d+++++++++++++++++++++++++++++++++++++++++++\n",a); 2、MFC输出自定义的字符串(再输出框中能看到):TRACE //④成功:分开来输出 CString a=L"asdads"; TRACE(a); TRACE("++++++++++++++++++++++++++++++++++++++\n"); 3、提示框:输出文字 方法1:AfxMessageBox AfxMessageBox(L"你好!"); 方法2:MessageBox MessageBox(L"你好"); 4、提示框:输出自己定义的数字 ①就是将数字转换为CString类型,然后让提示框输出来 ②Format需要多使用 CString str; int number=15; str.Format(_T("%d"),number); MessageBox(str); 5、对话框:输出自己定义的字符串\字符 ①制作CString类型变量就可以了 CString a=L"asdad"; AfxMessageBox(a); CString errStr; errStr.Format(L"连接卡%d失败!错误号:%d", i, errCode); AfxMessageBox(errStr); 6、编辑框里显示按下某个按键 ①、再资源视图里面,对我们要做的对话框里面做一个编辑框 ②、按键消息里面添加代码:Format对CString处理 BOOL CTextPrintTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message==0x0113 ||pMsg->message==0xf||pMsg->message==0x31f||pMsg->message==0xc0df) { return CDialogEx::PreTranslateMessage(pMsg); } CString str; if (pMsg->message == WM_CHAR) { CString ss; ss.

python中模型训练不收敛问题

近期在做人脸表情识别时,遇到了一个问题,就是模型写好进行训练时,出现了不收敛的现象。情况如下: 出现这种问题,很难无从下手,一步一步的排查各个环节,首先检查模型,发现模型并木有问题。部分模型代码: def train_model(): # 构建模型---------------------------------------------------------- x = tf.placeholder(tf.float32, [None, 128, 128, 1]) y_ = tf.placeholder(tf.int32, [None, ]) y_out, logits = deepnn(x) loss = loss_value(y_out, y_) train_step = tf.train.AdamOptimizer(learning_rate=0.0005).minimize(loss) correct_prediction = tf.equal(tf.cast(tf.argmax(y_out, 1), tf.int32), y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 然后检查loss函数,发现这部也没有问题,截取loss函数代码: def loss_value(logit, labels): labels = tf.cast(labels, tf.int64) cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels, name='cross_entropy_per_example') # 交叉熵损失 cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') # 权重损失 tf.add_to_collection('losses', cross_entropy_mean) return tf.add_n(tf.get_collection('losses'), name='total_loss') 一般情况下,这两部分排查完之后,查看数据是否读取正确,是否将数据读进去了。读取数据部分代码: def load_data(image_path): cate = [image_path+f for f in os.

hugo修改css后,反复刷新浏览器,css不生效的情况

问题: 用 chrome 做 hugo 博客 css 调试,遇到修改 css 不生效的情况 解决方式: 清除浏览器 缓存 推荐 chrome 清除缓存插件 https://chrome.google.com/webstore/detail/egkcjgapmgioadbkhaciondahbjggnhjhttps://chrome.google.com/webstore/detail/cppjkneekbjaeellbfkmgnhonkkjfpdn 或者可以直接在插件商城搜索 clear cache 更多内容欢迎访问 lipk.org

webots2019机器人仿真(2)新建工程和自由落体仿真

记录使用webots过程 目标: 机器人仿真 Python交互界面 官方的手册可以参考:https://cyberbotics.com/doc/guide/menu 手册中有官方的教程,可以跟着做一遍,然后明白大概的使用 新建工程 菜单栏选择 向导->新项目目录… 然后下一步选择所需要要创建的目录,此处不再截图 接下来显示的是项目名称和要添加的文件,修改名称后下一步,下面的选项默认,如果有看官网教程就会知道是什么,稍后会在工程中解释。 最后显示大概就是这样子,3d窗口里面没有东西,因为没有创建任何物体 2、自由落体 点击左侧列表中最后一个然后点击新建,建立新的物体时根据需要点在不同位置,大多数的物体都可以添加子集,如果没有点击子集默认是在点击位置下方添加一个新的 先添加一个地面,搜索floor,然后一个地面,可以不同 这里介绍一下这个鼠标操作3D视图(个人认为每个3d软件都有一些奇葩的操作,习惯就好): 左键:按住晃动鼠标,视图会以点击的位置旋转(实际是Viewpoint旋转) 右键:按住晃动鼠标,视图平移 滚轮:前后滚动是放大缩小 滚轮:按住晃动鼠标,水平晃动是滚动叫,上下是放大和缩小(奇葩) 同上,左侧列表中选择最后一个然后点击添加 选择children添加一个形状 接着添加几何体 终于看到图形了球了,个人感觉想是一个实体然后要给他加形状,形状还要添加几个图形然后并规定边界在哪里。 添加个外观(纹理) 选择一个喜欢的颜色 点击children下的shape添加一个命名ball 确定绑定 可看到球外界有一层网格,那个就是边界,没看到的话鼠标点击选中它 把球提高一些 加上物理效果 保存,然后运行,可看到掉落过程 先到这里,其他参数可以修改试一试,看看效果 闻道有先后 术业有专攻 From: shaynerain.com By: Shaynerain

spark操作hive表,用java调用提交任务脚本

Spark最主要资源管理方式按排名为Hadoop Yarn, Apache Standalone 和Mesos。 此次使用的yarn模式部署。spark操作hive创建任务,需要将此任务提交。在经过多日查找资料和测试发现多数是提交本地,少有提交到远程yarn集群。发现提交到远程集群的是使用 Standalone模式部署的,这种模式可以指定ip及端口。因此在此次开发中是没有使用java程序提交spark任务。还发现一种在java代码中写提交任务,但需要通过java命令触发,感觉本质上与用spark命令提交没有区别,故此方案不作考虑。所以spark任务提交会做成shell脚本来提交。 import org.apache.spark.sql.SparkSession; public class SparkTest { public static void main(String[] args) { SparkSession spark = SparkSession .builder() .appName("SparkTest").master("yarn-client").enableHiveSupport() .getOrCreate(); // 删除hive表 spark.sql("DROP TABLE IF EXISTS CH_TEST.SPARK_TEST"); // 创建hive表 String createSql = "CREATE TABLE IF NOT EXISTS CH_TEST.SPARK_TEST (MEMBER_ID string,MEMBER_NAME string,QTT bigint)"; spark.sql(createSql); // 插入数据 String insertSql = "INSERT INTO TABLE CH_TEST.HIVE_SPARK select * from CH_TEST.SPARK_TEST a limit 10"; spark.sql(insertSql); spark.stop(); } } 只需在main方法中写入spark逻辑,再使用spark命令调用执行即可。SparkSession是最新版本spark所使用的,之前使用的SQLContext、HiveContext 均已过时,会出现找不到表的情况。