文件比较平常都是用Beyond Compare,可以说离不开的神器,特别是针对代码比较这块,确实挺好用的。
不过Beyond Compare平常拿它主要是用来做代码比较,用来做一些大批量的二进制文件比较,其实有点不是很方便。
于是造轮子,重新写了一个简单的文件夹比较的小工具。
平常主要是拿来做一些Nuget包的比对,应用包版本的比较。
文件夹比较逻辑,采用迭代比较的方式:
using CgdataBase; using FolderCompare.Models; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FolderCompare.Helpers { public static class CompareHelper { public static void CompareDirectory(CgDirectoryInfo path1, CgDirectoryInfo path2) { if (path1.Children.IsNullOrEmpty()) { if (path2.Children.IsNullOrEmpty()) { path1.Result = ECompareResult.匹配; path2.Result = ECompareResult.匹配; } else { path1.Result = ECompareResult.空; path2.Result = ECompareResult.孤立; SetCompareResult(path2, ECompareResult.匹配); } return; } if (path2.Children.IsNullOrEmpty()) { path1.Result = ECompareResult.孤立; path2.Result = ECompareResult.空; SetCompareResult(path1, ECompareResult.匹配); return; } var dirList = new List<string>(); var fileList = new List<string>(); dirList.AddRange(path1.Children.Where(s => s.IsDirectory).Select(s => s.Name)); dirList.AddRange(path2.Children.Where(s => s.IsDirectory).Select(s => s.Name)); fileList.AddRange(path1.Children.Where(s => !s.IsDirectory).Select(s => s.Name)); fileList.AddRange(path2.Children.Where(s => !s.IsDirectory).Select(s => s.Name)); var index = 0; if (dirList.HadItems()) { var items = dirList.Distinct().ToList(); items.Sort(); foreach (var item in items) { var dir1 = path1.Children.OfType<CgDirectoryInfo>().SingleOrDefault(s => s.Name == item); if (dir1 == null) { dir1 = new CgDirectoryInfo(); dir1.Result = ECompareResult.空; path1.Children.Insert(index, dir1); var dir2 = path2.Children.OfType<CgDirectoryInfo>().Single(s => s.Name == item); dir2.Result = ECompareResult.孤立; var old = path2.Children.IndexOf(dir2); path2.Children.Move(old, index); SetCompareResult(dir2, ECompareResult.匹配); } else { var dir2 = path2.Children.OfType<CgDirectoryInfo>().SingleOrDefault(s => s.Name == item); if (dir2 == null) { dir2 = new CgDirectoryInfo(); dir2.Result = ECompareResult.空; path2.Children.Insert(index, dir2); dir1.Result = ECompareResult.孤立; var old = path1.Children.IndexOf(dir1); path1.Children.Move(old, index); SetCompareResult(dir1, ECompareResult.匹配); } else { CompareDirectory(dir1, dir2); var old = path1.Children.IndexOf(dir1); path1.Children.Move(old, index); old = path2.Children.IndexOf(dir2); path2.Children.Move(old, index); } dir2.Index = index; } dir1.Index = index; index++; } } if (fileList.HadItems()) { var items = fileList.Distinct().ToList(); items.Sort(); foreach (var item in items) { var file1 = path1.Children.OfType<CgFileInfo>().SingleOrDefault(s => s.Name == item); if (file1 == null) { file1 = new CgFileInfo(); file1.Result = ECompareResult.空; path1.Children.Insert(index, file1); var file2 = path2.Children.OfType<CgFileInfo>().Single(s => s.Name == item); file2.Result = ECompareResult.孤立; var old = path2.Children.IndexOf(file2); path2.Children.Move(old, index); } else { var file2 = path2.Children.OfType<CgFileInfo>().SingleOrDefault(s => s.Name == item); if (file2 == null) { file2 = new CgFileInfo(); file2.Result = ECompareResult.空; path2.Children.Insert(index, file2); file1.Result = ECompareResult.孤立; var old = path1.Children.IndexOf(file1); path1.Children.Move(old, index); } else { CompareFile(file1, file2); var old = path1.Children.IndexOf(file1); path1.Children.Move(old, index); old = path2.Children.IndexOf(file2); path2.Children.Move(old, index); } file2.Index = index; } file1.Index = index; index++; } } path1.Result = GetCompareResult(path1.Children); path2.Result = GetCompareResult(path2.Children); } private static void CompareFile(CgFileSystemInfo info1, CgFileSystemInfo info2) { if (info1.Name.IsNullOrEmpty()) { info1.Result = ECompareResult.空; info2.Result = ECompareResult.孤立; return; } if (info2.Name.IsNullOrEmpty()) { info1.Result = ECompareResult.孤立; info2.Result = ECompareResult.空; return; } if (info1.Length == info2.Length && info1.LastWriteTime == info2.LastWriteTime) { info1.Result = ECompareResult.匹配; info2.Result = ECompareResult.匹配; } else { if (info1.LastWriteTime > info2.LastWriteTime) { info1.Result = ECompareResult.不匹配; info2.Result = ECompareResult.较旧的; } else { info1.Result = ECompareResult.较旧的; info2.Result = ECompareResult.不匹配; } } } private static void SetCompareResult(CgDirectoryInfo info, ECompareResult result) { if (info.Children.HadItems()) { foreach (var item in info.Children) { if (item is CgDirectoryInfo dir) { dir.Result = result; SetCompareResult(dir, result); } else if (item is CgFileInfo file) { file.Result = result; } } } } public static ECompareResult GetCompareResult(ObservableCollection<CgFileSystemInfo> items) { if (items.IsNullOrEmpty()) return ECompareResult.空; if (items.Any(s => s.Result == ECompareResult.不匹配 || s.Result == ECompareResult.较旧的)) return ECompareResult.不匹配; if (items.Any(s => s.Result == ECompareResult.孤立)) return ECompareResult.孤立; return ECompareResult.匹配; } } }
源码:http://gitee.com/wzwyc/FolderCompare
本教程操作环境:CentOS6.5系统、PHP7.1版、DellG3电脑。 修改linux时区时间和php时区 第一步,先修改硬件时区。vim/etc/sysconfig/clock复制将ZONE="America/New_York"注释,加多一行ZONE="Asia/Shanghai" 第二步,修改系统时区cp/etc/localtime/etc/localtime.bak rm-rf/etc/localtime ln-svf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime yuminstallntpdate-y ntpdate0.centos.pool.ntp.org date clock-w#将目前Linux的时间写到BIOS里面去! clock-r#检查BIOS里面的时间复制第三步,修改php.ini的时区设置date.timezone=PRC复制设置好后,最好重启下系统。
本文为joshua317原创文章,转载请注明:转载自joshua317博客https://www.joshua317.com/article/41maven安装以及配置确保JAVA_HOME环境变量已设置并指向JDK安装1.Windows下安装1.1下载maven,在apache官方网站可以下载。下载地址:https://maven.apache.org/download.cgi1.2解压文件,设置本地仓库路径1.2.1我的解压位置,根据自己情况进行设置C:\MyProgram\apache-maven-3.8.11.2.2定义本地仓库路径默认路径:${user.home}/.m2/repository,如:C:\Users\Administrator\.m2\repository自定义路径:C:\MyProgram\maven\repository1.2.3设置本地仓库路径和添加国内镜像修改C:\MyProgram\apache-maven-3.8.1\conf\settings.xml设置本地仓库路径:<localRepository>C://MyProgram//ma
选自huyenchip.com作者:ChipHuyen 机器之心编译 编辑:Panda实时机器学习正得到越来越广泛的应用和部署。近日,计算机科学家和AI领域科技作家ChipHuyen在其博客中总结了实时机器学习的概念及其应用现状,并对比了实时机器学习在中美两国的不同发展现状。与美国、欧洲和中国一些大型互联网公司的机器学习和基础设施工程师聊过之后,我发现这些公司可以分为两大类。一类公司重视实时机器学习的基础设施投资(数亿美元),并且已经看到了投资回报。另一类公司则还在考虑实时机器学习是否有价值。对于实时机器学习的含义,现在似乎还没有明确的共识,而且也还没有人深入探讨过产业界该如何做实时机器学习。我与数十家在做实时机器学习的公司聊过之后,总结整理了这篇文章。本文将实时机器学习分为两个层级:层级1:机器学习系统能实时给出预测结果(在线预测)层级2:机器学习系统能实时整合新数据并更新模型(在线学习)本文中的「模型」指机器学习模型,「系统」指围绕模型的基础设施,包括数据管道和监测系统。层级1:在线预测这里「实时」的定义是指毫秒到秒级。用例延迟很重要,对于面向用户的应用而言尤其重要。2009年,谷
导语本文旨在介绍一种简单,优雅,代码侵入性小的webworker引入方式。能够在不影响现有业务逻辑的情况下,快速为你的前端项目引入多线程能力。一、谈谈WebWorker众所周知,JavaScript引擎是单线程的,这意味着所有的操作都会在主线程当中发生。尽管浏览器内核是多线程的,但是负责页面渲染的UI线程总是会在JS引擎线程空闲时(执行完一个macrotask)才会执行。 JavaScript的事件队列模型这意味着如果页面当中包含某些计算密集的代码时,因为JS引擎是单线程的,会阻塞整个事件队列,进而导致整个页面卡住。而WebWorker就是为了解决这个问题而生的。这里引用一段阮一峰老师的定义WebWorker的作用,就是为JavaScript创造多线程环境,允许主线程创建Worker线程,将一些任务分配给后者运行。在主线程运行的同时,Worker线程在后台运行,两者互不干扰。等到Worker线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被Worker线程负担了,主线程(通常负责UI交互)就会很流畅,不会被阻塞或拖慢。二、多线程的力量我这
1CupertinoSwitchiOS风格的底部选项卡。通常和CupertinoTabScaffold一起使用2构造函数CupertinoTabBar({ Keykey, @requiredthis.items, this.onTap, this.currentIndex=0, this.backgroundColor, this.activeColor, this.inactiveColor=_kDefaultTabBarInactiveColor, this.iconSize=30.0, this.border=constBorder( top:BorderSide( color:_kDefaultTabBarBorderColor, width:0.0,//Onephysicalpixel. style:BorderStyle.solid, ), ), })复制3常用属性3.1onTap:点击事件onTap:(){},复制3.2currentIndex:当前选中的选项卡currentIndex:0,复制3.3backgroundColor:背景色backgroundColor:C
本文仅仅是提供测试使用的代码提供文件下载只需要返回PhysicalFile方法,如下面代码[HttpGet] publicIActionResultGet() { varfolder=Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); varfile=Path.Combine(folder,"bigfile"); conststringmime="application/octet-stream"; returnPhysicalFile(file,mime); }复制本文的bigfile是程序运行创建的垃圾文件privatevoidWriteBigFile() { varfolder=Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); varfile=Path.Combine(folder,"bigfile"); if(!File.Exists(file)) { usi
7.二维字符型数组#include<stdio.h> main() { chardiamond[][5]={{‘_’,’_’,’*’}, {‘_‘,’*’,’_’,’*’}, {‘*’,’_’,’_‘,’_‘,’*’}, {‘_’,’*’,’_’,’*’}, {‘_’,’_’,’*’}}; inti,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) printf(“%c”,diamond[i][j]); printf(“\n”); } }复制注:“_”代表一个空格。运行结果为:__*_*_**___*_*_*__*8.斐波那契数列#include<stdio.h> main() { inti,f[10]; f[0]=f[1]=1; for(i=2;i<10;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<10;i++) { if(i%4==0) printf(“\n”); printf(“%d”,f[i]); } }复制运行结果为:112358132134559.#include“stdi
作者寄语继续扩充昨天更新的资金流数据数据:个股资金流、个股资金流排名、大盘资金流、板块资金流排名更新接口"stock_individual_fund_flow"#个股资金流"stock_individual_fund_flow_rank"#个股资金流排名"stock_market_fund_flow"#大盘资金流"stock_sector_fund_flow_rank"#板块资金流排名资金流向个股资金流接口:stock_individual_fund_flow目标地址:http://data.eastmoney.com/zjlx/detail.html描述:获取东方财富网-数据中心-个股资金流向限量:单次获取指定市场和股票的近100个交易日的资金流数据输入参数名称类型必选描述stockstrYstock="000425";股票代码marketstrYmarket="sh";上海证券交易所:sh,深证证券交易所:sz输出参数名称类型默认显示描述日期strY-主力净流入-
来源:程序员私房菜(ID:eson_15)昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合。确实,经典的数据结构,包括排序算法,虽然我们平时不用手写了,但是这些内功,作为开发人员来说是必须要掌握的。受此启发,我打算更一下经典数据结构和算法的系列文章。今天先从栈和队列说起。这些东西,挤地铁时,吃饭排队时,等公交时,可以拿来看看,或者,就把它当作个下午茶吧~我们知道,在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。众所周知,栈是先进后出,只能访问栈顶的数据,队列是先进先出,只能访问头部数据。这里不再赘述。栈的主要机制可以用数组来实现,也可以用链表来实现,下面用数组来实现栈的基本操作:classArrayStack{ privatelong[]a; privateintsize;//栈数组的大小 privateinttop;//栈顶 publicArrayStack(i
函数功能socket():创建一个网络通信的endpoint(主动套接字),绑定协议族。connect():发起TCP三次握手bind():套接字绑定本地协议地址listen():a.把套接字设置为被动套接字;b.告诉内核允许为该套接字排队的最大连接个数。accept():返回已完成连接队列的队头read():读write():写close():套接字描述符的引用计数减1,如果引用计数为0则发起四次挥手。知识点connect()三种失败场景超时。对端主机在指定端口上没有进程等待连接。目的不可达(路由失败)。close()与发送队列调用close()之后,进程不能再使用该描述符。但是已经发送队列中的数据还是会继续发送,等到发送回再发起四次挥手。close()与shutdown()close()在套接字引用计数为0时,才发起四次挥手。shutdown()直接出发四次挥手。close()与多进程父进程fork出子进程处理已连接的套接字后,应该立即调用close()。避免父进程描述符耗尽,且客户连接都没有被珍重终止。一端调用close()后,另一端还在write()对端(假设为client)调
钉钉前端开发 钉钉一年半多,罗列一些常用的功能和网址,着重前端部分,毕竟前端开发哇。 希望有所帮助,有不足之处,希望指点下哈! 目前主要使用的是,第三方应用开发,大致感觉就是基于钉钉的H5页面,在钉钉中打开。 初步理解 先抛开钉钉官方推荐的NowaGUI开发工具,以及推荐saltUI样式库。大致理解如下。 那如果是不涉及到钉钉功能的常规H5页面,由管理员配置后台应用,添加对应链接即可。 如需要钉钉的功能,涉及到access_token(相当于一个许可)进行请求,具体如下,前端负责使用corpId调用钉钉接口将结果中的code返回给后端,后端去请求,将获取到的钉钉的access_token等信息返回。 具体步骤 首先得有这个项目的开发权限, 其次需要管理员,后台新建微应用,可以看到这个应用的corpId 前端要引入钉钉官方的js文件<scriptsrc="https://g.alicdn.com/dingding/open-develop/1.5.3/dingtalk-ali.js">
0.目录 C#6新增特性目录 1.在catch和finally块中使用await 在C#5中引入一对关键字await/async,用来支持新的异步编程模型,使的C#的异步编程模型进一步的简化(APM->EAP->TAP->await/async,关于C#中的异步编程模型的不是本篇文章的介绍重点,详细的资料请移步这里AsynchronousProgrammingPattern)。在C#5中虽然引入了await/async,但是却有一些限制,比如不能再catch和finally语句块中使用,C#6中将不再受此限制。 1usingSystem; 2usingSystem.Threading; 3usingSystem.Threading.Tasks; 4 5namespacecsharp6 6{ 7internalclassProgram 8{ 9privatestaticvoidMain(string[]args) 10{ 11do 12{ 13Log(ConsoleColor.White,"callermethodbegin",true); 14CallerMetho
上一篇博客(CI框架源码阅读笔记4引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的。这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架。 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识、把握这个框架。 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMark是CI中第一个加载的core组件,因此我们的分析首先从该组件开始。BenchMark的含义非常明确,使用过BenchMark工具的同学应该比较清楚,这是一个基准组件。既然是BenchMark,我们便可大胆猜想,BM组件的主要功能就是记录程序的运行时间、内存使用、cpu使用等情况。 先看类图: 这个组件结构较简单,只有一个marker内部变量和三个对外的接口: 1Elapsed_time 2Mark 3Memory_usage复制 下面一个个展开来
1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值。代码如下: //9.5.cpp:定义控制台应用程序的入口点。 #include"stdafx.h" #include<iostream> usingnamespacestd; template<classT1,classT2,intnum=10> classMyTemplate { T1t1; T2t2; public: MyTemplate(T1tt1,T2tt2) {t1=tt1+num,t2=tt2+num;} voiddisplay() {cout<<t1<<''<<t2<<endl;} }; voidmain() { inta=123; doubleb=3.1415; MyTemplate<int,double>mt1(a,b); MyTemplate<int,double,100>mt2(a,b); mt1.display(); mt2.display()
一.简介 1.简介 目前的版本是:4.72 2.注意事项 My97DatePicker目录是一个整体,不可破坏里面的目录结构,也不可对里面的文件改名,可以改目录名 My97DatePicker.htm是必须文件,不可删除 各目录及文件的用途: WdatePicker.js 配置文件,在调用的地方仅需使用该文件,可多个共存,以xx_WdatePicker.js方式命名config.js 语言和皮肤配置文件,无需引入calendar.js 日期库主文件,无需引入My97DatePicker.htm 临时页面文件,不可删除目录lang 存放语言文件,你可以根据需要清理或添加语言文件目录skin 存放皮肤的相关文件,你可以根据需要清理或添加皮肤文件包 当WdatePicker.js里的属性:$wdate=true时,在input里加上class="Wdate"就会在选择框右边出现日期图标,如果您不喜欢这个样式,可以把class="Wdate"去掉,另外也可以通过修改skin目录下的WdatePicker.css文件来修改样
树的直径与重心 树的直径求解方法一 思路 先选取一个点rt作为根节点,dfs去找到一个最长路径的点U,然后通过这个点去dfs,找到路径最长的点V,U->V就是这课树的直径。 证明正确性: 假如rt在直径上的话,最长路径的点U一定是直径的一个端点,这一点是显然的。 假如rt不在直径上,那么从这个点出发也一定可以找到一条路到达直径上一点,接下来就如同上面一样了,无非就是在真正的dis上再加上一段固定的value,对我们最后的直径端点查找并无影响。 代码 #include<bits/stdc++.h> usingnamespacestd; typedeflonglongll; constintN=1e5+10; inthead[N],to[N],value[N],nex[N],cnt; intn,ans,dis[N]; inlinellread(){ llx=1,s=0;charc; c=getchar(); while(c<'0'||c>'9'){ if(c=='-')x=-1; c=getchar(); } while(c>='0'&&
0.摘要 小时候在报纸上玩过数独,那时候觉得很难,前几天在leetcode上遇到了这个题,挺有意思于是记录下来 一般一道数独题,就像他给的例子这样,9*9的格子,满足行,列,宫均取1-9的数,切互不相同。 那一般正常人的思路会去一点一点的推理,至少我小时候就是这么玩的,具体来说,好比r7c9(第7行,第9列)的空格,我会找第7行有『6,2,8』,第9列有『3,1,6,5,9』,第9宫有『2,8,5,7,9』,这些的并集就是『1,2,3,5,6,7,8,9』,哦那么空格是4。就这么一点点继续往下推理。 1.余数法 他给的函数接口是这样 voidsolveSudoku(vector<vector<char>>&board){} 然后我就照着我小时候的思路写了一个版本 1voidsolveSudoku(vector<vector<char>>&board){ 2if(board.size()!=9||board[0].size()!=9) 3return; 4vector<vecto
<!DOCTYPEhtml><html><headlang="en"><metacharset="UTF-8"><title></title><scriptsrc="js/test.js"type="text/javascript"charset="utf-8"></script></head><body><button>按钮</button><buttononclick="func1()">跳转到红页面</button><buttononclick="func2()">关闭窗体</button><scripttype="text/javascript">window.onload=function(){alert("页面加载成功")}alert("你好")</script></body></html>复制 学无止境
importjava.util.*; publicclassMain{ publicstaticvoidmain(Stringargs[]){ Scannerscan=newScanner(System.in); Stringline; while(scan.hasNextLine()){ line=scan.nextLine().trim(); //pleasewriteyourcodehere Stringstr[]=line.split(","); intarr[]=newint[str.length]; for(inti=0;i<arr.length;i++)arr[i]=Integer.parseInt(str[i]); intsum=0; for(inti=0;i<arr.length-1;i++) for(intj=i+1;j<arr.length;j++) if(arr[i]>arr[j])sum++; System.out.println(sum); } } } 复制 不忘初心,方得始终。只有走