首页 文章 精选 留言 我的

精选列表

搜索[规则引擎],共10012篇文章
优秀的个人博客,低调大师

java安全编码指南之:表达式规则

简介 在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。 注意表达式的返回值 我们在使用JDK库的时候,一定要注意认真的读一下JDK中方法的含义和它的返回值。 有些返回值可能表示这个操作是否成功,有的返回值可能是方法操作的结果。我们看两个常见的例子: public void deleteFileWrong(){ File file= new File("/tmp/www.flydean.com.txt"); file.delete(); System.out.println("File delete success!"); } public void deleteFileRight(){ File file= new File("/tmp/www.flydean.com.txt"); if(file.delete()){ System.out.println("File delete success!"); } } 先看一个文件删除的例子,delete方法是有返回值的,所以我们在调用delete方法之后,一定要判断一下返回值,看是否删除成功。 再看一个常见的String中字符替换的例子: public void stringReplaceWrong(){ String url="www.flydean.com"; url.replace("www","WWW"); System.out.println("replaced url..."+url); } public void stringReplaceRight(){ String url="www.flydean.com"; url=url.replace("www","WWW"); System.out.println("replaced url..."+url); } 我们要记住,String是不可变的,所以它的replace方法,会返回一个替换过后的String,但是原String是不变的,所以我们需要将返回值重新赋值。 注意避免NullPointerException NullPointerException应该是最最常见的运行时异常了。怎么避免这个异常呢? 我们要做的就是在调用object的方法时候,一定要判断这个object是不是为空。 在JDK8之后,我们引入了Stream操作: public void streamWrong(Collection<Object> collection){ collection.stream().filter(obj->obj.equals("www.flydean.com")); } Stream操作的过程中,我们需要注意stream中的元素是否为空。 有时候,我们可能觉得已经判断是为空了,但是条件判断不准确,导致未知的异常,看下面这个例子: public int countWrong(Collection<Object> collection, Object object){ int count=0; if(collection ==null){ return count; } for(Object element: collection){ if((element ==null && object== null) || element.equals(object)){ count++; } } return count; } 这个例子是用来查找collection中到底有多少元素和object相同,如果两者都为空,也记为相同。 但是上面的例子有一个漏洞,它没有考虑element ==null 而 object !=null的情况,所以会导致NullPointerException的生成。 我们需要这样修改: public int countRight(Collection<Object> collection, Object object){ int count=0; if(collection ==null){ return count; } for(Object element: collection){ if((element ==null && object== null) || (element !=null && element.equals(object))){ count++; } } return count; } 数组相等的判断 如果我们需要比较两个数组是否相等,其实我们想比较的是两个数组中的元素是否相等。 我们知道数组是一个特殊的Object,那么数组对象也有一个equals方法,考虑下面的例子: public boolean compareWrong(){ int[] array1 = new int[10]; int[] array2 = new int[10]; return array1.equals(array2); } 返回的结果是false,因为数组直接使用了Object中定义的equals方法,我们看下该方法的定义: public boolean equals(Object obj) { return (this == obj); } 可以看到,该方法比较的是两个地址是否相等。所以我们的到了false结果。 其实,我们可以使用Arrays.equals工具类中的方法来进行两个数组的比较: public boolean compareRight(){ int[] array1 = new int[10]; int[] array2 = new int[10]; return Arrays.equals(array1, array2); } 基础类型的封装类间的比较 在java中,我们知道有一些基础类型像boolean, byte,char, short, int他们会有相对应的封装类型:Boolean,Byte,Character,Short,Integer等。 我们可以直接将基础类型的值赋值给封装类型,封装类型会自行进行转换。 考虑下面的例子: Boolean boolA=true; Boolean boolB=true; System.out.println(boolA==boolB); 结果是多少呢? 答案是true。为什么两个不同对象的比较会是true呢? 在回答这个问题之前,我们看一下字符串的比较: String stringA="www.flydean.com"; String stringB="www.flydean.com"; System.out.println(stringA==stringB); 这个我们大家应该都知道,因为String有一个字符串常量池,直接从字符串常量构建的String对象,其实是同一个对象。 同样的对于Boolean和Byte来说,如果直接从基础类值构建的话,也是同一个对象。 而对于Character来说,如果值的范围在\u0000 to \u007f,则属于同一个对象,如果超出了这个范围,则是不同的对象。 对于Integer和Short来说,如果值的范围在-128 and 127,则属于同一个对象,如果超出了这个范围,则是不同的对象。 再考虑下面的例子: Boolean boolA=true; Boolean boolC=new Boolean(true); System.out.println(boolA==boolC); 输出的结果是false,因为boolC使用了new关键字,构建了一个新的对象。 集合中类型不匹配 现在java集合可以通过指定类型,从而只存储特定类型的对象。考虑下面的一个例子: public void typeMismatch(){ HashSet<Short> shortSet= new HashSet<>(); for(int i=0;i<10;i++){ shortSet.add((short)i); shortSet.remove(i); } System.out.println(shortSet.size()); } 上面代码我们定义了一个Short的集合,然后将0-9添加进去,接着我们又调用了remove方法把i从集合删除。 但是最后输出结果是10,表明我们并没有删除成功。为什么呢? 看下HashSet的remove方法: public boolean remove(Object o) { return map.remove(o)==PRESENT; } remove方法的参数是Object,我们传入的i是int类型的,跟short不匹配,所以导致删除失败。 我们需要这样修改: public void typeMatch(){ HashSet<Short> shortSet= new HashSet<>(); for(int i=0;i<10;i++){ shortSet.add((short)i); shortSet.remove((short)i); } System.out.println(shortSet.size()); } Asset的副作用 我们会使用Asset语句在代码中做调试使用,在使用的过程中需要注意Asset语句不要对系统的业务逻辑产生副作用,也就是说即使Asset语句不运行,也不会修改代码的业务逻辑。 看下面的例子: public void assetWrong(ArrayList<Integer> list){ assert list.remove(0)>0; } 上的代码我们从list中删除第一个元素,并判断删除的元素是否大于0. 上面的代码如果assert语句不执行的话,会导致业务逻辑也不执行,所以需要修改成下面这样: public void assetRight(ArrayList<Integer> list){ int result=list.remove(0); assert result>0; } 本文的例子: learn-java-base-9-to-20/tree/master/security 本文已收录于 http://www.flydean.com/java-security-code-line-expresion/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

