MEF和MEF微软官方介绍:http://learn.microsoft.com/zh-cn/dotnet/framework/mef/
MEF是轻量化的插件框架,MAF是复杂的插件框架。
因为MAF有进程隔离和程序域隔离可选。我需要插件进程隔离同时快速传递数据,最后选择了MAF。
如果不需要真正的物理隔离还是建议使用简单一点的MEF框架。
MAF其实是一项很老的技术,入门我看的是《WPF编程宝典》第32章 插件模型。里面有MAF和MEF的详细介绍和许多样例。
但是要深入理解还是看了很多其他的东西,下面我详细说明,我自己理解和总结的MAF。
MAF框架模式是固定的,这里做一个详细介绍。
首先是要添加几个新项目,下图中不包含主项目。
Addin文件夹是放置插件用的,其余都是必要项目。
假设HostView项目和主项目的输出路径是..\Output\
然后修改每个项目的输出文件夹,例如AddInSideAdapter项目输出路径可以设置为..\Output\AddInSideAdapters\
注意插件项目输出到Addin文件夹中的子文件夹是..\..\Output\AddIns\MyAddin\
最后项目的输出文件夹结构是:
D:\Demo\Output\AddIns
D:\Demo\Output\AddInSideAdapters
D:\Demo\Output\AddInViews
D:\Demo\Output\Contracts
D:\Demo\Output\HostSideAdapters
来看看MAF框架模型构成。
上图中绿色的是被引用蓝色项目所引用。例如HostSideAdapter就要引用Contract和Hostview,如下图所示。
注意引用时取消勾选复制本地。
这时就完成基本项目结构的搭建。
这里想实现宿主项目和插件项目的双向通信。即插件项目将相关函数接口在宿主实现,然后将宿主项目相关函数接口用委托类的方式注册给插件项目。实现双向通信。
用《WPF编程宝典》样例代码来说,样例中,插件程序实现ProcessImageBytes处理图像数据的函数,处理同时需要向宿主项目报告处理进度,宿主中 ReportProgress函数实现进度可视化。
MAF实现一般是先写Contract协议,明确需要的函数接口。然后写AddlnView和HostView。实际上这两个是将函数接口抽象化,在接口里函数复制过来前面加 public abstract 就行。
之后HostSideAdapter和AddInSideAdapter直接快速实现接口。
首先从Contract开始,Contract是定义接口,需要设置对象标识符[AddInContract],且必须继承IContract。
[AddInContract] public interface IImageProcessorContract : IContract { byte[] ProcessImageBytes(byte[] pixels); void Initialize(IHostObjectContract hostObj); } public interface IHostObjectContract : IContract { void ReportProgress(int progressPercent); }
Initialize函数是提供宿主函数注册的接口。
然后在HostView和AddInView分别定义主程序和插件程序的接口抽象类。
public abstract class ImageProcessorHostView { public abstract byte[] ProcessImageBytes(byte[] pixels); public abstract void Initialize(HostObject host); } public abstract class HostObject { public abstract void ReportProgress(int progressPercent); }
注意AddlnView需要设置对象标识符[AddInBase]。
[AddInBase] public abstract class ImageProcessorAddInView { public abstract byte[] ProcessImageBytes(byte[] pixels); public abstract void Initialize(HostObject hostObj); } public abstract class HostObject { public abstract void ReportProgress(int progressPercent); }
之后在HostSideAdapter实现抽象类。
注意HostSideAdapter继承HostView的抽象类,在构造函数里需设置ContractHandle插件生存周期,ContractHandle不能为readonly。
[HostAdapter] public class ImageProcessorContractToViewHostAdapter : HostView.ImageProcessorHostView { private Contract.IImageProcessorContract contract; private ContractHandle contractHandle; public ImageProcessorContractToViewHostAdapter(Contract.IImageProcessorContract contract) { this.contract = contract; contractHandle = new ContractHandle(contract); } public override byte[] ProcessImageBytes(byte[] pixels) { return contract.ProcessImageBytes(pixels); } public override void Initialize(HostView.HostObject host) { HostObjectViewToContractHostAdapter hostAdapter = new HostObjectViewToContractHostAdapter(host); contract.Initialize(hostAdapter); } } public class HostObjectViewToContractHostAdapter : ContractBase, Contract.IHostObjectContract { private HostView.HostObject view; public HostObjectViewToContractHostAdapter(HostView.HostObject view) { this.view = view; } public void ReportProgress(int progressPercent) { view.ReportProgress(progressPercent); } }
在AddInSideAdapter实现Contract接口,基本和HostSideAdapter类似,只是继承的类不同。
[AddInAdapter] public class ImageProcessorViewToContractAdapter : ContractBase, Contract.IImageProcessorContract { private AddInView.ImageProcessorAddInView view; public ImageProcessorViewToContractAdapter(AddInView.ImageProcessorAddInView view) { this.view = view; } public byte[] ProcessImageBytes(byte[] pixels) { return view.ProcessImageBytes(pixels); } public void Initialize(Contract.IHostObjectContract hostObj) { view.Initialize(new HostObjectContractToViewAddInAdapter(hostObj)); } } public class HostObjectContractToViewAddInAdapter : AddInView.HostObject { private Contract.IHostObjectContract contract; private ContractHandle handle; public HostObjectContractToViewAddInAdapter(Contract.IHostObjectContract contract) { this.contract = contract; this.handle = new ContractHandle(contract); } public override void ReportProgress(int progressPercent) { contract.ReportProgress(progressPercent); } }
宿主项目中需要实现HostView里HostObject抽象类。
private class AutomationHost : HostView.HostObject { private ProgressBar progressBar; public AutomationHost(ProgressBar progressBar) { this.progressBar = progressBar; } public override void ReportProgress(int progressPercent) { // Update the UI on the UI thread. progressBar.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { progressBar.Value = progressPercent; } ); } }
然后是在宿主项目里激活插件,并初始化AutomationHost。
string path = Environment.CurrentDirectory; AddInStore.Update(path);//更新目录中Addins目录里的插件 IList<AddInToken> tokens = AddInStore.FindAddIns(typeof(HostView.ImageProcessorHostView), path);//查找全部插件 lstAddIns.ItemsSource = tokens;//插件可视化 AddInToken token = (AddInToken)lstAddIns.SelectedItem;//选择插件 AddInProcess addInProcess = new AddInProcess();//创建插件进程 addInProcess.Start();//激活插件进程 addin = token.Activate<HostView.ImageProcessorHostView>(addInProcess,AddInSecurityLevel.Internet);//激活插件 //如果只是想隔离程序域,就无需创建AddInProcess,激活插件如下 // HostView.ImageProcessorHostView addin = token.Activate<HostView.ImageProcessorHostView>(AddInSecurityLevel.Host); automationHost = new AutomationHost(progressBar);//创建AutomationHost类 addin.Initialize(automationHost);//初始化automationHost
插件项目中实现AddInView中的抽象类。
[AddIn("Negative Image Processor", Version = "1.0", Publisher = "Imaginomics",Description = "")] public class NegativeImageProcessor : AddInView.ImageProcessorAddInView { public override byte[] ProcessImageBytes(byte[] pixels) { int iteration = pixels.Length / 100; for (int i = 0; i < pixels.Length - 2; i++) { pixels[i] = (byte)(255 - pixels[i]); pixels[i + 1] = (byte)(255 - pixels[i + 1]); pixels[i + 2] = (byte)(255 - pixels[i + 2]); if (i % iteration == 0) { host?.ReportProgress(i / iteration); } } return pixels; } private AddInView.HostObject host; public override void Initialize(AddInView.HostObject hostObj) { host = hostObj; }
这时宿主可以把数据传递给插件程序,插件程序中ProcessImageBytes处理数据然后通过host?.ReportProgress(i / iteration);向宿主传递消息。
这里有提供样例程序。
项目附件.7z
AddInController addInController = AddInController.GetAddInController(addIn);
addInController.Shutdown();
此方法适应于非应用隔离的手动关闭。对于应用隔离式插件,用此方法会抛出异常。
如上面样例就是应用隔离的插件,可以根据进程id直接关闭进程。
public void ProcessClose() { try { if (process != null) { Process processes = Process.GetProcessById(addInProcess.ProcessId); if (processes?.Id > 0) { processes.Close(); } } } catch (Exception) { } }
System.Runtime.Remoting.RemotingException: 从 IPC 端口读取时失败: 管道已结束。这是插件最常见的异常,因为插件抛出异常而使得插件程序关闭。
如果是插件调用非托管代码,而产生的异常,可以查Windows应用程序日志来确定异常。其余能捕获的异常尽量捕获保存到日志,方便查看。
实际应用过程中,往往是通过委托来将宿主相关函数暴露給一个类,然后通过在宿主程序初始化后。在插件中实例化后就可以直接调用宿主的相关函数,反之同理。
这里是通过委托暴露宿主的一个函数。
public delegate void UpdateCallBack(string message, bool isclose, int leve); public class VideoHost : HostAddInView { public event UpdateCallBack Updatecallback; public override void ProcessVideoCallBack(string message, bool isclose, int leve) { Updatecallback?.Invoke(message, isclose, leve); } }
在插件程序中实例化后调用。
private HostAddInView hostAddInView; public override void Initialize(HostAddInView hostAddInView) { this.hostAddInView = hostAddInView; } private void ErrorCallback(string message, bool isclose, int leve) { hostAddInView?.ProcessVideoCallBack(message, isclose, leve); }
MAF本质是实现IpcChannel通信,在一个期刊中有作者抛弃MAF固定结构自己实现IpcChannel,因为代码很复杂,就不在此详细阐述。
如果要实现应用域隔离,自己实现IpcChannel,MAF中的应用域隔离实现也是非常好的参考资料。
MAF的7层结构主要是实现从插件的宿主函数转换,例如可以在将插件程序的界面放入主界面中渲染,做出像浏览器一样的开一个界面就是一个进程。将插件中的组件在AddInSideAdapter中转换为Stream然后在HostSideAdapter中将Stream实例化为组件。而HostView和AddInView实际上是提供两个转换接口,Contract是定义传输接口。
另外如果传输插件向数组传递图像数据,最后是转换成byte[],或者使用共享内存。
如果有什么遗漏和错误,欢迎指正,批评。
图像分割技术是计算机视觉领域的一个重要的研究方向,对于广大AI开发者来说可谓耳熟能详!对于如此重要的领域,早在2019年开源的图像分割套件PaddleSeg已经广泛被企业与开发者应用在实际生产当中。不信的话,咱们往下看! 先来个高科技——自动驾驶!正是基于图像分割技术,汽车才能分清楚哪里是路,哪里是人。在抗疫最前线的医疗阵地上,图像分割发挥了巨大作用!连心医疗使用PaddleSeg开发上线了“基于CT影像的肺炎筛查与病情预评估AI系统”,可快速识别CT影像上的肺炎病灶信息,帮助我们的白衣战士节省了大量诊断和评估时间!除了此之外,PaddleSeg还可以用在很多其它场景,话不多说,咱们直接上图:工业场景中的表计读数自动读取遥感图像分割人体解析人像分割+背景替换。(你以为我在旅游?其实我在加班)基于人像分割,我们还可以进一步把彩色图像变素描看到PaddleSeg如此丰富的应用场景,大家是不是想跃跃欲试呢?在此小编吐血呼吁大家点击star支持一下。点击文末"阅读原文"或以下链接立即Star:https://github.com/PaddlePaddle/PaddleSeg
故事的这样说起,我们的软件外包商,在软件开发中将一些文件存入了MYSQL 十几行的数据竟然占据了几十GB的存储空间,数据库的内存是一直告急. 在我们DB发现这个问题的时候,已经有点晚了, 估计这时候有人说,哎你怎么不管,在早期,实际上各种原因可能DB不能早期介入一些设计,或者根本没有精力来介入到这些设计当中,导致这样的问题. 那我不是标题党,后面我们出了一个解决方案,让外包商将文件存储移步到了MONGODB,然后进行压测,在压测过程中,100G存储空间最终压测将一台MONGODB服务器压爆了, 压测的MONGODB的硬件参数4G 内存,2核心,100G磁盘, 做的复制集. 此前MYSQL通过BLOB字段来存储那些文件,40G内存,4CORE CPU,出现性能问题(当然,基本搞开发的应该知道MYSQL是不能存储文件的,但不知道怎么搞得)具体开发怎么测试的 共四次 1 5线程 12G文件2 10线程 5G文件320线程 10G文件 4 40线程 37G文件以4G内存搏 40G内存,最终也没落下风的MONGODB自然是优胜者.存储的数据每个document 1MB . 所以用碾压了这两个
作者:荒山 https://juejin.im/post/5dadc6045188255a270a0f85写一篇关于ReactFiber的文章,这个Flag立了很久,这也是今年的目标之一。最近的在掘金的文章获得很多关注和鼓励,给了我很多动力,所以下定决心好好把它写出来。我会以最通俗的方式将它讲透,因此这算是一篇科普式的文章。不管你是使用React、还是Vue,这里面的思想值得学习学习!一年一度的React春晚:ReactConf即将到来,不知道今年会不会有什么惊喜,去年是ReactHooks,前年是ReactFiber...我得赶在ReactConf之前发布这篇文章:ReactFiber已经出来这么久了,这文章是老酒装新瓶吧?对于我来说,通过这篇文章我重新认识了ReactFiber,它不是一个新东西,它也是老酒装新瓶,不信你就看吧...ReactFiber不是一个新的东西,但在前端领域是第一次广为认知的应用。了解它有啥用?ReactFiber代码很复杂,门槛很高,你不了解它,后面React新出的KillerFeature你可能就更不能理解了我不是升到Reactv16了吗?没什么出奇的啊
前言记得开始接触react技术栈的时候,最难理解的地方就是redux。全是新名词:reducer、store、dispatch、middleware等等,我就理解state一个名词。网上找的redux文章,要不有一本书的厚度,要不很玄乎,晦涩难懂,越看越觉得难,越看越怕,信心都没有了!花了很长时间熟悉redux,慢慢的发现它其实真的很简单。本章不会把redux的各种概念,名词解释一遍,这样和其他教程没有任何区别,没有太大意义。我会带大家从零实现一个完整的redux,让大家知其然,知其所以然。开始前,你必须知道一些事情:redux和react没有关系,redux可以用在任何框架中,忘掉react。connect不属于redux,它其实属于react-redux,请先忘掉它,下一章节,我们会介绍它。请一定先忘记reducer、store、dispatch、middleware等等这些名词。redux是一个状态管理器。Let'sGo!状态管理器简单的状态管理器redux是一个状态管理器,那什么是状态呢?状态就是数据,比如计数器中的count。letstate={ count:1 }
ApacheCXF一款WebServiceRPC框架入门教程CXF官网:http://cxf.apache.org/ ApacheCXF是一个开源的WebServiceRPC框架,是由Celtix和CodehausXFire合并而成的。它可以说是一个功能齐全的集合。功能特性:支持WebService标准,包括SOAP(1.1、1.2)规范、WSIBasicProfile…等等我也不了解的,这里就不一一举例了。支持JSR相关规范和标准,包括….同上。支持多种传输协议和协议绑定(SOAP、REST/HTTP、XML)、数据绑定(JAXB2.X、Aegis、ApacheXMLBeans)。还是先从案例入手吧项目源码地址:RPC_Demo,记得是项目里面的comgithubcxf 1、使用IDEA构建一个maven项目,我选择了maven-archetype-webapp构建基本框架。当然你可能还需要创建一些目录2、我想是时候先配置好主要的pom文件了。<?xmlversion="1.0"encoding="UTF-8"?> <pro
前言这是我第一次写博客,之前一直有写博客的想法,但是总觉得,得自己编写一个博客系统才合适。于是一直拖到现在。正好最近自己的博客系统第一个初步版本已经在阿里云上线了。因为系统还不稳定,所以暂时会在csdn平台上进行日志编写。最近把博客上线的经过总结了一下,希望大家少走一点弯路。 这个博客,源码大家可以在慕课网的springboot企业级博客系统实战中找到,或者网上也应该可以直接搜到。有精力的同学可以去学习或者看一下源码,作为自己的第一个实战项目是很不错的经历。 第一次经历项目的上线工作,算是一次运维的经验,下面是我对项目上线的一些流程总结。大体可以分为这些步骤。 预先准备SpringBoot的博客系统源码CentOS7服务器(阿里云)已经备案过的域名本地调试环境参数操作系统:win10 关系型数据库:mysqlVer14.14Distrib5.7.17,forWin64(x86_64) 非关系型数据库:mongodb-win32-x86_64-2008plus-ssl-3.4.4 注:mongodb,windows版本下载地址http://dl.mongodb.org/dl/win32/
“机器学习”是一门计算机科学学科,指的是机器利用数据进行学习并完成通常需要人类智能的任务的能力。这项技术正在迅速发展:根据Gartner的数据和分析服务,到2022年,超过一半的数据和分析服务将由机器而非人类来完成,比现在多了10%。机器学习能够减少诈骗,事实上,超过60%的人越来越觉得,等待某件事的发生会立即影响他们对潜在品牌的认知——尤其是当涉及到身份或财务欺诈时。实时决策需要机器学习和人工智能机器学习和人工智能(AI)正在颠覆企业、品牌甚至整个行业。他们有能力大幅降低劳动力成本,产生新的和意想不到的创意,发现新的模式,并依靠原始数据建立预测模型。他们还能够操作数据分析,并支持以前不可能实现的实时自动决策。当机器学习以自动化、低延迟的方式应用于真实数据时,结果可能会影响到正在发生的业务活动,如果正确地利用和利用,将为组织提供真正的竞争力。在不同行业的反诈骗部门中,我们可以清楚地看到,机器学习和实时数据分析对高风险业务事件可能产生的有形影响。下面的两个例子:在金融服务业中防止身份盗窃和欺诈行业领先的通信、信息和技术解决方案提供商华为技术有限公司(HuaweiTechnologies)
Web应用系统的小安全漏洞及相应的攻击方式接口自动化测试的"开胃小菜"1 写作目的本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为。主要目的如下:了解什么叫安全漏洞知道什么是api了解一些获取api的工具通过对API的认识了解白盒接口测试基本概念和技术免责声明:本文主要是以学习交流为目的,而且实验的对象也是通过搜索引擎随机选择的。不以搞破坏为目的,纯粹是以教学为目的,同时也警醒大伙重视基本的互联网安全。当然,本文会对关键字打个马赛克,防止有兴趣的同学也把网站主当了靶子了。如果网站主通过搜索引擎找到了本文,希望网站主最先能够做的是如何使用简单的方法堵住漏洞,当然如果网站主要求本文删除相应的信息,本文也会全力配合的。2 背景介绍先说一个在互联网上常见,但是普通人又不太理解的东西--“验证码”。下面是来自 百度百科 的一段解释:验证码(CAPTCHA)是“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户
欢迎使用云开发CloudBaseAPI3.0版本。全新的API接口文档更加规范和全面,统一的参数风格和公共错误码,统一的SDK/CLI版本与API文档严格一致,给您带来简单快捷的使用体验。支持全地域就近接入让您更快连接腾讯云产品。更多腾讯云API3.0使用介绍请查看:快速入门 欢迎使用腾讯云云开发服务,云开发(TencentCloudBase)是腾讯云为移动开发者提供的一站式后端云服务,可用于开发多种客户端,它帮助开发者统一构建和管理资源,让开发者可以专注于业务逻辑的实现,而无需理解后端逻辑及服务器运维知识,开发门槛更低,效率更高。 云开发的云API则是云开发提供的管理端能力API,目的是可以让开发者个性化搭建自己的控制台以满足更丰富的需求。与SDK文档中的数据流SDK不同。调用时需遵循腾讯云云API规范。云开发的云API接口目前在逐步开放中。
classSolution{ public: intmaxProfit(vector<int>&prices){ intn=prices.size(); if(n<=1)return0; if(n==2)returnprices[1]>prices[0]?prices[1]-prices[0]:0; intprofit=0; intbegin=0; intend=0; for(inti=0;i<n-1;++i){ while(prices[i]>=prices[i+1]){ i++; if(i==n-1)returnprofit; if(i==n-2){ if(prices[i]>=prices[i+1]) returnprofit; else{ profit+=prices[i+1]-prices[i]; returnprofit; } } } begin=i; while(i!=n-1&&prices[i]<prices[i+1])i++; end=i; profit+=prices[end]-prices[b
功能与特性 Alpha版本虽然为本软件的第一代版本,但已基本覆盖了用户个人使用时的主要功能。除登陆注册与后台管理外,下文将分版块详细介绍面向用户的主要功能特性。 『产品主页』 潜在应用场景 场景0:友人A最近为了准备出国考试,有了短时间内冲刺背单词的需求。他从他的朋友口中听说了『近取Key』这款背单词软件,好奇地点开了网站的主页,想要瞧一瞧这款软件究竟有什么与众不同之处。 功能特性详述 (场景0)详细介绍了A4纸背单词法,以及本软件的三大核心优势,有助于吸引用户和推广宣传 (场景0)结合gif动图,深入浅出地介绍了本产品的使用教程,帮助用户更快上手使用 『我的词图』 潜在应用场景 场景1:在了解了软件的基本功能后,友人A对这款软件表现出了极大的兴趣,立即迫不及待地注册了一个新账号想要试用一番。当他成功登录后,首先看到的就是『我的词图』页面。 场景2:在使用了一段时间后,友人A已经创建了数十张词图,背了上千个单词。但是这么多词图,自己该怎么知道哪张词图是自己哪天背的,背的是哪本词书,以及包含了哪些类型的单词呢? 场景3:每背完一张词图,友人A希望一目了然每张词图里自己不认识的
这是一个开源项目,实现了命令行下查看天气的炫酷效果 https://github.com/chubin/wttr.in开源地址 首先上效果图 http://wttr.in/@linuxconfig.org (在浏览器输入这个地址,前边是开源项目的名称,后边跟的是需要查看天气的地址,输入@linuxconfig.org则是查看wttr托管地天气情况的) 而且支持中文地址输入 http://wttr.in/上海 在终端下查看,这样在linux系统下也可以很方便的查看天气,主要是查看操作都很方便(如果是在终端查看的话,要是地区有打雷,还可以看到雷电标识在闪动) curlwttr.in/上海 #u0_a535@localhostin~[12:55:55] $curlwttr.in/上海 Weatherreport:上海 \/Partlycloudy _/"".-.28..31°C \_().↑30km/h /(___(__)10km 0.0mm ┌─────────────┐ ┌──────────────────────────────┬──────────────
1. 禅道简介 禅道是一个基于“敏捷开发”模式的软件开发全生命周期管理软件,在国内的软件开发公司里占据最大的份额,从大公司到小公司,都能适用。笔者使用禅道多年,根据自己的经验总结了一套Bug管理的方法论,不只是禅道,也可以运用在别的软件开发管理系统上。 2. Bug管理规范 2.1 角色及人员 一般来说,禅道用于需求/Bug管理方面,在用户角色上,是分为这么几个角色: 1、公司/部门管理层 以下简称“管理层” 2、产品经理以下简称“产品经理”职责:负责整个产品生命周期内的全面管理 3、项目经理以下简称“项目经理”职责:负责产品中某个项目(阶段)的具体管理 4、技术经理 以下简称“技术经理”职责:负责分配Bug给对应的开发人员 5、开发人员(包括UI、前后端程序员)职责:以下简称“开发员”负责修改代码处理Bug 6、测试人员 以下简称“测试员” 职责:负责提交Bug和验证已解决的Bug 7、测试经理 以下简称“测试经理”职责:负责解决测试员的疑问,抽检已关闭的Bug,及时调
Djangomodels中常用的字段类型 数值型 这些类型都是数值相关的. l AutoFieldint(11).自增主键,DjangoModel默认提供,可以被重写.完整定义是 id=models.AutoField(primary_key=True)复制 l BooleanFueldtinyint(1).布尔类型字段,一般用于记录状态标记. l DecimalFielddecimal.开发对数据精度要求高的业务时考虑使用,比如做支付相关,金融相关.定义时需要指定精确到多少位,例如 case=models.DecimalField(max_digits=8,decimal_places=2,default=0)复制 定义长度为8,精度为2的数字. l IntegerFieldint(11)整型,用于保存一个整数 l PositiveIntegerField只包含正整数 l SmallIntegerFieldsmallint.小整数时会用到 字符型 这些字段都是用来存储字符数据的,对应到MySQL中有两种
背景 最近在查看nginx的日志的时候,发现了有一条很奇怪的日志,就全力去排查。 错误日志: nginx.conf配置: 触发条件: 访问:http://localhost:8907/logo之后,会在error日志中记录下usinguninitialized"XXXX"variablewhileloggingrequest的日志 原因 虽然set设置的变量是全局变量,但是每个location中对于set设置的全局变量如果没有赋值,也是未定义变量。如果使用了就会触发警告。
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了……看来“学”完新东西不经常做题不写博客,就白学了== 我没啥智商,网上的FWT博客我大多看不懂,下面这篇博客是留给我我再次忘记FWT时看的,所以像我一样的没智商选手应该也能看懂!有智商选手更能看懂咯! (写得非常匆忙,如有任何错误请在评论区指正!TAT) 什么是FWT FWT是用来快速做位运算卷积的。位运算卷积是什么?给出两个数组\(A\)和\(B\)(长度相等且是2的整数次幂),求一个数组\(C\),满足\(A*B=C\),这个“\(*\)”的定义如下:$$A*B=C\LeftrightarrowC_k=\sum_{i\oplusj=k}A_i\cdotB_j$$其中“\(\oplus\)”是一种位运算,可以是与(&)、或(|)、异或(^)。 为什么要有一个变换呢?回想一下FFT,FFT求\(A*B\)时(这个“\(*\)”是多项式乘法那个卷积),是把\(A\)和\(B\)各自“变换”了一下,然后把变换后的数组按位相乘,得到“变换后的\(C\)”——\(tf(C)
Qt的Model/View设计中,有一些隐藏的代码,它们大多放在私有类里,对于类的作用非常关键,体现着Qt的整体设计思想。然而,由于它们比较隐蔽,学习起来比较繁琐,受到人们的忽视。然而,体现设计思想,提高编程水平往往需要研读深层次代码。所谓奇伟鬼怪之观,大多在于险远,非有志者不能至也。 QFileSystemModel继承自QAbstractItemModel类,作为子类,需要实现一些成员函数。面向对象编程中,如何划分父类和子类的职责需要仔细权衡。拿flags函数的设计来说,目的是让model能获取肚子里的某一个node的信息。如果把它放在父类中,会出现什么问题呢?问题是,无法针对子类的个性而做出调整。 在QFileSystemModel的flags函数里面,有这样一行: if((index.column()==0)&&indexNode->permissions()&QFile::WriteUser){ 复制 这里面用到了QFile::WriteUser,代表用户可以写这个node。正是由于需要根据model的项目而确定一
关于Map函数的想法 这一篇文章我会讲一下Map这个函数的思想,并举一个例子,希望大家举一反三。 问题 有一组数,我想将>1的全部变成1,<1的全部变成0,应该如何操作。 想法 我们可以先定义一个规则,就是把上面的要求变成一个表达式,如下所示 If[t>1,1,0]复制 接着,我们可以使用Map函数将上面的规则应用到数组中的每一个元素中去。于是我们得到了下面的解决方案 当然,我们也可以将上面的式子缩写,写成如下的形式 问题扩展 我们将上面的问题变为:我想将>1的全部变成1,<-1的全部变成-1,在-1到1之间的变成0,应该如何操作。 其实这个问题的解决办法和上面的是一样的,也是先把规则定义好,在使用Map即可。 作用 我们再来看一个具体的应用场景:比如想要统计一组数组中大于1的元素的个数,那么就可以进行如下的操作。 思路 1.首先将数组中>1的数都变成1,<1的数都变成0 2.对新的数组进行求和 3.这样就统计出一个数组中所有大于1的元素的个数 Clear[rule]; rule[t
之前介绍了蒙特卡洛的优势。详情可参考之前的《蒙特卡洛方法学习(一)》。 那么对于我们设计的电路,对于电路中的元器件参数容差,进行统计分布,用一组伪随机数求得元器件的随机抽样序列,对这些随机抽样得到的元器件参数再对设计的电路进行功能仿真,比如:直流分析,交流分析,瞬态分析等等。 利用Multisim进行蒙特卡洛仿真电路。这里举一个简单的例子,如下: 对于上述电路中,电阻的阻值会有一个容差范围,电容的容值也会有一个容差范围,这些容差会对整个电路带来的影响,可以利用蒙特卡洛方法进行仿真,具体操作如下所示: (1)设置模型容差列表 按照上图,打开蒙特卡洛应用。 上述打开之后,电阻的阻值容差已经直接加载过来了,电容的还没有,可以点击addtolerance。 从上到下各个含义,相信大家都能看懂。这里不再赘述。 上述参数添加好后,再点击ok键,可以看到如下图所示,电容C1容差添加进来。依次再添加其他几个电容的容差。 (2)分析参数  
前言这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了。Android中的四大组件中有一个广播:Broadcast关于它的相关知识可以转战:http://blog.csdn.net/jiangwei0910410003/article/details/19150705我们这里就不做太多解释了,现在来看一下问题:知识前提这篇文章和我之前介绍一篇文章: Andrdoid中对应用程序的行为拦截实现方式之----从Java层进行拦截内容和知识点非常相似,如果想看明白这篇文章的话,那么必须先看懂上面的一篇文章,否则很难理解的。知识点1、进程注入技术2、获取系统中所有应用的IntentFilter问题一、让我们自己定义的广播接收器的最先接收到系统发送的安装应用的广播现在很多安全应用都会注册这个广播(360手机卫士、清理大师等),广播中可以设置优先级的。同时动态注册的广播的优先级比静态注册的广播的优先级高。通过上面的知识我们可以这么做:1、将自己的广播接收器注册的优先级设置最高,一般是用最大值:In