最简单的XML读取、修改数据方法

XML文件 <?xml version="1.0" encoding="utf-8" ?> <root> <SteriaSuccesstime>20181210</SteriaSuccesstime> </root> //获取XML中的节点数据 private string GetSuccessLocalModetime() { XmlDocument doc = new XmlDocument(); string successLocalModetime = string.Empty; try { string path = Application.StartupPath + "\\SteriaSuccesslocalModetime.xml"; if (System.IO.File.Exists(path)) { doc.Load(path); XmlNode xn = doc.SelectSingleNode("//SteriaSuccesstime"); successLocalModetime = xn.InnerText ?.ToString(); Logger.Write(" GetSuccessLocalModetime() successLocalMpdetime = " + successLocalModetime, "BusinessEvents"); } } catch(Exception ex) { Logger.Write(" GetSuccessLocalModetime() has error = " + ex, "BusinessEvents"); } return successLocalModetime; } //修改XML中节点的值

读取文件保存路径

SystemSetting.json [ { "ADTD_INTERFACE_ADDRESS": "http://17.2.6.1:8080/LightningDataInterface/service/adtd", "UPLOAD_PATH":"H:\\newworkspace\\flzhgl\\", "WARNING_INTERFACE":"", "USERNAME":"", "PASSWORD":"" } ] SystemSetting.java package cn.edu.cqu.flzhgl.json.ldjc; import java.io.UnsupportedEncodingException; import com.google.gson.Gson; import cn.edu.cqu.flzhgl.tools.ldjc.FileTools; /** * 系统配置信息 */ public class SystemSetting { private String ADTD_INTERFACE_ADDRESS; /** * 获取雷电数据接口地址 * @return */ public String get_ADTD_INTERFACE_ADDRESS() { try //获取系统设置 { String aString2=new FileTools().ReadFileAsString((new FileTools().GetProjectRootPath()+"resources"+System.getProperty("file.separator")+"SystemSetting.json")); SystemSetting foo[] = new Gson().fromJson(aString2, SystemSetting[].class);//将json文本信息转换为对象 ADTD_INTERFACE_ADDRESS=foo[0].ADTD_INTERFACE_ADDRESS; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block //e.printStackTrace(); } return ADTD_INTERFACE_ADDRESS; } } Service.

Python、Java 集成Jenkins做自动化的记录

安装Virtualenv pip install virtualenv pip install virtualenvwrapper # 这是对virtualenv的封装版本,一定要在virtualenv后安装 创建虚拟环境 选择一个用来存放虚拟环境的文件,如E:/python3 cd E:python3 # 进入该文件 virtualenv envname # 创建一个名字为envname的虚拟环境 dir # 查看当前目录可以知道一个envname的文件已经被创建 安装selenium pip install selenium 查看是否已经安装 pip show selenium 下载 Chromedriver 放到python的Scripts路径下 与selenium版本需要对应 编写代码测试: #!/usr/bin/env python2 # -*- coding: utf-8 -*- from selenium import webdriver # 导入webdriver包 driver = webdriver.Chrome() driver.get("https://www.baidu.com") 启动虚拟环境 # 进入虚拟环境文件 cd envname # 进入相关的启动文件夹 cd Scripts activate # 启动虚拟环境 deactivate # 退出虚拟环境 配置脚本的环境变量 python_env="脚本路径",将%python_env%\ 添加到path后面

Js实现中文排序,并根据拼音首字母分组

Js实现中文排序,并根据拼音首字母分组 const pySegSort=(arr) =>{ if (!String.prototype.localeCompare) return null let letters = 'abcdefghjklmnopqrstwxyz'.split('') let zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('') let segs = [] letters.map((item, i) => { let cur = { letter: item, data: [] } arr.map((item) => { if(item.localeCompare(zh[i])>=0&&item.localeCompare(zh[i+1])<0){ cur.data.push(item) } }) if (cur.data.length) { cur.data.sort(function(a, b) { return a.localeCompare(b, 'zh') }) segs.push(cur) } }) return segs } console.log(pySegSort(['白案','百搭','白菜','百旺','王','李','张','刘','陈','杨','黄','吴','赵','周','的','徐','孙','马','朱','胡','林','郭','何','高','罗','','郑','梁','谢','宋','唐','许','邓','冯','韩','曹','曾','彭','白大','萧','蔡','F','潘','田','董','袁','于','余','','叶','蒋','杜','苏','魏','程','吕','丁','沈','任','白','卞']))

基于安卓7.0和AccessibilityService自动抢单软件的总结和心得

前言 这篇文章重点在于实现下拉和点击功能的思路,以及此次成功实现功能后的心得体会,其他方面的内容将简单描述,希望能对热爱开发一些实用性工具的开发者有所帮助。 开发环境准备 安卓开发环境Anstroid Studio和JDK,windows。 实现过程 AccessibilityService类的介绍和使用,直接百度搜索即可。在了解并注册了AccessibilityService服务类后,接下来的重点是在onAccessibilityEvent方法中实现具体的业务(例如我此次需要实现的抢单功能)。在onAccessibilityEvent方法中,有个AccessibilityEvent类型的参数,该类可以获取当前变动的类型(如页面的改变)。由于我是通过打开应用触发下拉和点击的功能的,因此监听的是 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 这一事件类型。接下来,我们可以通过findAccessibilityNodeInfosByText()方法获取当前应用界面上的UI节点,并通过该节点的performAction模拟点击效果。但是!难点就在于这里,这种获取节点的方法只限于普通的view(如TextView),但是对于WebView下的节点这种方法是获取不到的。于是我在网上搜索了下,终于找到了一篇博客是关于如何使用AccessibilityService获取WebView内容的,网址:感谢作者繁星点点的分享。很感谢作者繁星点点的分享,这次写博客分享也是因为被他的分享精神所影响。OK,获取到WebView内容中的节点后,下一步是通过获取的节点进行点击事件的模拟。然而难点之二又来了!在WebView中的节点调用performAction方法模拟点击事件时,应用是没有反应的! 于是,在网上搜索一番后,得到了几种模拟点击的方法,此处再把他们进行对比一番,方便大家进行选择。 第一种是MotionEvent,但是需要获取到View对象并绑定,言外之意就是说,你只能在当前界面所属的应用程序内部获取View才能模拟。 第二种是使用ADB SHELL,此方法在模拟器上亲测可用,但是实际在手机上运行需要ROOT权限,对手机安全性会有影响。 第三种是Instrumentation,需要给予INJECT_EVENTS权限,但是始终会出现问题,详见此处 。 第四种是使用GestureDescription,无需ROOT即可实现点击和滑动,但是需要安卓7.0以上,估计这一条件对于大家来说应该不成问题。好了,获取WebView下的节点和模拟滑动这两个烫手芋头就已经解决了,其他的问题都不难解决。 心得 此次开发遇到的问题基本上是通过网上搜索相关案例得到解决的,在“山重水复疑无路”之后,通过网友们的热心分享,终于“柳暗花明又一村”了。因此,在开发完成后被他们的分享精神所影响,决定自己也写下博客,记录下比较困难的几个步骤,方便网友们后续在实现这些功能时,直接就可以获取到解决方法。

git学习记录

git 学习笔记 git介绍1. 创建版本库2. 回退版本3. 工作区和暂存区4.管理修改5.撤销修改6.删除文件7.远程仓库7.1 添加远程库7.2 从远程库克隆 git介绍 git 学习参考lainxuefeng 1. 创建版本库 git init git add xxgit commit -m “xxx” git status git diffgit log 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数: git log --pretty=oneline 需要友情提示的是,你看到的一大串类似db3976…的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示 2. 回退版本 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。 git reset 回退到上一个版本,使用命令为: git reset --hard HEAD^ 想要回到 “command git checkout” 需要执行 git reset --hard 5730 回退到刚才被删除的节点 详解请参考廖雪峰版本回退2.2 git reflog 查看操作记录 现在总结一下: HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本 3. 工作区和暂存区 工作区(Working Directory):本地能看到的目录版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。暂存区(statge):Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。 我们把文件往Git版本库里添加的时候,是分两步执行的:

个人网站有赞云支付接口申请方法

网上有的网站用有赞来收款,但个人申请赞云支付接口会出现免费试用,主要是申请步骤错误。。。。。以下是有赞支付接口申请的步骤(个人免费)(按照下面的步骤来,否则可能不会免费) 1、手机扫码下载并安装“有赞微小店”APP。(电脑网页申请注册地址为:https://console.youzanyun.com/register,登录地址:https://console.youzanyun.com/login按步骤填写相关信息,与手机APP一样。) 个人网站有赞云支付接口申请方法http://www.lmlblog.com/336.html 转载于:https://www.cnblogs.com/lmlblogs/p/10093214.html

IDEA部署tomcat时 部署路径的设置方式

在idea部署时会改变tomcat 的catalina.base的路径,以本机(mac)为例,catalina.base的路径为: /Users/uc/Library/Caches/IntelliJIdea2018.2/tomcat/Unnamed_servletDemo 此目录下包含配置信息,其中server.xml的片段为: <Host name="localhost" appBase="/Users/uc/program/apache-tomcat-9.0.11/webapps" unpackWARs="true" autoDeploy="true" deployOnStartup="false" deployIgnore="^(?!(manager)|(tomee)$).*"> 可以看到deployIgnore中会忽略大部分的文件,而在配置目录的子目录:Catalina/localhost 中包含一个ROOT.xml文件,此文件信息如下: <?xml version="1.0" encoding="UTF-8"?> <Context path="" docBase="/Users/uc/project/servletDemo/target/servletDemo" /> 可以看到docBase正式指向了idea中当前的项目所在路径。 ps: 一般tomcat部署一个应用有3种方式: 1.最常用的方式,是把它放到catalina.home的webapps下面去,但是这种方式太过死板。 2.在server.xml的host标签下,添加<Context docBase="F:/aa" reloadable="false" path="/aa"/> 3.也就是上面的方式通过在Catalina/localhost目录下,添加一个配置文件来部署指定位置的应用。(文件的名字如果不是ROOT.xml,则文件名代表访问路径,也就是 path。

数组:添加删除修改 splice() 和 slice()

1、splice() :直接对数组进行修改 arrayObject.splice(index,howmany,item1,.....,itemX) index: 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 howmany: 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 item1, ..., itemX: 可选。向数组添加的新项目。 - splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。 ps: 如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。 Demo: <script type="text/javascript"> var arr = new Array(6) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" arr[3] = "James" arr[4] = "Adrew" arr[5] = "Martin" document.write(arr + "<br />") arr.splice(2,3,"William") // 删除arr[2]开始的3个元素,并添加"William"补充在之前掉删除的部分 document.write(arr) // George,John,Thomas,James,Adrew,Martin // George,John,William,Martin </script> 2、slice() : 返回一个新的数组 arrayObject.slice(start,end) start: 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。 end: 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。 Demo:

绝对定位position:absolute;实现居中对齐

源码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>练习的地方</title> <style> .main { position: absolute; width: 700px; height: 500px; background: pink; left: 50%; //起始是在body中,横向距左50%的位置 top:50%; //起始是在body中,纵向距上50%的位置,这个点相当于body的中心点,div的左上角的定位 transform:translate(-50%,-50%);//水平、垂直都居中,也可以写成下面的方式 /*margin-left:-350px; margin-top:-250px;*/ } </style> </head> <body> <div class="main">第1个固定</div> </body> </html> 定位效果: 最终效果:

【Mac OS】brew的安装和使用

Homebrew是一款Mac OS上的软件包管理工具,通过它可以很方便的安装/卸载软件工具等,类似于Linux下的apt-get,node的npm等包管理工具。 Homebrew将工具安装在自己创建的/usr/local/Cellar目录下,并在/usr/local/bin建立这些工具的符号链接。 安装brew 打开终端,执行下面的命令。 /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” Mac OS默认安装了ruby,通过ruby可以成功安装Homebrew。 使用命令 通用类 brew search [TEXT|/REGEX/] 搜索软件 brew (info|home|options) [FORMULA…] 查询软件信息 brew install FORMULA… 安装软件 brew update 更新brew和所有软件包 brew upgrade [FORMULA…] 更新软件包 brew uninstall FORMULA… 卸载软件包 brew list [FORMULA…] 罗列所有已安装的软件包 brew outdated 查看哪些软件包需要更新 brew deps FORMULA 显示包依赖 帮助类 man brew 查询brew命令的使用手册 brew help [COMMAND 查询brew子命令的使用帮助,如brew help search 排查类 brew config 查看brew的全局配置 brew doctor 检查系统的潜在问题 brew install -vd FORMULA 安装软件包打印详细信息,并开启debug功能。 开发者类 brew create [URL [—no-fetch]] 创建软件包 brew edit [FORMULA…] 编辑软件包源码 更多命令使用查看文档:https://docs.

android 简单的贪吃蛇小游戏

贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单。 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式。 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 width 高为 height ,列数 sizex=width/pointSize ,行数 sizey=height/pointSize. 由于画布的长宽不一定是pointSize的整数倍,所以为了所有的数据居中需要设置 x轴 y轴的偏移量(当前貌似偏移量可有可无,本人强迫症一定要加上),offsetX=(width - sizex*pointSize)/ 2,offsetY=(height - sizey*pointSize) / 2. 新建数组 spoints=new int[ sizex ][ sizey ] 用于保存方格矩阵 其中 spoints[x][y]==1说明该点属于当前小蛇身体的一部分, spoints[x][y]==0则表示小蛇当前未运动到此点。 新建 ArrayList<Point> points=new ArrayList<Point>(); 用于保存小蛇的身体的所有节点(points 中的 所有point的x,y对应的是 spoints数组的所有值为1的点的下标),points.get(0) 为头部坐标点,最后一个为尾部坐标点 上面两幅图片代表的意思相同,都表示小蛇的当前状态(小蛇画的比较丑,请见谅) 下面开始考虑的小蛇的移动,小蛇的移动可以看成是将小蛇的尾巴的移动到小蛇的头部(根据方向判断移动的上下左右位置),其他的节点保持不动,见图示 得到下图运动后的状态 然后修改spoints数组对应的坐标的值,新增的头部对应的值修改为 1,移除的尾部的值修改为 0. 并将对应的坐标点加入points链表的对应位置,移除尾部的坐标点 解决了小蛇的移动问题,再来解决小蛇吃食物点的问题。 当小蛇吃到食物的时候,相当于将食物的点当成新的头部,而尾部不变,这样就相当于吃了之后变长了 这样就完成了小蛇的增长。 没有代码那就是耍流氓!!下面开始贴代码 git代码下载: 贪吃蛇 https://gitee.com/wuchang0213/TCS.git csdn下载:https://download.csdn.net/download/weixin_41191134/10832869 再提供一个数独小游戏的下载:https://download.csdn.net/download/weixin_41191134/10832903 只贴了要的游戏界面的代码 public class TcsView extends View { private Paint paint; //小蛇的组成点 private ArrayList<Point> points=new ArrayList<Point>(); private Point pointFood=new Point();//食物点 //游戏界面的 方格划分 private int[][] spoints; //方格数组的大小 private int sizex; private int sizey; //小蛇的头部对应在数组中的位置 private int headerX; private int headerY; //食物的坐标点 private int foodX; private int foodY; //偏移量 private int offsetX=0; private int offsetY=0; //随机数 private Random random=new Random(); private boolean isStart=true; //屏幕宽高 private int width; private int height; //小蛇方块的大小 private int pointSize=20; //方向 private int direction=0;// 0 上 -1 下 1 左 2 右 //触摸点坐标 private float tdx; private float tdy; private boolean isStop=false; private TcsScoreListener tcsScoreListener; private Handler handler=new Handler(new Handler.

H5页面监听Android物理返回键

Android物理返回键的点击事件,一般webview的默认行为是 window.history.go(-1) ,但是在实际需求场景下,简单的页面回退并不能满足需求,所以需要H5页面监听Android物理返回键从而自定义处理方法。 本方案的代码都在 h5_android_back 仓库中 原理 主要是运用 HTML5 History API 实现。所以,首先简单介绍下 HTML5 History API HTML5 History API history 属性 history.length history.state 复制代码 history 方法 history.back() history.forward() history.go() 复制代码 HTML5 新API history.pushState(state, title, url); 添加一条历史记录,不刷新页面 history.replaceState(state, title, url); 替换一条历史记录,不刷新页面 事件 popState事件:历史记录发生变化时触发,调用history.pushState()或history.replaceState()不会触发此事件 window.addEventListener('popstate', handlePopstate); 复制代码 hashchange事件:页面hash值发生改变时触发 window.addEventListener('hashchange', handleHashChange); 复制代码 监听Android物理返回键实现 // index.js (function (pkg) { var STATE = '_android_back'; // 维护处理方法的栈 var _android_back_handles = []; // 触发一次popstate方法,则调用最新处理方法 var handlePopstate = function () { var handle = _android_back_handles.

【MySQL】多表查询、分组求和、并对和排序、取top n

查漏补缺MySQL的相关知识 1. 有一个用户资金流水表(如上的sql代码),找出流水金额最多的前10个用户:2. 查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录。3.TOP 14.TOP N5.LEFT JOIN后面的on和where的区别 1. 有一个用户资金流水表(如上的sql代码),找出流水金额最多的前10个用户: create table tb_user_finance ( id bigint primary key auto_increment, uid bigint not null default 0 comment '用户id', money decimal(10, 2) not null default 0.00 comment '资金流水', type tinyint not null default 0 comment '1: 转账, 10: 提现, 20: 充值', created_at timestamp not null default current_timestamp, updated_at timestamp not null default current_timestamp on update current_timestamp, key ix_uid (uid) ) engine = innodb default charset=utf8 comment '用户资金流水表'; insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 200, 1); insert into tb_user_finance (uid, money, type) values(20, 10, 10); insert into tb_user_finance (uid, money, type) values(30, 20, 20); insert into tb_user_finance (uid, money, type) values(30, 10, 20); insert into tb_user_finance (uid, money, type) values(31, 10, 20); insert into tb_user_finance (uid, money, type) values(32, 20, 20); insert into tb_user_finance (uid, money, type) values(33, 45, 20); insert into tb_user_finance (uid, money, type) values(34, 100, 20); insert into tb_user_finance (uid, money, type) values(35, 1000, 20); insert into tb_user_finance (uid, money, type) values(36, 1090, 20); 答案:

d3.js学习笔记(2)使用比例尺和坐标轴绘制网格线

参考 https://bl.ocks.org/mbostock/db6b4335bf1662b413e7968910104f0f 实现了网格线 他的思路是把d3中坐标轴的标记线延长到覆盖整个绘图区域,也就是修改ticks(),我觉得这样很巧妙 在我读过的各篇文章里,关于d3坐标轴的ticks()大都语焉不详 首先坐标轴要对应一个比例尺d3.scale(),比例尺包含了domain()和range(),其中domain对应的是原始数据,就是要分析的数据,range()对应的是屏幕显示的数据,也就是像素。scale比例尺负责把原始数据映射到屏幕上,或者可以理解为domain是定义域,range是值域 坐标轴仅显示比例尺中的range(),超出range()的部分是不显示的,也就是不包含在坐标轴里的 然后ticks()是设定整个坐标轴上到底要有几个标记,而不是标记之间的间隔,标记上显示的文字是比例尺的domain()值 通过设定tickSize()使其覆盖整个显示区域就可以用ticks绘制成网格线。在参考案例中还提供了透明度选项,可以避免网格线影响实际数据的呈现 因为这是vue单文件组件内的函数,所以this对应的是上下文组件,其中的数据都是在data中定义的 drawAxises () { this.axises.x = d3.axisBottom().scale(this.axises.xScale) this.axises.y = d3.axisRight().scale(this.axises.yScale) this.axises.x.ticks((this.width + 2) / (this.height + 2) * 10) .tickSize(this.height) .tickPadding(8 - this.height) this.axises.y.ticks((this.width + 2) / (this.height + 2) * 10) .tickSize(this.width) .tickPadding(8 - this.width) this.axises.xContainer = this.axises.node.append('g') this.axises.xContainer.attr('id', 'xaxis').classed('axis', true).style('font-size', '20px') this.axises.xContainer.call(this.axises.x) // this.axises.x(this.axises.xContainer) this.axises.yContainer = this.axises.node.append('g') this.axises.yContainer.attr('id', 'yaxis').classed('axis', true).style('font-size', '20px') this.axises.yContainer.call(this.axises.y) // this.axises.y(this.axises.yContainer) }, 参考里还提供了用渐变svg图作为背景图片,不过我在vue中无论如何也无法插入,实现不了,如果有谁能实现,请留言,不胜感激

C#实战027:socket实现大文件传输

前面写了一个单文件传输的,后来发现当传送的文件大于设置的缓存空间时,文件就会出现丢包的现象,导致文件无法使用,所以为了适应大文件的传输,这里我将代码进行了下修改,实现大文件传输。 不过socket实现大文件传输有个缺点,由于传输过程是通过字节缓存发送,接受也是读写字节,导致整个传输过程效率不高,我尝试了一个169MB的视频文件传输,虽然传完了,但是耗时将近1小时。 因为计算机缓存有限,所以不可能开启太大的缓存来缓存数据的,所以当我们要发送文件较大的文件时我们就要进行分段处理,分段读取,分段发送保存。大家可以看到我们的两个窗口都是同步的,一遍在读取中,一遍就在写入中。如此反复的使用同一块缓存进行数据传递。 首先我们先进行循环读取文件信息,这里有个重要的就是做好标记,之前写 C#实战026:socket实现单文件传输时就有提到,通过在第一个字节做标记来区分我们传送的信息是什么信息,这个规则自己定义,只要客户端和服务端同步即可 这里我们把0定义成信息发送,1定义成文件发送,2定义成文件头信息发送 首先我们先需要把我们要发送的文件信息抛给服务器,这里主要需要文件的文件名和文件大小,这里我们只要在用文件流读取文件的时候将这些数据提取出来即可: //1. 第一步:发送一个文件,表示文件名和长度,让客户端知道文件大小 string fileName = Path.GetFileName(filePath);//提取文件名 Console.WriteLine("发送的文件名是:" + fileName);//查看获取文件名是否正确 long fileLength = fsRead.Length;//获取文件长度 Console.WriteLine("发送的文件长度为:"+fileLength);//查看文件长度是否正确 string totalMsg = string.Format("{0}-{1}", fileName, fileLength);//将文件名和文件长度存入一条数据中 byte[] buffer = Encoding.UTF8.GetBytes(totalMsg); //将字符串转换成字节数组 byte[] newBuffer = new byte[buffer.Length + 1];//新建字节数组,增加一个字节空间 newBuffer[0] = 2;//将第一个字节标记成2,代表为文件头信息 Buffer.BlockCopy(buffer, 0, newBuffer, 1, buffer.Length);//偏移复制字节数组 socketClient.Send(newBuffer);//发送文件文件名和长度发过去 既然是循环写入,我们就要记录当前文件的数据大小和已读取的数据信息,这样循环才有终点,定义一个5M缓存区。 byte[] Filebuffer = new byte[1024 * 1024 * 5];//定义5MB的缓存空间(1024字节(b)=1千字节(kb)) int readLength = 0; //定义读取的长度 bool firstRead = true;//定义首次读取的状态 long sentFileLength = 0;//定义发送的长度 接下里解释对文件进行分包发送了,这里唯一要注意的就是第一次发送的时候要为文件价格标记,也就是第一个数据包前加标记,这样服务端才好去识别该数据是什么数据,然后做对应的处理。

HUSTOJ分布式在多台虚拟机上部署判题机

实现分布式其实就是通过部署多个oj在不同虚拟机上,让多个判题机同时访问一个数据库。 所以就需要一个oj(A oj)贡献它的数据库让其他judger轮!! 在A oj 上,进入mysql,执行如下命令,赋予judge远程访问jol数据库的权限,并且设置密码为judge_pass GRANT ALL PRIVILEGES ON jol.* TO 'judge'@'%' IDENTIFIED BY 'judge_pass' WITH GRANT OPTION; flush privileges; 并且检查/etc/mysql/my.cnf 确保 bind-address = 0.0.0.0max_connections = 512 然后我们再 B 、C、D.....oj上 ,配置judge.conf vim /home/judge/etc/judge.conf 实际情况修改前三个就行了 。分别时 Aoj 的ip 和MySQL远程连接的账户和密码,后面OJ_HTTP_USERNAME默认时IP, 如果不想ip暴露在状态页可以随便起名 修改完成后我们要将A oj的测试数据传到B、C。。。oj上 这里要确保两台虚拟机上都装了ssh 如果不确定可以 执行如下命令查看是否有ssh 没有的话,就执行 如下命令安装ssh sudo apt-get install openssh-server 安装完后启动 service ssh start 接下来有4种方式课选,将Aoj的数据复制到其他oj上 可以在Aoj上执行如下命令任一条 scp -r /home/judge/data root@判题机ip:/home/judge/ 或用同步命令。 rsync -vzrtopg --progress --delete /home/judge/data root@判题机ip:/home/judge/ 或在B、C。。。oj上执行下面任意一条

Kubernetes编排Kafka Docker镜像l的方式搭建集群

本文基于已经安装了k8s和docker的情况下进行的 k8s 编排kafk容器可以有statefulset和deployment两种方式。分别是有状态和无状态的,具体区别可以百度一下,这里只介绍集群搭建的方法。 需要先准备若干yml配置文件(文件名自己定义,不固定),上传到linux机器的任意文件夹里(比如home下面自己创建一个k8skafka文件夹) 第一种:statefulset集群编排 1.PV.yml用于创建statefulset所需要的持久卷pod, apiVersion: v1 kind: PersistentVolume metadata: name: kafkapv1 annotations: volume.beta.kubernetes.io/storage-class: "anything" labels: pv: kafkapv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle # storageClassName: "" hostPath: path: /opt/pv/kafka1 --- apiVersion: v1 kind: PersistentVolume metadata: name: kafkapv2 annotations: volume.beta.kubernetes.io/storage-class: "anything" labels: pv: kafkapv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle # storageClassName: "" hostPath: path: /opt/pv/kafka2 --- apiVersion: v1 kind: PersistentVolume metadata:

Vue tree 懒加载(结合联动情况)

一、官方实例 由于在点击节点时才进行该层数据的获取,默认情况下 Tree 无法预知某个节点是否为叶子节点,所以会为每个节点添加一个下拉按钮,如果节点没有下层数据,则点击后下拉按钮会消失。同时,你也可以提前告知 Tree 某个节点是否为叶子节点,从而避免在叶子节点前渲染下拉按钮。 代码实例 <el-tree :props="props1" :load="loadNode1" lazy show-checkbox> </el-tree> 一定要设置lazy属性,并且在点击展开的时候调用load对应的方法 展示一级菜单可以采用两种形式: 使用data属性:data=“directories.dataList”,这种方式适合联动处理,比如选择一个下拉框然后才展示一级菜单。在load方法中获取。 1.1、data属性加载 if(node.level===0){ return resolve(this.directories.dataList); } 在联动的情况下,在符合条件,并且要取tree数据的情况,给directories.dataList赋值,tree自动回加载一级菜单,然后再load方法中加上上面的代码进行兼容。 1.2、load方法加载 if(node.level===0){ return getFirstDirectoriesData(node, resolve); }else{ this.getNextDirectoriesData(node, resolve); } 这个适合非联动情况。 第一次加载的时候调用getFirstDirectoriesData获取数据。 下面每次加载的时候调用getNextDirectoriesData获取数据。 获取数据大致是这样 this.$axios.post(url, self.directories.nextSearchCondition).then((res) => { res = res.data; if(res.success){ return resolve(res.data.directories); }else{ self.$message.error(res.message); return resolve([]); } },(res)=>{ self.showInternalError(res); return resolve([]); });

Selenium

WebDriverWait https://blog.csdn.net/duzilonglove/article/details/78455051 坐标移动 //移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element); //移动到元素element对象的“底端”与当前窗口的“底部”对齐 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", element); //移动到页面最底部 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)"); //移动到指定的坐标(相对当前的坐标移动) ((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 700)"); Thread.sleep(3000); //结合上面的scrollBy语句,相当于移动到700+800=1600像素位置 ((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 800)"); //移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1600)"); Thread.sleep(3000); //结合上面的scrollTo语句,仍然移动到纵坐标1200像素位置 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1200)");

unittest单元测试笔记

单元测试 unittest单元测试是基于java的JUnit思想框架开发出来的测试框架 import unittest import HTMLTestRunner class Mytest1(unittest.TestCase): def test_a(self):#用例必须已test开头 self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个') print('a') def test_c(self): self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码 print('c')#这条代码不会执行 def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z self.assertEqual(4,4) print('z') def test_G(self): self.assertEqual(3,3) print('G') #unittest.main()#运行所有函数 #unittest.defaultTestLoader.discover()#可以指定一个文件夹,在指定目录下找到测试用例 f = open('a.html','wb')#创建文件 runner = HTMLTestRunner.HTMLTestRunner(f,title='rainbol_test',description='这是一个接口测试用例')#实例化用例报告,并传入文件,title标题,description描述 suite = unittest.makeSuite(Mytest1)#把要生成报告的类变成一个测试集合, runner.run(suite)#运行测试用例 import BeautifulReport #美化报告 class Mytest2(unittest.TestCase): def test_a(self): '''test_a用例'''#添加用例描述,可以在测试报告中显示 self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个') def test_c(self): '''test_c用例''' self.assertEqual(1,2,msg='失败') print('c') def test_z(self): '''test_z用例''' self.assertEqual(4,4) print('z') new_suite= unittest.makeSuite(Mytest2) report = BeautifulReport.BeautifulReport(new_suite) report.report(filename='new_report.html',description='这个是新接口测试报告') class Mytest3(unittest.TestCase): def setUp(self):#每条用例前执行,比如检测接口连接是否正常 print('setUp') def tearDown(self):#每条用例后执行,比如清理缓存,cookie,redis的信息 print('tearDown')

SSH登录慢的解决方案(例如等待很久才提示输入密码)

安装linux系统后我们经常会遇到的一个情况是telnet到server速度很快,但是ssh连接的时候却很慢,大概要等半分钟甚至更久。ping的速度也非常好,让人误以为是ssh连接不上。 本人在得到公司分配的服务器A后就遇到了这样的问题,具体现象如下: 1、ping服务器A反馈时延正常。 2、使用ssh连接服务器A要等待10秒后才显示连接对话框。 3、在服务器A上使用route命令查看路由要等待10秒后才显示路由内容。 4、对外进行https访问时,DNS解析或要等待10秒后才能进行正常的http访问。 在网上查了大量的资料得知可能是由于DNS解析的问题导致的,具体为server的sshd会去DNS查找访问client IP的hostname,如果DNS不可用或者没有相关记录,就会耗费大量时间。 正常情况下默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名。如果这个时候 DNS 的反向解析不正确,sshd 就会等到 DNS 解析超时后才提供 ssh 连接,这样就造成连接时间过长、ssh 客户端等待的情况,一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件(sshd_config)里取消 sshd 的反向 DNS 解析。 # vi /etc/ssh/sshd_config UseDNS no # systemctl restart sshd 如果没有这种配置项,可以直接把DNS服务禁掉,如下: # cat /etc/resolv.conf # Generated by NetworkManager #search openstacklocal #nameserver xxxx.xxxx.xxxx.xxxx #nameserver xxxx.xxxx.xxxx.xxxx 也可以在server上/etc/hosts文件中把你本机的ip和hostname加入。另外在authentication gssapi-with-mic也有可能出现问题,在server上/etc/ssh/sshd_config文件中修改GSSAPIAuthentication no。修改server上/etc/nsswitch.conf中hosts为hosts: files。reboot server使配置生效 对于nsswitch.conf这个文件需要单独解释下。一般情况下里面默认会这么写:hosts: files dns。这行的含义是对于访问的主机进行域名解析的顺序,是先访问file,也就是/etc/hosts文件,如果hosts中没有记录域名,则访问dns,进行域名解析,如果dns也无法访问,就会等待访问超时后返回,因此等待时间比较长。那如果将这一行屏蔽掉是不是也可以达到同样的效果呢?应该是可以的,但是如果本机要通过域名访问其他服务器,则肯定无法访问,因此这行应该需要保留。这个问题也提示我们,dns如果不可用,会带来的一些副作用的。 解决方案总结: 1、在server上/etc/hosts文件中把你本机的ip和hostname加入; 2、在server上/etc/ssh/sshd_config文件中修改或加入UseDNS=no; 3、注释掉server上/etc/resolv.conf中所有行或清空; 4、修改server上/etc/nsswitch.conf中hosts为hosts: files。 方案1、2、3为较为常用,一般情况下不太会对系统产生影响,4因为涉及DNS的使用故此建议在1、2、3方法均不可用的情况下再使用。

线段树专题

单点修改区间求和 区间修改区间求和 区间修改区间最大 区间加乘区间最大

VIM使用教程

文章目录 一、什么是VIM二、VIM入门三、常用命令介绍1. 移动2. 选择3. 复制4. 粘贴5. 删除(剪切)6. 撤销7. 恢复8. 查找9. 替换(修改)10. 缩进11. 标记12. 查看历史13. 进入插入模式14. 进入底行模式15. 其他tips 一、什么是VIM 在说vim之前,先说下什么是vi。vi是visual interface的简称,是Linux中最经典的文本编辑器。vi的核心设计思想是:让程序员的手始终保持在键盘的核心区域就能够完成所有的编辑操作。而Vim又是从 vi 发展出来的一个文本编辑器,即vi improved,它在代码补全、编译及错误跳转等方便编程的功能上特别丰富,在程序员中被广泛使用。 为方便理解,也给出上图的英文版 从这张图就可以看出,vim的命令繁多,不过灵活使用后将会大大提高效率。对于新手可先不必理会上图,下文会把常用的使用方法一一道来,助你入门。 二、VIM入门 首先你要明白的一点是,VIM有3种主要的工作模式: 命令模式(Command mode) 用户启动vim时,首先进入的便是命令模式。命令模式可认为是vim的入口,此模式下敲击键盘的字符都会被当做命令,而非在文本中插入字符。比如,我想打出我的名字kevin,我敲下键盘上的 k k k键,屏幕上并不会显示出 k k k字符,事实上,屏幕上什么反应也没有。这时候,不要怀疑电脑坏了,而是你并没有进入插入模式,暂时还不能进行插入的操作。那命令模式下都有哪些命令呢?诸如移动、选择、复制、粘贴、删除、查找、替换、缩进、撤销、恢复、定位、翻页……都是在命令模式下完成的。关于这些命令后面还会介绍,这里大家先掌握进入插入模式的命令之一:i。当在命令模式下输入i后,便进入了插入模式,然后就可以正常地编辑文字了。插入模式(Insert mode) 此模式下可以正常地编辑文字,与平时使用习惯差别不大。底行模式(Last line mode) 此模式下可以执行保存、退出以及其他的一些功能。按下Shift+:即可进入底行模式。输入wq为保存退出,输入q!为不保存退出。 此外,还有其他一些模式,如可视模式(Visual)、替换模式(Replace)等,将会在下文进行介绍。 三、常用命令介绍 1. 移动 方位移动 h:光标左移一格 j:光标下移一格 k:光标上移一格 l:光标右移一格 当然,关于上下左右的移动使用方向键也是允许的。行内移动 0:光标移至行首 $:光标移至行尾 ^:光标移到当前行的第一个非空字符 g_:光标移到当前行的最后一个非空字符 b:光标到上一个字的开头 w:光标到下一个字的开头 e:光标移到下一个字的结尾 ge:光标移到上一个字的结尾 fa:移到下一个a出现的位置('F’与之相反) ta:移到下一个a出现位置的前一个位置(‘T’与之相反)行间移动 G:光标移至文末 gg:光标移至开头 Ngg或NG:光标移至N行开头语义移动 (:光标移至上一句首 ):光标移至下一句首 {:光标移至段首 }:光标移至段尾屏幕移动 H:将光标移到屏幕的最顶行

爬取知乎热榜查看热度

import requests from bs4 import BeautifulSoup headers = { 'cookie': 'l_n_c=1; q_c1=53034a3f0f514d0f938d2abb4ef4c40a|1543457812000|1543457812000; _xsrf=02cc66747d2794664e1b0a4482b23c4b; n_c=1; d_c0="ANChDPljlw6PTnVZzzoSTjhGb06X2kSFBH0=|1543457814"; _xsrf=oL0XsM0vxNY9rSPgS9XhS2mwZXEVIbkw; _zap=2ba9ae00-8fc4-424b-b0f1-04a4d0ca551a; __utmc=51854390; __utmz=51854390.1543457815.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=51854390.000--|3=entry_date=20181128=1; __utma=51854390.1640548042.1543457815.1543457815.1543481275.2; l_cap_id="OTIwODAxMTFjYzUwNDY0ZjkwZDA3YTc5MzQ4MjMzNjM=|1543482775|d517a90435b8e80e591b4aa7d2e453bec5c8f85b"; r_cap_id="YzQ2M2ZjODRlZDJjNDFkY2FmZWI0NzBhOWRmNzUwNTI=|1543482775|049d6cbae1f611a8c7d6794a4513aeee71019e86"; cap_id="NDYzODk2MjE1NjdlNGJjNmFjNTU0ZGM2ZmNhZmRiNTc=|1543482775|90ce66a3790977d948794b2515492d3cb6fc5984"; tgw_l7_route=29b95235203ffc15742abb84032d7e75; capsion_ticket="2|1:0|10:1543558349|14:capsion_ticket|44:MDNjNGRiNTQxNTgzNGI0ZmI4ZjY1MjAxMWM2OWQzNGQ=|12de9ab789bd31818cb5ead3d804d3e6a549b1e1e057761cae503036a4d36a96"; z_c0="2|1:0|10:1543558362|4:z_c0|92:Mi4xa0tBaURRQUFBQUFBMEtFTS1XT1hEaVlBQUFCZ0FsVk4yaUx1WEFDUTBsZGdJeGZZSXlOVXhPZG5wZnBkZTRuVWdR|89dd9d24561fb32c119eccb8e6577224486893a8e357bca10e0c1f721355f8c9"; tst=h; __gads=ID=ba9a29eca6fca2d0:T=1543558671:S=ALNI_MZ4glJtx3a90tkC9gFG1rIowv4lfQ', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } proxies = { } r = requests.get('https://www.zhihu.com/hot',headers=headers,proxies=proxies) soup = BeautifulSoup(r.text,'lxml') # print(soup.prettify()) i=1 for title in soup.find_all(attrs={'class':'HotItem-content'}): print('Number '+str(i)) print(title.a.h2.string) if title.a.p : print(title.a.p.string) print(list(enumerate(title.div))[1]) i=i+1 print('-------------------------------------------')

Mac如何共享wifi热点

共享热点 Mac 如何共享 wifi 热点,以供其他设备使用,比如手机端。 一、打开共享设置 打开 系统偏好设置,点击 共享 二、设置共享来源 1、点击 互联网共享(先不要勾选),设置右边选项。如下图: 2、设置完成之后点击 Wi-Fi选项,进入下一步设置。 三、设置 Wi-Fi选项 设置 wifi 密码 等。如下图 四、启动互联网共享 设置完成后,勾选 互联网共享,以确定启动。 五、手机连接 用手机连接 Mac 共享的 WiFi,找到网络(名字是你的电脑名),输入刚才设置的密码即可。 六、注意事项 Mac 共享热点支持有线连接、蓝牙连接的网络进行共享。 如果你的 Mac 本身是通过 wifi 来连接上网的,那就不能用这个 mac 做 wifi 热点了,因为 wifi 端口已经被占用。

爬虫之re模块

re模块 https://www.cnblogs.com/liuzhongchao/p/8351449.html pycharm一件转换 https://www.jianshu.com/p/7e55c0eb0d0f https://curl.trillworks.com/

Madagascar安装步骤

From jlq: https://www.cnblogs.com/jianglq/p/4820259.html @[TOC] Madagascar安装步骤 环境:linux 我用的是 ubuntu 15.04 步骤: 1 . 源码下载,两种方式: 1)到 http://sourceforge.net/projects/rsf/files/madagascar/ 下载最新版本的 madagascar 压缩包:madagascar-*.*.tar.gz,然后用tar -xzvf 的方式解压。 2)直接用命令下载: svn co https://rsf.svn.sourceforge.net/svnroot/rsf/trunk /usr/rsf 其中 /usr/rsf 是你存放Madagascar原代码的路径(目录)。 这两种方式各有优点,第一种方式下载速度较快些,第二种方式的优点一是代码都比较新,二是以后更新会更方便一些(直接在路径内输入 svn update 即可) 2 . 安装依赖 参考 http://www.ahay.org/wiki/Advanced_Installation#Ubuntu ubuntu15.04下可输入: sudo apt-get install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libavcodec-dev libcairo2-dev libjpeg-dev swig python-dev python-numpy g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev python-epydoc 其他版本基本都可从网页中找到解决办法。 3 . 安装前配置 转到保存代码的头目录下(如 /usr/rsf/madagascar-*.*) ./configure --prefix=/完整的安装路径 建立c++,fortran90等链接(前提是这些选项已在系统中存在): ./configure API=c++,f90 --prefix=/完整安装路径

Ubuntu18.04安装Google浏览器和ChromeDriver

安装GoogleChrome cd /tmp wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome* sudo apt-get -f install 安装ChromeDriver 点击Chrome菜单“帮助”-->关于“Google Chrome”查看Chrome版本号 打开ChromeDriver官方网站,选择对应版本下载 http://chromedriver.chromium.org/ Linux下,需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里(此处采用后者) 由于python3.6在/usr/bin目录下: 首先在命令行模式下进入其所在路经,然后移动 sudo mv chromedriver /usr/bin 最后,在终端输入chromedriver验证即可。

Ubuntu18.04安装Mysql没有提示设置密码

由于初次安装Mysql没有用户,所以也没有对应的密码,但是Mysql会初始化一组用户名和密码 sudo vim /etc/mysql/debian.cnf mysql -u debian sys-maint -p//此处出入文件内的密码 进入mysql: mysql>update mysql.user set authentication_string=password('123456') where user='root' and host='localhost'; mysql>update user set plugin="mysql_native_password"; mysql>flush privileges; mysql>quit; sudo service mysql restart

E:Could not get lock ......

E:Could not get lock ...... 出现原因是有另外一个程序正在运行导致资源被锁不可用 解决: sudo rm /var/cache/apt/archives/lock sudo rm var/lib/dpkg/lock

WCF入门教程

这一系列文章的内容是从MSDN中COPY过来的,讲述的是最简单的WCF程序示例:如何在控制台应用程序实现和承载WCF服务,以及如何创建、配置和使用WCF客户端。 文章主体可分为两部分,分别介绍服务器端和客户端的编程实现。细分的话,可以分为六项任务。 服务器端 定义WCF服务协定(任务一) 这是创建基本 Windows Communication Foundation (WCF) 服务和可以使用该服务的客户端所需的六项任务中的第一项任务。 创建基本 WCF 服务时,第一项任务是为与外界共享的服务创建协定,并在其中描述如何与该服务进行通信。 具体步骤为: 1、 创建新的控制台应用程序项目。 在“新建项目”对话框中,选中“Visual Basic”或“Visual C#”,并选择“控制台应用程序”模板,并命名为Service。 使用默认的位置。 2、将默认的Service 命名空间更改为 Microsoft.ServiceModel.Samples。 3、为项目提供对 System.ServiceModel 命名空间的引用:右击“解决方案资源管理器”中的“Service”项目,选择“添加引用”项,在弹出的对话框中的“.NET”选项卡里的“组件名称”中选择“System.ServiceModel”,然后单击“确定”。 下面是编程步骤: 1、为 System.ServiceModel 命名空间添加一个 using 语句。 using System.ServiceModel; 2、创建一个新的ICalculator 接口,并将 ServiceContractAttribute 属性应用于该接口,并将 Namespace 值设置为“http://Microsoft.ServiceModel.Samples”。 此命名空间指定该服务在计算机上的路径,并构成该服务的基址部分。 请注意,在通过采用方括号表示法的属性来批注接口或类时,该属性类可以从其名称中去掉“Attribute”部分。 [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator 3、在接口中创建方法声明,并将 OperationContractAttribute 属性应用于每个要作为公共 WCF 协定的一部分公开的方法。 [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2);

JS: (1)点击按钮切换状态

分别按编号和日期进行排序(仅有点击样式切换,无排序效果): html: <div class="sort-options clearfix"> <div class="option" data-sort=1>编号</div> <div class="option" data-sort=0>日期</div> <a class="bg-filter" href="options.html">筛选</a> </div> CSS: .sort-options { width: 100%; height: 0.68rem; line-height: 0.68rem; background: #b1000c; } .sort-options .option{ width: 2.5rem; float: left; color: #ffffff; text-align: center; font-size: 0.28rem; color: #fff; cursor: pointer; position: relative; } .sort-options .option::before, .sort-options .option::after { width: 2.5rem; height: 0.34rem; display: block; content: ''; background-repeat: no-repeat; background-size: 0.2rem; opacity: 0.7; } .sort-options .option::before{ background-image: url(.

.NET 开发从入门到精通

.NET 开发从入门到精通 摘要: .NET平台及其开发工具为今天的开发者提供了可靠、易用的平台,使得我们可以更加从容的面对Windows应用程序开发的挑战。本系列课程介绍微软基于.NET平台的开发工具Visual Studio .NET 2003和开发.NET应用程序的内容。阅读全文 posted @ 2010-10-24 14:24 山天大畜 阅读(16892) | 评论 (2) 编辑 第14讲:复杂的问题,一流的解决方案 摘要: 如何开发大型的工程项目,如何开发企业级的应用、如何进行组件化的开发,无论哪个问题都会让每一个开发人员的工作变得越来越复杂。本讲是“.NET开发从入门到精通”系列的最后一次,在此会为您介绍Visual Studio? .NET中一些独立的工具,和如何使用这些工具来帮助您解决开发过程中遇到的复杂问题。另外,我们还会介绍一些适用于.NET开发的设计模式。阅读全文 posted @ 2010-10-24 14:21 山天大畜 阅读(1380) | 评论 (0) 编辑 第13讲:深入ADO.NET开发—高级数据访问技术 摘要: 您是否想更深一步的了解ADO.NET,了解ADO.NET中更深入的知识?本讲为您讲述ADO.NET的高级数据访问技术,让您的应用程序具有更强的数据访问能力。阅读全文 posted @ 2010-10-23 00:30 山天大畜 阅读(3292) | 评论 (0) 编辑 第12讲:将安全隐患扼杀在摇篮之中——用Microsoft .NET来保护数据和应用程序的安全 摘要: 网络中存在着各种各样的威胁数据的安全隐患,你是否有信心来从容面对,尽可能的采取措施来维护应用程序的安全呢?本讲我们将为您演示.NET提供了怎样强大的、层次型的安全平台,安全的开发基于Windows的软件。阅读全文 posted @ 2010-10-20 23:36 山天大畜 阅读(795) | 评论 (0) 编辑 第11讲:提高Web应用程序的用户体验——使用智能客户端开发分布式的Windows Forms应用程序 摘要: Web应用程序具有很多越特性:例如易部署性和高可用性;但你是否曾经想象过怎样才能在不牺牲用户体验的同时获得Web应用程序的强大优势呢?本讲我将为大家演示如何使用智能客户端技术来开发Windows Forms应用程序。智能客户端技术不仅能够让应用程序具有丰富的用户体验,又能够具有Web应用程序的强大优势,让软件变得更加完美。阅读全文 posted @ 2010-10-18 23:57 山天大畜 阅读(1262) | 评论 (0) 编辑

【ECG理论篇】(3)AI实现心律失常判别:心电信号的波形识别与特征提取

心电图中的各个波形都包含了非常多的信息,例如RR间期可以反映心动周期的时限;相邻心动周期的 RR 间期的比值可以反映室性早搏;R 波和 S 波幅值的比值和 R 波和 S 波之间的时限可以反映房性早搏等异常情况,等等 所以识别这些波形以及提取相应特征对我们后续做心律失常的分类很重要。 我们在用算法做心律失常判别分类之前,有两个关键点: 第一步: 识别检测ECG信号中的波群(目前主要是先定位QRS波群,再依次定位其它波群)第二步: 对波群进行信号特征的提取(不同波形的不同状态展示了心脏的情况,所以提取这些波群的信号特征,是我们做分类判别的关键) 1.心电图波形 首先来学习认识一下心电图中各个波形的含义 一个正常的心电信号在一个周期内,是由P波,QRS波群以及T波组成 P波:代表心脏除极,一般呈现钝圆形,幅度约为0.25mV,持续时间为0.08~0.11s。 PR间期:指心房除极开始到心室除极开始的传导时间,一般是从P波开始到QRS波的起点,正常PR间隔时间为:0.12s-0.20s。 QRS:代表心室肌的除极产生的电位变化,是心电图中最高大,快速的波形。 T波:代表心室肌的复极 QT间期:代表心脏去极化和复极过程,即心室收缩的总时间。QT 间隔和心率相关,心率越快,QT 间隔越短,反之越长 RR间隔:是指连续两个心电周期 R 峰值间隔变化特征,是常用的心拍识别标准之一 2.心电信号的波形识别检测与特征提取 心电信号的波形识别,主要是指识别QRS波群(因为它最明显)。只有当正确检测到QRS复合波群之后,我们才能根据QRS波群来确定其它典型波群的特征和位置,为心律失常分类提供基础。 目前心电信号中QRS波群的检测主要有小波变换法,差分阈值法 等等 选哪个需要根据自己的方向来定,小波变换法的计算量较大。 Pan-Tompkins算法是最经典的, 具体哪个算法最好,要根据自己的方向来定。因为这里面涉及一些信号处理的知识,自己需要先学学,目前暂时不能详细叙述各个波群检测算法的原理 所以这里先待定填坑 确定了QRS波群之后,我们可以根据QRS波群来确定其它波(T波,P波,QR间期等等) 确定完这些波,我们就可以根据提取这些波的信号特征,为后期心律判别奠定基础 心电信号特征提取的常用方法包括:心电信号的时域特征、心电信号的变换域特征等方法。。。 心电信号的时域特征主要反映了心电信号的形态和直观特征,变换域特征是指分别从不同维度不同方向描绘心电信号,整合心电信号的时域特征和变换域特征就可以很好的描述心电信号啦。 具体的特征提取方法还有待研究,这里先待定填坑 ECG(心电)信号在波形检测完成之后会被分为多个心拍,不同的心拍类型应该被 分为特定的类别,这个过程就是心律失常的诊断和识别过程 参考文献: 可穿戴式心电监测模块的心律失常分类算法研究.卢莉莉 基于 LSTM 的心律失常分类研究.李雪

00005__VSCode__xml格式化代码插件

1 XML或HTML格式化代码缩进 安装插件:Vetur 2 格式化代码的快捷键如下 On Windows :Shift + Alt + FOn Mac: Shift + Option + FOn Ubuntu: Ctrl + Shift + I

input[type=file] 获取上传文件的内容

上代码: <input type="file" name="file" id="fileUpload"> jquery: $("#fileUpload").change(function () { console.log($("#fileUpload")[0].files); }); 打印结果: input file 读取文件内容 <!DOCTYPE html> <html lang="en"> <head> <title></title> <script src="js/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> if(typeof FileReader == "undified") { alert("您老的浏览器不行了!"); } function showDataByURL() { var resultFile = document.getElementById("fileDemo").files[0]; if (resultFile) { var reader = new FileReader(); reader.readAsDataURL(resultFile); reader.onload = function (e) { var urlData = this.result; document.getElementById("result").innerHTML += "<img src='" + urlData + "' alt='" + resultFile.name + "

java poi生成Excel并存到指定路径(简化版本)

之前写过java生成Excel,然后感觉还不够方便使用,就重新写了下方法, 现在只需要调用传参就ok啦, 是不是很方便呢 ? 需要引入的jar包: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import net.sf.json.JSONArray; /** * 生成Excel 并放到指定位置 *@param filepath 文件路径(要绝对路径) *@param filename 文件名称 (如: demo.xls 记得加.xls哦) *@param titlelist 标题名称list *@param zdlist 字段list *@param datalist 数据list (这里也可以改成List<Map<String,String>> 格式的数据) *@return 是否正常生成 *@throws IOException *@author: *2018年11月24日 上午11:40:39 * (titlelist 和 zdlist 顺序要一直, 要一一对应) */ public static boolean createExcel(String filepath,String filename,List<String> titlelist,List<String> zdlist,JSONArray datalist) throws IOException{ boolean success = false; try { //创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); // 建立新的sheet对象(excel的表单) HSSFSheet sheet = wb.

Android Material Design 之 BottomSheetBehavior

前面已经介绍了如何在地图上自定义Marker 和 Poi搜索 说实话录个视频真麻烦,还得转gif , 转就转吧图片还有大小限制 , 你说气人不 ! 看过前两篇地图相关的博客,应该可以看出来, 屏幕底部有个展示数据的列表 ,可以跟随手指拖拽、滑动, 这样的效果在高德地图app中见过, 饿了么点餐的时候好像也有 , 其实这是Google Material Design 的 BottomSheetBehavior 那BottomSheetBehavior 啥意思? 近几年Google大力提倡Material Design , 这是个设计规范 , 里面重新定义了各种UI的规则 , 什么CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout、RecyclerView、NestedScrollView.... 官方文档的地址 https://material.io/develop/android/components/bottom-sheet-behavior/ BottomSheetBehavior 是个底部动作条的意思 , 可以设置最小高度和最大高度 ,执行进入/退出动画,响应拖动/滑动手势等 滑动起来不要太流畅 , 光说文字看不出效果 , 先来张Google Map的实现效果吧 下面就开始来实现个类似的效果喽, 数据填充就用Poi搜索获取的数据 , 想要使用这个新的控件需要添加额外的依赖包 implementation 'com.android.support:design:27.1.0' 先看下布局文件吧 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <com.amap.api.maps.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" /> <android.support.v7.widget.CardView android:id="@+id/cardView" android:layout_width="match_parent" android:layout_height="

ab测试时报 apr_socket_recv: Connection timed out (110)

2019独角兽企业重金招聘Python工程师标准>>> 在目标服务器上执行 ulimit -n 999999 其他常规的服务器参数优化参考这 参考 ab发送post数据的方法 # post_loc.txt contains the json you want to post # -p means to POST it # -H adds an Auth header (could be Basic or Token) # -T sets the Content-Type # -c is concurrent clients # -n is the number of requests to run in the test ab -p post_loc.txt -T application/json -H 'Authorization: Token abcd1234' -c 10 -n 2000 http://example.

判断来路页面,决定显示哪一部分

var url = document.referrer; if(url.indexOf("addVehicle")>-1 ||url.indexOf("copyAddVehicle")>-1 ||url.indexOf("updateVehicle")>-1){ $("#vehicle").click(); } else if(url.indexOf("borrowvehicle")>-1 ||url.indexOf("vehicleuserecord")>-1){ $("#vehicleuse").click(); } else{ $("#collapseEquipment").collapse('show'); }

RepeatMasker使用

RM是library-based,通过相似性比对来识别重复序列,可以屏蔽序列中转座子重复序列和低复杂度序列(默认将其替换成N)。使用数据库Dfam和Repbase。 The Dfam database is a collection of Repetitive DNA element sequence alignments, hidden Markov models (HMMs) and matches lists for complete Eukaryote genomes. Repbase是由美国遗传信息研究所(GIRI)创建并维护,收录了转座子和其他重复序列及其注释信息。 本地安装RepeatMasker,除了需要RepeatMasker主程序外,还需要TRF(Tandem Repeats Finder)、序列搜索引擎(以RMBlast为例)以及Repbase数据库。 搜索引擎可以安装多个,但是每次只能用一个。 Using RepeatMasker to Identify Repetitive Elements in Genomic Sequences 要屏蔽的区域:low-complexity DNA sequences and interspersed repeats 比对引擎:cross_match WU-BLAST(更快) 如果DNA source没有参考基因组,那么需要用RECON或者RepeatScout建立一个Repbase类型的文件 安装: http://www.repeatmasker.org/RMDownload.html sequence search engine cross_match 要注册啥的,没搞 RMBlast blast的修改版本,此处用了2.2.28版本,需要下载http://www.repeatmasker.org/RMBlast.html 这里的两个binary,然后解压就可以了 HMMER 下载v3.1b2版本 ABBlast/WUBlast 也要注册啥的,没弄 TRF 下载TRF v4.0.4 Repeat database 下载Dfam和RepBase(要注册下载) 装完之后用./configure配置,修改好path就可以了。

从url获取参数

/** * 获取url参数值 */ function getQueryString(name) { var reg = new RegExp("(^|&|&%20)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } window.location.href="copyAddVehicle.html?vd="+vehicleid; var equipid = getQueryString("vd");

dubbo管理工具dubbo-admin安装使用

dubbo-admin是阿里巴巴的发布的dubbo管理平台 1.获取war 官方下载地址:https://github.com/alibaba/dubbo 获取到源码切到【2.5x】最新版本没有dubbo-admin子项目了,换成其他的了 获取到源码之后用mvn打包获取到dubbo-admin-2.5.10.war 下载我编译好的war(jdk1.8 ie下消费者没有显示chrome正常) 下载我编译好的war(jdk1.6) 2.启动 将war包解压(jar -xvf dubbo-admin-2.5.10.war)到tomcat webapps/ROOT 下(删除原有文件) 修改zookeeper服务地址WEB-INF/dubbo.properties 启动tomcat 3.访问 http://localhost:8080/ root/root 附:指定tomcat运行时JDK版本 windows 1、解压下载的tomcat; 2、找到bin下的setclasspath.bat文件;在文件的开始出添加如下代码: set JAVA_HOME=D:\Program Files\Java\jdk7\jdk1.7.0_51 set JRE_HOME=D:\Program Files\Java\jdk7\jre7 linux 在bin下找到setclasspath.sh,在文件的最开始加入如下代码: set JAVA_HOME=/home/jdk/Java\jdk7\jdk1.7.0_51 set JRE_HOME=/home/jdk/Java\jdk7\jre7 原文:https://blog.csdn.net/luo4105/article/details/70829489 https://blog.csdn.net/qq173684423/article/details/79553565 https://blog.csdn.net/MonkeyKing_1990/article/details/79182737

python(三)基于flask返回json数据接口:flask-sqlalchemy详细介绍

因为不关心前台页面的开发,前台工程师给我提供了一份json样式。让我实现,然后给出了筛选条件。还是接着上篇文章,将ORM这块仔细写写。这篇文章也将关于flask-sqlalchemy的总结,我会把用户遇到的格式问题都总结在这里面。我写博客的原则,用过什么写什么,没涉及的也不瞎写了。 首先看前台工程师给我提供的json返回格式样例。大概就是以song为对象的list,里面有嵌着多对多关系的歌手和一对多的版权 { "Songs": [ { "ID": 28, "artist": [ "吴克群" ], "lyric": "", "title": "大舌头" "copyrights": { "lyric": [ { "OP": "成果音乐版权有限公司", "SP": "", "disctrict": "", "endDate": "永久", "lyricists": "吴克群", "share": "50.0%", "startDate": "" } ] } } ], "paging": { "page-index": 1, "page-size": 20, "total": 25 } } 上篇文章的时候我已经将model层的代码粘了出来,这里再粘贴一次 from mock import db artist_songs = db.Table('artist_songs', db.Column('song_id', db.Integer, db.ForeignKey('songs.id')), db.Column('artist_id', db.Integer, db.ForeignKey('artists.id')) ) class songs(db.Model): __tablename__ = 'songs' id = db.

00004__VSCode__配置注释和自动提示

1 自动提示 按 ctrl+shift+p,在上面出现的框里输入c/cpp,点击C/Cpp:Edit Configurations项编辑配置文件 c_cpp_properties.json,里面很多是自动生成的,主要对应平台(Win32,因为是Windows)修改includepath和path 2 注释 击 ”F1“打开控制台,直接输入“用户代码”,选择下拉栏中“cpp.json(C++)”(根据不同的编程语言选择不同的json)文件

git 回退回滚取消提交返回上一版本

总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚. 这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的. 大致分为下面2种情况: 1.没有push 这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,准备取消提交,用到下面命令 reset git reset [–soft | --mixed | --hard 上面常见三种类型 –mixed 会保留源码,只是将git commit和index 信息回退到了某个版本. git reset 默认是 --mixed 模式 git reset --mixed 等价于 git reset –soft 保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可. –hard 源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码) 当然有人在push代码以后,也使用 reset --hard <commit…> 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit,index都没有变,当你把本地代码修改完提交的时候你会发现权是冲突… 所以,这种情况你要使用下面的方式 2.已经push 对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令 revert git revert用于反转提交,执行evert命令时要求工作树必须是干净的. git revert用一个新提交来消除一个历史提交所做的任何修改. revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题) revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看. git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61 通常,前几位即可 git revert c011eb3 git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit

Threejs ShapeGeometry自定义形状贴图

最近项目需要在3D场景中给自定义的楼层区域进行贴图区分,对于普通的的纯色材质,实现比较简单,但是如果要进行纹理贴图的材质,就有点复杂了,这里写篇文章记录下。 首先看看我们的楼层定义,如何实现自定义区域。其实很简单,我们使用有序的点来定义楼层的平面形状,然后根据平面的定义,自动生成3d的平面区域。 var areaPts = []; for (var idx = 0 ; idx < area.points.length; idx++) { var p = area.points[idx]; var v = new THREE.Vector2(p.px , p.py ); areaPts.push(v); } var areaShape = new THREE.Shape(areaPts); var geometry = new THREE.ShapeGeometry(areaShape); 如果是纯色的贴图我们怎么做,很简单直接设置颜色即可 var material = new THREE.MeshBasicMaterial({ color: color, side: THREE.DoubleSide, transparent: true, opacity: opacity }); var mesh = new THREE.Mesh(geometry, material); 对于贴图,我们使用同样的方法,看看会的到什么效果呢 var texture = new THREE.CanvasTexture(canvas); var material = new THREE.

使用Anaconda切换Python3.x环境与Python2.7环境

1、首先确保你的系统里已经安装了Conda,打开命令行窗口,执行命令:conda --version 2、查看你的系统当前已有的Python环境,执行命令:conda info --envs,从图中我们看到,我的机器里目前只有安装Anaconda时创建的默认Python环境,环境名称叫root,对应的Python版本是3.7 3、现在,我想添加一个Python2.7的环境,执行命令:conda create --name python27 python=2.7,命令中我制定了环境名称是python27,指定了Python版本是2.7,执行命令后,Conda会自动下载最新版的Python2.7,并自动部署 4、此时,再次查看你的系统当前已有的Python环境,执行命令:conda info --envs,从图中我们看到,这里多了一个名字为python27的Python环境 5、查看我们当前使用的Python版本,执行命令:python --version,从图中看到当前的Python环境是3.7版本 6、切换Python环境到刚才新添加的Python2.7,执行命令:activate python27,然后执行命令:python --version,查看是否切换成功,细心的同学会发现我上面敲的命令是在git bash里执行的,但切换的命令是在cmd里执行,这是因为我发现在git bash里执行没有用,不知道其他同学会不会。 7、在Python27环境下,完成工作后,切回原来的Python环境,执行命令:deactivate python27/ activate base 两个都可以 8、如果刚才添加的Python27环境,不再使用,可通过执行命令:conda remove --name python27 --all,进行删除

新手:webstorm如何用git在码云拉取项目,提交代码

1,在码云上新建项目,步骤不多说了 2,在webstorm点击VCS ->check out from version control ->git 点击clone就拉取项目成功啦,如何就可以开始写项目啦 3,提交代码 写完之后可以看左下角 也可以选中文件,右键Git -> +Add ,右键,Git -> commit file 4,把代码上传到码云 选中项目,右键Git ->Repository ->push