优秀的个人博客,低调大师

自然语言理解-从规则到深度学习

1. 引言 自然语言理解是人工智能的核心难题之一,也是目前智能语音交互和人机对话的核心难题。维基百科有如下描述[1]: Natural language understanding (NLU) is a subtopic of natural language processing in artificial intelligence that deals with machine reading comprehension. NLU is considered an AI-hard problem. 对于AI-hard的解释如下: In the field of artificial intelligence, the most difficult problems are informally known as AI-complete

优秀的个人博客,低调大师

思科Spark平台改变协作技术游戏规则

思科近日宣布推出一项全新服务,通过“云”提供工作中最常用的三种通信工具,即消息通信、会议和呼叫工具,全面颠覆协作体验。此外,思科还将电话和视频会议系统接入云端,充分利用这些新的服务,从云平台上获取协作技术支持。 这一全新协作服务的革新之处在于: 它纯粹是为了提供高度安全、易于使用的协作体验而设计的。如今,我们大多数人使用未互联的分立工具进行团队消息通信、虚拟会议和电话呼叫。名为Cisco Spark的新服务将消息通信、会议和呼叫技术整合在一起,简单易用,能够为用户带来无缝的沟通体验。借助Cisco Spark消息通信、会议和呼叫,将构成完整的用户体验。例如,只需单击鼠标,用户便可将电话呼叫转变为视频会议。只需轻轻一扫,用户便可以将视频呼叫从房间系统转移到手机上,然后转移到另一个房间,从而在移动过程中不会错过任何重要信息。 它让设置视频会议室和电话变得轻而易举。您是否曾使用智能手机上显示的二维码登机?现在设置座机将同样简单。 它可将电话系统联接到云。企业在电话系统和其他现场应用设备方面投入了很多。Cisco Spark混合服务可通过将此类设备联接到云,为用户带来令人惊叹的全新体验。 举例来说,当用户使用思科IP电话时,拨打电话的行为会自动在用户与对方共享的Spark房间创建一个会议,用户只需单击鼠标即可显示内容。思科将整个过程称为“零接触会议”,因为没有人需要真正建立会议平台,它就在那里,随时供用户使用。 本文转自d1net(转载)

优秀的个人博客,低调大师

转帖-hadoop的JobId TaskId生成规则

在hadoop的任务job中,jobid是标志一个任务的唯一标志,可以用于定位到该job,查询该job相关信息,kill掉该job 。 jobId是如何生成的呢 ? 在一般的服务集群上我们通过JobTracker来管理job,该id既是通过JobTracke的getNewJobId()方法得到,具体代码如下: public synchronized JobID getNewJobId() throws IOException { ensureRunning(); return new JobID(getTrackerIdentifier(), nextJobId++); } 代码二: /** * Get the unique identifier (ie. timestamp) of this job tracker start. * @return a string with a unique identifier */ public String getTrackerIdentifier() { return trackerIdentifier; } trackerIdentifier 和 nextJobId均是JobTracker的内部变量 。 trackerIdentifier 是固定的JobTracker启动(实例化)时就确定的,代码如下: SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm"); trackerIdentifier = dateFormat.format(new Date()); trackerIdentifier是启动时的时间戳 。 nextJobId是启动时赋值1,没执行一次该方法则nextJobId值+1 。 所以job即是:job_JobTracker启动时间戳_该JobTracker生成的顺序的一个id ,该id也叫做iobtracker的id。 JobID是系统分配给作业的唯一标识符,它的toString结果是job_<jobtrackerID>_<jobNumber>。例子:job_200707121733_0003表明这是jobtracker200707121733 (利用jobtracker的开始时间作为ID)的第3号作业。 作业分成任务执行,任务号TaskID包含了它所属的作业ID,同时也有任务ID,同时还保持了这是否是一个Map任务(成员变量isMap)。任务号的字符串表示为task_<jobtrackerID>_<jobNumber>_[m|r]_<taskNumber>,如task_200707121733_0003_m_000005表示作业200707121733_0003的000005号任务,改任务是一个Map任务,同样,reduce任务中间是_r_.... 。 一个任务有可能有多个执行(错误恢复/消除Stragglers等),所以必须区分任务的多个执行,这是通过类TaskAttemptID来完成,它在任务号的基础上添加了尝试号。一个任务尝试号的例子是attempt_200707121733_0003_m_000005_0,它是任务task_200707121733_0003_m_000005的第0号尝试。 (原帖:http://blog.csdn.net/codestinity/article/details/6939086)

优秀的个人博客,低调大师

数据质量规则如何自动拦截异常脏数据?数据质量规则怎样统一跨系统校验口径?

前阵子跟一家零售企业的数据负责人聊天,他说了一件事让我印象很深。某天早上打开BI报表,发现华东区销售额比昨天暴涨了300%。排查了半天才发现,昨晚从POS系统同步上来的一批交易数据里,金额字段多了一个0——10万的单子变成了100万。等发现的时候,这批数据已经进了数仓,下游七八张报表全部污染。

优秀的个人博客,低调大师

Docker 引擎概述

Docker Engine 是一个开源的容器技术,被用来对你的应用进行容器化构建。 Docker Engine 实际上是一个客户端服务器(client-server)应用: 一个在服务器上长期运行的被称为 dockerd 的进程。 一个指定结构的 APIs,这个 API 被用来与 Docker 守护进程进行通信。 一个命令行界面(CLI)客户端 docker。 命令行界面(CLI)使用 Docker APIs 来控制和与 Docker 来互相作用。这个使用脚本或者 CLI 命令行来进行控制和执行。 其他 Docker 应用使用下层 API 和 CLI 来对 Docker 来进行控制。 Docker 守护进程创建和管理 Docker 的对象(objects), 例如 镜像(images),容器(containers),网络(networks),卷(volumes)。 更多的信息和内容,请参考: Docker Architecture。 Docker 用户指南 希望了解更多 Docker 的信息和有关使用和实现的问题和回答,请参考 开始使用 页面中的内容。 安装指南 请参考 installation section 页面中的内容来针对不同平台的 Docker 安装指南。 发行日志 针对当前的版本的修改和历史版本的修改日志,请参考 发行日志页面 页面中的内容。 特性丢弃策略 Docker 容器随着版本的改变和新特性的添加可能随着性能的变化和添加而过期而被替代掉。在已经存在的特性被删除之前,这个特性将会在文档中标记为 “deprecated”。 这个标记将会在 Docker 中至少保持 3 个稳定的版本,除非被明确的表示将会被删除掉。 针对需要删除的特性列表,用户将会被建议先记录下来,并且针对一些被删除的特性,用户在进行版本合并的时候尽量先合并这些新的特性,并尽可能的先替换掉。 完整的需要删除的特性列表,请参考页面:https://docker.ossez.com/engine/deprecated/ 中的内容。 https://www.ossez.com/t/docker/729

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册