使用itellij idea写javafx程序时,刚开始挺顺利的,功能也实现了。后来过了一段时间重新打开idea看项目时忽然发现一大片红色错误提示。我以为是少jar包导致的,就导入jar包,专门创建了一个maven工程重构项目来解决jar包问题,然而并没有说什么卵用,还是一大片红色。把光标放到红色代码上就提示如标题所示的错误信息。也是很郁闷。
直接运行一下项目,发现虽然报错,但是项目能正常运行,功能都能实现。很奇特。
通过查资料了解到javafx相关的依赖是java jdk自带的,不需要额外引用任何jar包。那么问题就应该出现在idea本身的某项配置上。
仔细回想之前都做了哪些重要操作可能导致这个错误。逐个查看、修改,看效果怎么样。
错误提示中提到了module这个单词,结合之前的操作,严重怀疑是下图所示的地方配置有误,当查看到如下图所示的地方时奇迹出现了:
当初使用lambda表达式的时候因为默认language level是5 ,不支持lambda表达式,所以把它改成了10(我中的jdk版本是10),本以为越高越好,正好配套了,并且当时该了之后没注意到报错,直接运行项目功能可以实现就直接完事了。
现在把language level从10改成8(从8起,开始支持lambda表达式),奇迹出现了,一大片红色报警突然全部消失,哈哈,好高兴!
至于为什么非8不可,那就不得而知了,idea自身的特殊配置,也不好深究。问题完美解决就行了,别的管他呢。
总结:这个错误是某些东西不匹配造成的,结合报错信息,加上一点灵感,问题得以解决。
对于数学黑洞,无论怎样设值,在规定的处理法则下,最终都将得到固定的一个值,再也跳不出去了,就像宇宙中的黑洞可以将任何物质,以及运行速度最快的光牢牢吸住,不使它们逃脱一样。
算法过程如下:
取任意一个4位数(4个数字均为同一个数的除外),将该数的4个数字重新组合,形成可能的最大数和可能的最小数,再将两者之间的差求出来;对此差值重复同样过程,最后你总是至达卡普雷卡尔黑洞6174,到达这个黑洞最多需要14个步骤。使用matlab验证代码如下:
n = input('输入一个四位正整数:n =') ; flag = [0,1] ;%falg(0)计算第i次的n的值,flag(1)记录第i+1次的n的值 while((flag(1) - flag(2)) ~= 0)%当计算的前后两次的结果相同时便终止 flag(1) = n ; strva = num2str(n) ; N = length(strva) ; num = [] ; for i = 1:1:N num = [num,str2num(strva(i))] ; end %从小到大排序 for i =1:1:N - 1 for j = 1:1:N-i if (num(j) > num(j+1)) tmp = num(j) ; num(j) = num(j+1) ; num(j+1) = tmp ; end end end %计算最大值与最小值 max = num(N) ; min = num(1) ; for i =1:1:N if(i < N) max = max * 10 + num(N - i) ; end if(i > 1) min = min * 10 + num(i) ; end end n = max -min ;%计算最大值与最小值之差 flag(2) = n ; end n
C# - Span 全面介绍:探索 .NET 新增的重要组成部分
前言 作为.net程序员,使用过指针,写过不安全代码吗?
为什么要使用指针,什么时候需要使用它?
如果能很好地回答这两个问题,那么就能很好地理解今天了主题了。C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的安全保障,即什么都不用担心;那如果我们需要操作的数据不在托管内存中,而是来自于非托管内存,比如位于本机内存或者堆栈上,该如何编写代码支持来自任意区域的内存呢?这个时候就需要写不安全代码,使用指针了;而如何安全、高效地操作任何类型的内存,一直都是C#的痛点,今天我们就来谈谈这个话题,讲清楚 What、How 和 Why ,让你知其然,更知其所以然,以后有人问你这个问题,就让他看这篇文章吧,呵呵。
what - 痛点是什么? 回答这个问题前,先总结一下如何用C#操作任何类型的内存:
托管内存(managed memory )
var mangedMemory = new Student(); 很熟悉吧,只需使用new操作符就分配了一块托管堆内存,而且还不用手工释放它,因为它是由垃圾收集器(GC)管理的,GC会智能地决定何时释放它,这就是所谓的托管内存。默认情况下,GC通过复制内存的方式分代管理小对象(size < 85000 bytes),而专门为大对象(size >= 85000 bytes)开辟大对象堆(LOH),管理大对象时,并不会复制它,而是将其放入一个列表,提供较慢的分配和释放,而且很容易产生内存碎片。
栈内存(stack memory )
unsafe{ var stackMemory = stackalloc byte[100]; } 很简单,使用stackalloc关键字非常快速地就分配好了一块栈内存,也不用手工释放,它会随着当前作用域而释放,比如方法执行结束时,就自动释放了。栈内存的容量非常小( ARM、x86 和 x64 计算机,默认堆栈大小为 1 MB),当你使用栈内存的容量大于1M时,就会报StackOverflowException 异常 ,这通常是致命的,不能被处理,而且会立即干掉整个应用程序,所以栈内存一般用于需要小内存,但是又不得不快速执行的大量短操作,比如微软使用栈内存来快速地记录ETW事件日志。
本机内存(native memory )
IntPtr nativeMemory0 = default(IntPtr), nativeMemory1 = default(IntPtr); try { unsafe { nativeMemory0 = Marshal.AllocHGlobal(256); nativeMemory1 = Marshal.
1 说明
java断言assert是jdk1.4引入的。
jvm断言默认是关闭的。
断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说“断言不具有继承性”。
断言只适用复杂的调式过程。
断言一般用于程序执行结构的判断,千万不要让断言处理业务流程。
2 判断eclipse是否开启了断言
代码如下:
public static void main(String args[]) { boolean isOpen = false; // 如果开启了断言,会将isOpen的值改为true assert isOpen = true; // 打印是否开启了断言,如果为false,则没有启用断言 System.out.println(isOpen); } 3 eclipse 中开启和关闭断言
选择菜单:run --> run Configurations
打开断言:-ea
关闭断言:-da,或者删除-ea
3 断言使用
3.1 第一种使用方法
/** * 断言的使用方法一 */ public static void useAssertExt1() { boolean isOk = 1 > 2; assert isOk; System.out.println("程序正常"); } 执行的结果如下:
Exception in thread "main" java.lang.AssertionError
at com.
本机环境是在myeclipse2017报错
错误信息可能是这样,很多时候碰到这样错误,不知道该怎么入手,下面是报空指向异常的其中一种情况
十一月 27, 2018 11:13:08 上午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [jsp] in context with path [/testjdbc] threw exception [An exception occurred processing JSP page /home.jsp at line 37
34: <td>鎿嶄綔2</td>
35: </tr>
36: <%
37: for(int i=0;i<user.length;i++){
38: %>
39: <tr>
40: <td><%=user[i].getUsername()%></td>
Stacktrace:] with root cause
java.lang.NullPointerException
at org.apache.jsp.home_jsp._jspService(home_jsp.java:155)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
作为一个内容运营,平日需要收集各种素材、资讯网站,一个收藏工具,极大提升了我的效率。
pinbox, 小众,国产,实用,美观, 良心!
pinbox不仅手机可以用,还可以和电脑/工作场景无缝对接。
首先值得一提的是它的颜值。
秉持着极简主义,这款应用令人一见倾心。
以紫色为基调,icon设计简约,有意在做减法。
布局美观,井然有序。
* 颜值★★★★★ 简约但不简单,专门为不同内容设置了三种模式: 卡片模式 特别适合收藏的图片内容,最棒的是,还可以还可以动图gif预览,简直不要太赞好吗!
列表模式 如果觉得卡片占地方又想看到主页的缩略图,那么列表模式是最好的选择。
极简模式 极简模式,整整齐齐,齐齐整整。强迫症、处女座福音!
* 易用性★★★★★ pinbox超容易上手,对技术盲来说,没有什么压力,只要你会左击鼠标,右击鼠标,你就可以收藏啦!
好看的小姐姐?快到我的碗里来!
有趣的网站?点下插件图标,收入囊中~
不会撩妹?好好学习,句句真言收入pinbox收藏集,稍后阅读、不时温习,情圣就是你啦
* 实用性★★★★★ 正如它极简主义的外观,pinbox没有什么花里胡哨的功能,只是专注地做好它的全局收藏。
利用快捷键可以迅速的打开收藏的内容一个键位对应一个网页,或者一个键位对应多个网页
亮点: 效率神器,快捷键让你一秒进入你收藏的网页。 这无疑是一个轻量级应用,手机app不到10M,而网页插件才17k多点,极力推荐大家手机和网页都下一个。 Pinbox
最后,欢迎大家和pinbox互撩吐槽侃大山
官方微博:weibo.com/pinbox
Pinbox 官网地址:withpinbox.com
转载于:https://juejin.im/post/5bfcb1595188257a5a24f03b
使用的IDLE:Intellij IDEA
Hadoop版本:3.1.1
看了网上各种解决方案,国内的国外的。很多都是说缺少相对应的jar包,要去网上下载更全更新的版本。也的确很多人这么做了,可还是没有效果,甚至还不得不把重复的旧jar包清除。
我意外发现了一个神奇的解决方案。因为根据提示,是DistributedFileSystem没有找到,我就在想会不会是之前添加的jar包不全,因为只加了
加载上面路径common文件夹下:
lib所有的jar包和hadoop-common-3.1.1.jar
加载上面路径hdfs文件夹下:
lib所有的jar包和hadoop-hdfs-3.1.1.jar
因此,我就把hdfs下的其他jar包都添加了进去,即
最后再运行就成功了
0 [main] DEBUG org.apache.hadoop.util.Shell - Failed to detect a valid hadoop home directory
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.
at org.apache.hadoop.util.Shell.checkHadoopHomeInner(Shell.java:469)
at org.apache.hadoop.util.Shell.checkHadoopHome(Shell.java:440)
at org.apache.hadoop.util.Shell.(Shell.java:517)
at org.apache.hadoop.util.StringUtils.(StringUtils.java:78)
at org.apache.hadoop.fs.FileSystem C a c h e Cache CacheKey.(FileSystem.java:3533)
at org.apache.hadoop.fs.FileSystem C a c h e Cache CacheKey.(FileSystem.java:3528)
at org.apache.hadoop.fs.FileSystem C a c h e . g e t ( F i l e S y s t e m .
效果图:
样式使用scss和flex布局
这也是制作IM系统的最后一个界面了!
在制作之前参考了qq和千牛
需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的
滚动条美化 ::-webkit-scrollbar { /*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1px; } ::-webkit-scrollbar-thumb { /*滚动条里面小方块*/ border-radius: 10px; -webkit-box-shadow: inset 0 0 5px rgba(228, 57, 60, 0.2); background: rgba(20, 20, 50, 0.6); position: absolute; } ::-webkit-scrollbar-track { /*滚动条里面轨道*/ -webkit-box-shadow: inset 0 0 5px rgba(228, 57, 60, 0.2); border-radius: 10px; background: #EDEDED; position: absolute; } 滚动条根据时机显示 其实这个也很简单 用的mouseenter 和 mouseleave事件
<div :style="{overflowY:messageScroll? 'auto' : 'hidden',paddingRight: messageScroll ?
Machine Learning System Design[机器学习系统设计] 主要涉及在设计复杂的机器学习系统时,可能遇到的主要问题。同时,我们也会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议。
具体而言,我们首先要讨论的是,当我们在进行机器学习时,着重要考虑的问题应该是什么。 Building a Spam Classifier[搭建一个垃圾分类器] Prioritizing What to Work On[确定优先级] 我们先来看看一个关于垃圾邮件分类的例子。
假如说,我们想要建立一个垃圾邮件分类器。[左侧]这里显示的是一封垃圾邮件,它想向我们推销一些商品,而且似乎看上去并不是什么正品。[右侧]而这里则是一封正常的邮件。
我们可以注意到,垃圾邮件常常有意地使用非正式的中文或者一些符号,比如这里的劳力士,这里的”力”实际上是日文的平假名”ka”,只是看上去跟中文的”力”比较相似,而处方药的”处”其实也主要在日语中使用,并不是常用的汉字。
而右侧正常的邮件中,显然是一封正常的邮件。
假设,我们现在已经有了一些标记过标签的训练集,包括标记了的垃圾邮件,使用
Y=1表示,也包括了标记了非垃圾邮件,使用y=0表示。那么我们如何使用监督学习来构建一个分类器以区分垃圾邮件和非垃圾邮件呢?
为了使用监督学习的方法,我们首先必须确定的是,如何从邮件中提取一些特征,并以此来构造邮件的特征向量x。给定特征x和标注y,那么我们就能够训练出某种分类器,比如,我们可以用逻辑回归。
现在我们来思考下可能会有用的特征有哪些。比如,我们可能会想出,可能可以挑选出100个具有明显指示性的词来区分垃圾邮件和非垃圾邮件。
比如说,如果有封邮件,包含了词”优惠”,它可能更有可能是一封垃圾邮件,而同时如果它还含有”购买”这样的词,那么它就像是一封垃圾邮件。而如果邮件包含了我们的真名,那么这可能是认识我们的人写的邮件,这可能就意味着这封邮件不是一封垃圾邮件。也许通过观察,我们可能会认为”立刻”这个词并不是一封垃圾邮件,因为我们可能处于关键岗位,常常会收到比较紧急的邮件。 当然,可能还会有其他的词,我们可以选出这样成百上千的词。
给定这样的一封邮件,我们可以将这封邮件使用特征向量的形式表示它。比如我们按照上面的词典,检查一下这些词是否出现在我们的邮件中,然后我们就可以以此来定义一个特征向量x来表示右边这封邮件,邮件中没有出现我们的名字,所里这里是0. 这里出现了”购买”,所以这里我们填1,这里我们仅关心词是否出现与否,所以即使邮件中出现了两次”购买”,我们也只填1,所以我们的整个特征向量的元素要么是0要么是1.
所以,我们依据词出现与否来构建表示邮件的特征。在这个例子中个,因为我们限定了词典的大小,也就是100,所以我们最终构建出来表示邮件的特征向量的就是一个100维的向量。所以,简单归纳起来,对于每一个xj而言,它的取值就是0或者1,而具体取值则是看第j个词是否在邮件中出现。
顺便说一下,虽然我们所描述的这个过程是我们自己挑选的100个词,但是在实际当中,最普遍的做法是遍历整个数据集,然后选出出现次数最多的n个词,而n一般至少介于1万到五万之间。然后将它们作为我们要用的特征,因此就并不需要我们手动选取这些词。这样,我们就可以很容易地来构建邮件的特征了。
现在,如果我们正在建设一个垃圾邮件分类器,我们应该会面对这样一个问题,那就是,如何在有限的时间和精力下,改进我们的学习算法,从而使得我们的垃圾邮件分类器具有较高的精准度。一种直觉是,我们应该收集大量的数据,事实上确实有好多人这样做,很多人认为数据越多算法表现就越好。就垃圾邮件分类这个应用而言,有一个被称为“蜂蜜罐”的项目,它可以构造很多假的邮件地址,同时故意将这些邮件地址透露给发送垃圾邮件的人,这样就可以轻松地获取到大量的垃圾邮件样本了。而在其他一些领域,比如新闻分类,可以通过编写爬虫去抓取诸如网易新闻、今日头条的数据以获得标注好分类的新闻数据。
不过,我们从之前也学习到,获取更多的数据,对于改善算法的性能,可能有帮助也可能没帮助。不过对于大多数机器学习问题,还有很多其他的办法来提升机器学习的效果。比如对垃圾邮件而言,也许我们可以想到,可以使用更加复杂的特征,比如邮件的路由信息,路由信息的含义是它从发送者到我们这里,中间经过了哪些服务器,这种信息通常包含在邮件的头信息中。所以,当垃圾邮件发送者发送垃圾邮件时,它们总会试图让这个邮件的来源变得更加模糊,或者伪造邮件头信息,或者使用非常不常见的邮件服务器来发送。因此,我们可以想象,通过分析邮件的头信息,并从中提取出更加高级、复杂的特征来获取一系列的邮件路由信息,进而判断这是否是一封垃圾邮件。
我们当然也可以继续想到更多高级的特征。
实际上,当我们面对机器学习问题时,总是可以“头脑风暴”一下,想出一堆方法来试试,就像我们这里列举的。不过这些方法的效果是不确定的,而且怎么选择也是个问题,至少没有什么理论。不过我们还是可以总结一些方法论来帮助我们更加高效地工作。比如,我们下面开始要讨论的误差分析。
Error Analysis[误差分析] 误差分析会帮助我们更加系统性地做出决定,帮助我们了解数据以及目前学习算法可能存在的不足。
所以,如果要开展一个机器学习工作,一般来说最好的实践方式是,从一个可以快速实现的最简单的算法开始,比如花一天时间来快速地搭建出一个可以运行的简单系统,即使效果不好也无所谓。一旦我们完成这项工作,我们可以画出学习曲线,这个我们在前面的课程讨论过,通过画出学习曲线,我们可以观察训练集误差和交叉验证集误差,然后我们就可以找出我们的算法是否有高bias问题,或者是否有高variance问题,或者什么别的问题。在这样分析以后,我们就可以决定是否需要获取更多的训练样本,或者加入更多的特征,或者其他手段来提高算法的效果。
这样做的原因在于,在刚接触机器学习问题的时候,我们无法知道是否需要更复杂的特征,是否需要更多的样本,甚至是否需要更加复杂的算法。想一开始就知道要用什么样的特征,使用什么样的算法,需要多少样本量,这本身就是很困难的事情。因为,一开始我们没有任何可用的信息,除了要解决的问题本身。所以,一开始我们根本没办法决定应该把时间花在什么样的地方来提高算法的效果。不过,当我们实践了一个即使非常简单、不完美的算法后,通过画出学习曲线,我们就有了很多信息来决定下一步应该干什么。所以,通过这种方法,我们可以避免所谓的过早优化问题,这个的意思是,一开始没有什么信息的情况下,不要想太多,先用一个简单的模型试试看,然后就可以得到更多的信息,通过这些信息我们就能够知道应该怎么进行下一步,有的放矢地前进,而不仅仅是凭着直觉来决定下一步应该做什么,毕竟直觉不总是正确,而这种方法则是一种比较有保证的工作方式。
除了画出学习曲线,另一件非常有用的事情就是误差分析。误差分析的意思是,在我们构建机器学习系统时,比如搭建一个垃圾邮件分类器时,我们可以人工地看看交叉验证集中被算法错分的样本究竟是什么样子。所以,通过这些被算法错分的邮件,我们可以发现某些系统性的规律,什么类型的邮件总是被错分,一般来说这么做了以后,我们常常可以得到启发,并可以构造出新的特征来解决这类错分,或者也可以发现现有的特征可能存在着一些我们事先没有预料到的意外问题,比如之前我们说”立刻”一词可能是正常邮件的一种暗示,这个是基于我们的先验知识,即我们常常收到比较紧急的邮件,但是我们在进行误差分析的时候可能发现,很多广告信息中会含有”立刻购买”,”立刻拨打电话”等字样,甚至出现频率远远高于正常邮件。对于这种情况,我们可能就可以通过分析错分样本得到启发。
具体地,我们来看这个例子。假设现在我们已经搭建了一个垃圾邮件分类器,然后有一个拥有500个样本的交叉验证集。假设在这个例子中,我们的算法有非常高的误差率,它错分了100个交叉验证集中的样本。那么在这种情况下,我们需要做的事情是,人工地检查这100个错误分类,然后人工地将它们归类,这种归类并没有固定的模式,需要我们人工总结,比如这些邮件是什么类型的,然后针对它们,什么样的特征能够解决这种错分。
比如,我们检查这100个错分样本,我们发现大部分都是药品销售的广告,还有不少是卖仿品的,比如假表、假包,然后也有一些试图窃取我们密码的钓鱼邮件。所以,我们在检查这些样本并分类的时候,我们一边分类,一边对它们进行计数。比如,我们可能发现有40封是和卖药相关的,25封是关于销售仿品的,还有7封是试图窃取我们密码的钓鱼邮件。剩下的28封是其他类型的。 通过对这些类别进行计数,我们可能发现,我们的算法在针对卖药相关的邮件时,分类效果非常差,这说明我们应该花更多的时间来研究这种类型的邮件,然后看看是否能够通过构造更好的特征来正确区分这种类型的邮件。
同时,我们还要做的是,看看哪些特征可能会帮助算法正确地对这些邮件进行分类。所以假设我们有如下的一些特征来帮助算法做得更好:比如故意使用非正常字符,全角半角混用,不正常的路由,不常用的符号。那么,我们可以人工地检查这100封邮件,看看这些特征能命中多少封邮件。比如故意使用非正常字符的有5封,不正常路由的有40封,30封不常用的符号。如果我们通过交叉验证集中的错分样本得到了这样的结果,那么这可能说明故意使用非正常字符的其实没多少,不值得我们先花时间来引入这个特征。但我们发现有非常多的垃圾邮件的路由信息都不正常,那么这就是一个很强的特征,说明我们应该优先花一些时间来开发这个特征。
所以,这种类型的误差分析,其实是一种手动检测的过程,可以检查算法可能会犯的错误。这经常可以帮助我们找到更为有效的手段来提高算法的效果。这也说明了,为什么我们一开始说要先实践一种快速、简单但可能不完美的算法。我们真正想要做的,其实是想更加深入地理解我们所面对的问题,通过这种方式,我们可以有针对性地来理解我们的问题,特别是数据。这样我们可以知道这个问题到底是怎样的一个问题,已有的数据对于解决这个问题存在着什么样的障碍。所以,通过这些工作,我们就可以明确出我们通向真正目标的道路应该是怎样的了。
最后,我们要说的是,当在构造机器学习算法时,另一个有用的小窍门是,确保我们有一个数值型的指标来评估我们的学习算法。这个意思是,如果我们在构造机器学习算法时,如果我们能有一个数值型的指标来评估算法性能的话,这将是非常有用的。这意味着,每当我们对算法做了修改的时候,我们都能清楚地知道这种修改带来的变化是怎样的,是使得算法更加有效了,还是使得算法性能变差了。我们会在稍后更加详细地讨论评估指标,这里我们先看一个简单的例子。
假设说,我们试图决定是不是要将全角字符都转换成半角。全角转半角其实在文本数据处理,特别是中文文本数据处理中,是一个非常常见的功能,特别是对于unicode而言,可以用非常简单的几行代码来完成这个任务。不过,全角字符转换成半角字符是否真的能帮助算法在这个问题中提高分类效果呢?这在实际使用前是难以判断的。特别地,即使我们在误差分析中觉得可能会很有效果,但这并不是一种绝对的保证,而是一种有依据的指引。所以,最终决定是否有效的方式是,快速地将这个特征加入到算法中,然后试试看是否能够帮助算法做得更好。
所以,为了能够知道效果是否变得更好,我们就需要一个数值型的指标来评估我们的模型。那么具体而言,我们可以在交叉验证集上看看使用全角转半角和不使用它,这两种情况下的各自错分率是多少。所以,如果我们不使用全角转半角,我们的错分率假如说是10%,然后我们使用全角转半角,再次运行,发现再交叉验证集上的错分率下降到了5%。那么这就说明,全角转半角对我们的这个应用非常有效。所以,对于这个小例子,我们使用了错分率这么一个单一的数值化指标来衡量算法的性能。
我们后面会发现,这个例子中的评估指标有时候还需要做一些处理才能发挥真正的衡量作用。
所以,当我们在开发一个机器学习算法的时候,我们总是会尝试很多各种新想法,实现很多版本的学习算法。如果每一次,我们都手动检查样本是否表现得好还是坏的话,那么这很难让我们决定是否应该做这样的改变。但是,通过一个数值化的指标,我们可以仅仅看看这个数字,来判断算法的效果变好了还是变差了。这样我们就可以快速地实验各种想法,它可以非常直观快速地告诉我们这些想法是否有效。
所以,我们非常推荐在交叉验证集上进行误差分析,不过有些人还是会在测试集上做这种误差分析。因为在数学上,在测试集上做误差分析并不是那么严格有效。所以,大家在实践的时候尽量应该在交叉验证集上做这种误差分析。
最后,我们稍微总结一下。在开始处理一个新的机器学习问题时,我们总是建议,首先快速实现一个较为简单的算法,而不是一开始就花很长时间来决定应该采用什么样的算法。那么当实现这个简单算法以后,它将会成为一个非常有力的工具来帮助我们决定下一步应该要做些什么。因为我们可以看看算法造成的错误,通过误差分析,来看看算法都犯了什么样的错误,然后决定优化方法。另一件事情是,假设我们有了个快速实现的算法,又设定了一个数值化的评估指标,那么这就会帮助我们有效地尝试各种新的想法,并决定留下什么、放弃什么。
Handling Skewed Data[处理有偏数据] Error Metrics for Skewed Classes[有偏类别的误差指标] 前面我们讨论了怎么进行误差分析,同时也讨论了设定误差衡量指标的重要性,那就是设定单个数值化的衡量指标来评估我们的学习算法,可以帮助我们很好地进行算法的迭代。
不过有时候,我们对于选择什么样的指标来衡量学习算法是需要细致考虑的。因为它可能会对我们的工作造成非常微妙的影响。这种时候一般都是遇到了“有偏数据”。
考虑之前癌症分类的问题。我们有病人的特征数据,我们希望对他们进行诊断,看看他们是否真的患有癌症。所以这非常类似我们之前讨论过的恶性肿瘤和良性肿瘤的分类问题。那么,我们假设y=1表示病人患有癌症,y=0表示病人没有癌症。我们训练一个逻辑回归模型,假设我们在测试集上的错分率仅有1%。也就是说我们的诊断99%都是正确的。这看上去是个非常不错的结果,因为我们99%的情况下都给出了正确的诊断。但是,假如我们发现在测试集中,仅有0.5%的人真的患有癌症。那么在这种情况下,1%的诊断错误率就显得不是那么好了。举个例子,我们在诊断时,压根不考虑病人的具体情况,一律认为病人不患有癌症,那么这仅仅需要一行代码,甚至都不是机器学习,那么这个分类器或者说诊断器的错分率就仅有0.5%!因此,这么看它甚至优于前面训练的逻辑回归,因为逻辑回归的错分率是1%。
这种情况一般都是因为,某一类本身出现的概率就非常小,整个数据集表现出类别分布极不均匀的情况。这种情况,被称为“类别有偏”(skewed classes)。
所以,单纯使用错分率来作为算法的性能评估指标,就会产生这样的问题。假设,我们实现算法的准确率是99.5%,也就是0.5%的错分率。我们在对算法进行了一些修改后,我们得到了99.8%的准确率,也就是0.2%的错分率。那么这个修改是不是对算法的一个提升呢?逻辑上,我们使用单一的数值化的评估指标可以快速的帮助我们确定对算法的修改是否有效。但是,当我们遇到类别有偏的情况时,我们这种评估其实就有漏洞,因为这个指标对于直接认为所有分类都是y=0或者y=1的情况具有非常高的评估。所以,对于类别有偏的情况,只使用单一的数值指标并不能很好地衡量算法的性能。
所以,当我们遇到类别有偏的情况时,我们需要一种不同的评估方案来对算法的性能进行评估。
在业界,常常使用的一种评估方案是,使用准确率和召回率来进行评估。我们来看看它们分别是什么意思。
假设我们正在测试集来评估一个二分类模型。那么,对于测试集中的样本真实标签,要么是0,要么是1。而我们的学习算法做的是,对于测试样本进行预测,预测的值也是0或者1。所以基于这些值,我们可以画一个2*2的表格。 这些格子对应不同的情况。比如,过有一个样本它实际的分类是1,学习算法预测的标签也是1,那么我们就称它是真正的,或者True Positive。这里Positive表示是正类,也就是预测的类别标签是1,而True表示的是这个预测是正确的。而如果我们的算法预测某个样本是负类,也就是类别标签是0,而它真实的类别标签也是0,那么我们就成这种是真负的,或者True Negative。这里的Negative表示的是负类,也就是预测类别标签是0,而True表示的是这个预测是正确的。
互联网时代,信息爆炸,我们如何筛选出有用的信息呢?
要获得有用的信息,那么信息源头就非常重要。
目前我们经常用的信息源有微信公众号、微博、朋友圈、今日头条等。
这些都属于公开的信息,可能有用,但是太杂乱。
有句话说的好,真正赚钱的东西,都不会被分享出来的。
知识星球作为一个私密的付费社群工具,在这些公开的信息层面上,又对信息有了进一步的解读,也就更有价值。
某些知识星球的信息,可能在外面是完全看不到的,价值更高,下面给大家介绍一些比较优质的知识星球:
1、《粥左罗和他的朋友》一天 24 小时,除去上班和睡觉,还有 8 小时,希望你每天都能进来 1 小时,每天睡前,都要比早上醒来的时候更强一点,365 天后你就是你最大的惊喜——高手的战略,是持续性和稳定性。http://www.zsxq100.com/study-everyday/
2、《刘润进化岛》:中国最好的商业顾问之一,刘润老师,为所有渴望跟上时代变化、成为领先者的人,建立了一个属于我们自己的“进化岛”。让我们一起在岛上不断进化。http://www.zsxq100.com/liurun/
3、《第一桶金研究所》前美团产品经理,麦当劳改名金拱门,一小时赚15000当时人,徐梦阳的星球:http://www.zsxq100.com/how-to-get-your-first-million/
4、《运营狗的工作日记》网易运营总监,12 年运营从业经验,畅销书《超级运营术》作者韩叙的星球:http://www.zsxq100.com/operating-work-diary/
5、《二爷书友会》十年资深产品人,「无码科技」产品经理,千万级用户产品缔造者邱岳的星球:http://www.zsxq100.com/erye-readbooks/
6、《计算广告》大数据仁波切,《计算广告》作者刘鹏老师的星球:http://www.zsxq100.com/compute-ad/
7、《小道消息和他的朋友们》互联网清明上河图,小道消息作者冯大辉的星球:http://www.zsxq100.com/webnotes/
8、罗辑思维营销外脑 | 小马宋战略营销圈:http://www.zsxq100.com/xiao-ma-song/
9、《真知拙见KnowledgeHot》汇集了几十位知乎优秀答主,涉及领域:化学、生物、作家、金融、经济、医学、心理学、法律、黑客安全、计算机、人工智能等的星球:http://www.zsxq100.com/knowledgehot/
10、《MacTalk 的朋友们》极客时间总裁池建强老师的星球:http://www.zsxq100.com/mactalk/
11、《帅张和他的朋友们》Android 开发出身,但是跳出技术思维开挂的stormzhang:http://www.zsxq100.com/stormzhang/
12、《caoz 的小密圈》互联网百晓生《你凭什么做好互联网》作者曹政的星球:http://www.zsxq100.com/caoz/
13、《生财有术》前阿里运营、现创业者,孵化了估值过亿项目、众多优质小程序,亦仁的星球:http://www.zsxq100.com/earn-money-is-so-easy/
14、《一碗梁粉和他的朋友们》在行 9.5 分的超高评价,公众号《社群那些事》创始人梁文斌的星球:http://www.zsxq100.com/community-work-you-need-it/
15、《老关的营销圈》一篇文章卖掉35.8万啤酒,《爆款文案作者》关健明的星球:http://www.zsxq100.com/laoguan/
16、《中美增长营销圈》前「衣二三」市场总监,前支付宝北美市场运营负责人Doriskeke的星球:http://www.zsxq100.com/china-and-us-marketing/
17、《数据淘金》不用写代码的爬虫课作者明白的星球:http://www.zsxq100.com/webscraper/
18、《招聘 / 求职 / 跳槽》平时不要看,一看就有用 ,小道消息fenng的星球:http://www.zsxq100.com/zhaopin/
19、《知识星球用户增长》中科院硕士「给赞」小程序联合创始人条形马的星球:http://www.zsxq100.com/user-growth/
20、《裂变增长实验室》4 天裂变 10w 粉,前唯库,有讲,知识付费平台的用户增长官王六六的星球:http://www.zsxq100.com/liebian/
21、《韩利深夜聊运营》大街网运营副总监,原网站运营 108 将个人站长。互联网产品运营知识一网打尽思维导图作者的星球;http://www.zsxq100.com/hanli/
22、《每日运营热点案例》运营深度精选CEO,「网易戏精课」「三联生活周刊」操盘手鉴锋的星球:http://www.zsxq100.com/daily-operating-hot-case/
23、你想要的互联网行业报告,这里都有 | 行研社:http://www.zsxq100.com/reports/
24、《数据城堡》,知乎大V一个有诗意的数据科学家增加的星球:http://www.zsxq100.com/data-castle/
25、《数据和黑科技》新榜数据分析师、产品经理,懂点编程的黑稿写手张佳的星球:http://www.zsxq100.com/data-tech/
26、《思维导图妙思屋》竖屏导图创始人,笔记侠思维导图分舵舵主小猫妮的星球:http://www.zsxq100.com/thought-help-you-success/
27、《嘀嗒嘀嗒》硅谷天才少女, 前 Airbnb 技术经理安姐的星球:http://www.zsxq100.com/dida-dida/
28、《微信公众号互助小组》小道消息fenng的星球:http://www.zsxq100.com/gongzhonghao/
29、《小程序淘金》小道消息fenng的星球:http://www.zsxq100.com/xiaochengxu/
30、《新媒体玩法大全》新媒体研究者 · 社群玩家 · 朴禅创始人V先生的星球:http://www.
今天在安装VMware遇到了千奇百怪的错误,感觉踩了所有的雷,在这里总结一下,方便大家解决:
1、驱动程序“vmx86.sys”的版本不正确。请尝试重新安装 VMware Workstation 第一次安装的是VMware的14版本,在安装好之后创建虚拟机,该虚拟机用的CenOS-6.8的系统,然后在启动的时候就报上面的错,尝试了很多解决方法,最后决定降版本,卸载当前版本的VMware,重新安装版本。
在安装12版本时又遇到了以下问题:
如果报错不支持降级,无法安装,那就是之前的版本没有删除干净,可以下载VMware Install Cleaner来确保全部删除。
2、无法启动服务vmware authorization service 这个问题解决方法如下:
打开注册表:regedit 删除如下路径下目录 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmx86
删除这个目录以后我尝试安装,又报以下问题:
3、无法安装服务vmware workstation server 这个问题我的解决方法是删除C:\ProgramData\VMware和C:\Program Files (x86)\VMware这两个VMware文件夹
最后,也是最重要的,执行完上面的步骤以后,也就是说把该删的删除之后,最重要的是要重启电脑,不然会重复报2、3错,永远无法安装,说到底还是要一次性删除干净,最后重启电脑,安装,搞定。
直接贴代码吧
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js字符串拼接onclick出现的问题</title> </head> <body> <div id="box"> </div> <button onclick="show('a');show2('aa','bb')">一个onclik两个方法</button> </body> </html> <script> function show(v) { alert(v) } function show2(v1,v2) { alert(v1) alert(v2) } function show3(v) { alert(v.name) } var arr = [ { name: 'wangwu', age: 23, hight: [180, 180, 180] }, { name: 'zhangsan', age: 22, hight: [180, 160, 180] }, { name: 'lisi', age: 21, hight: [180, 170, 180] } ] //传递一个参数 // var ht = '<button onclick=show("
关键字:电能质量,事件记录,能耗监控,能效管理,冻结数据,三相四线,三相三线,导轨,电能表,电网质量分析,电能质量监测,热工采集,远传数据采集,云平台;
深圳市友先达电子有限公司
www.szyxd19.com
主要功能 ◆交流终端:计量功能,正反向有功无功,四象限无功;精度0.5s级
◆2路热工量采集:4-20ma,精度1%;
◆2路遥信输入;
◆1路继电器输出节点;
◆两路RS485,一路红外;
◆上行以太网,RS485;
◆事件记录功能;
◆电能质量分析监测:频率偏差;电压偏差;电压不平衡率;公用电网谐波(最高51次);公用电网间谐波;电压波动与闪变;暂时过电压和瞬态过电压;电压跌落和暂时中断;
◆数据冻结功能:时冻结;日冻结;月冻结;约定冻结;
◆通讯协议支持645和modbus
◆负荷记录功能:热工量,电压电流;
功能详述:
1电能计量 具有正、反向有功电能计量、存储功能,并且可以根据有功组合方式特征字计算组合有功电能量。
2状态量采集 标配2路遥信量输入接口,可以监测门接点或开关接点信号。
3热工量(非电气量)采集 带热工型功能的终端具有抄读温度、湿度、压力、流量等模拟量数据,直流模拟量测量准确度优于±1%。
4控制输出 1路带常开常闭触点的继电器输出接口,触点容量:250VAC/5A,寿命不低于105次。
5数据存储 曲线数据 曲线数据的数据采集间隔时间可设置,默认间隔为15min(最短间隔1min),默认保存最近7d的数据,采样数据项:
正反向有功、无功,四象限无功,需量;A、B、C各相电流、电压;A、B、C各相及总有功功率、无功功率、功率因数;非电气量数据;基波功率、总谐波功率;电压、电流的总、分次谐波(2-50次)含有率;频率;电压、电流不平衡度。 日数据 日冻结时间可设置,默认每日24点冻结,默认保存最近2个月数据,采样数据项:
总有功电量; 总无功电量;最大需量; A、B、C相电压越下限、越上限累计时间,上、下限指标可设置。 月数据 月冻结时间可设置,默认每月月末24点冻结,默认保存最近36个月数据,采样数据项:
总有功电量;总无功电量;A、B、C相电压越下限、越上限累计时间;最大需量及其发生时间。 6冻结数据 1.1定时冻结:按照约定的时间及间隔冻结电能量数据;每个冻结量保存 12次。
1.2瞬时冻结:在非正常情况下,冻结当前的日历、时间、所有电能量和重要测量量的数据;瞬时冻结量保存最后 3次的数据。
1.3日冻结:存储每天零点时刻的电能量,可存储两个月的数据。
1.4整点冻结:默认时间间隔为1小时,默认冻结正向有功总电能。
7事件记录和报警 事件及报警功能可配置,事件包括:
ABC电压偏差越限事件记录、谐波越限事件记录;ABC电压、电流不平衡越限记录;功率因数越限记录;闪变事件记录(长时、短时);上电、掉电、电量示值清零、断相ABC、参数设置、校时事件记录;ABC相失压、全失压,ABC相失流事件记录、非电气量数据异常事件等。
附表:终端型号与配置对照表 终端型号
YXD741-I型
YXD741-II型
YXD741-III型
YXD741-IV型
YXD741-V型
备注
终端功能
热工型(Ⅰ型)
热工电量型(Ⅱ型)
基本电量型(Ⅲ型)
谐波电量型(Ⅳ型)
电能质量电量型(Ⅴ型)
非电气量测量
流量
√
√
温度
√
√
压力
√
在自己开发项目的时候,莫名其妙的缺失了node_modules文件,我的解决办法是在项目文件夹下执行
指令
结果:
同时也增加了package.json和package-lock.json文件
通过intent实现不同APP间跳转 通过了解APP间的跳转,加深对于intent的理解
首先需要APP1和APP2,然后在APP1中activity中添加一个点击事件,希望跳转到APP2的activity中。
APP1跳转代码:
Intent intent = new Intent(); //跳转其他APP的固定页面,需要APP的包名,activity的全路径 //在要跳转的APP的activity的配置添加 android:exported="true",将activity暴露出来 ComponentName name = new ComponentName("com.wj.app2","com.wj.app2.activity.ReceiveActivity"); intent.setComponent(name); startActivity(intent); APP2中对ReceiveActivity进行配置,在Androidminifest.xml中
<activity android:name=".activity.ReceiveActivity" android:exported="true"/> 注意两点:APP1中的activity是全路径,APP2中不要忘记将ReceiveActivity暴露出来。exported
基础: Human Pose Estimation人体姿态估计综述调研人体姿态估计数据集整理(Pose Estimation/Keypoint)姿态估计的两个数据集COCO和MPII的认识 Human Pose Estimation 101 :https://github.com/cbsudux/Human-Pose-Estimation-101
https://github.com/cbsudux/awesome-human-pose-estimation
https://wemedia.ifeng.com/69116016/wemedia.shtml
https://blog.csdn.net/chenyuping333/article/details/82901638
[行为检测|论文解读]行为检测调研综述
论文: 2D姿态估计 Learning Human Pose Estimation Features with Convolutional Networks - Jain, A., Tompson, J., Andriluka, M., Taylor, G.W., & Bregler, C. (ICLR 2013)
DeepPose: Human Pose Estimation via Deep Neural Networks - Toshev, A., & Szegedy, C. (CVPR 2014)
Joint Training of a Convolutional Network and a Graphical Model for Human Pose Estimation - [CODE] - Tompson, J.
一、Mysql 读取锁的实现方式之 : SELECT ... FOR UPDATE
举个例子:
假设商品表单products 内有一个存放商品数量的quantity ,在订单成立之前必须先确定quantity 商品数量是否足够(quantity>0) ,然后才把数量更新为1。代码如下:
SELECT quantity FROM products WHERE id=3; UPDATE products SET quantity = 1 WHERE id=3;
于是我们在MySQL 就可以这样测试,代码如下:
SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE;
此时products 数据中id=3 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
SELECT * FROM products WHERE id=3 FOR UPDATE 如此可以确保quantity 在别的事务读到的数字是正确的。
UPDATE products SET quantity = '1' WHERE id=3 ; COMMIT WORK;
提交(Commit)写入数据库,products 解锁。
二、为什么不安全呢?
使用meta标签:viewport H5移动端页面自适应普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统。
视是用户网页的可视区域。翻译为中文可以叫做“视区”。
手机浏览器是把页面放在一个虚拟的“窗口”,(视口)比屏幕宽,这样就不用把每个网页挤到很小的窗口中这样会破坏没有针对手机浏览器优化的网页的布局),用户可以通过平移和缩放来看网页的不同部分。
viewport标签极其属性:
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> 每个属性的详细介绍:
TensorFlow的cpu安装非常简单,只要输入命令pip install tensorflow即可。下面介绍的是安装gpu版本的TensorFlow。
安装cuda
在安装cuda之前,首先得确定你的显卡驱动安装正确,而且要下对应的版本,打开NVIDIA控制面板,点击帮助,在点击系统信息,点击组件,我的版本是cuda9.2,网上很多教程都没有说到这一块,所以我在这研究了一天才解决,你得根据你电脑的显卡下载对应的版本。下载好之后直接点击安装默认路径就行,接着在下载cuddn v7.4。
cuddn下载后解压得到如下三个文件夹
三个目录的文件分别为
将相应的bin、include、lib分别放于自己的cuda下面的相应目录中,cuda默认目录为C:\ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v7.5,因此将刚才解压的文件放在这个目录下面的bin、include、lib文件夹下。例如将cudnn64_7.dll复制到bin目录之下:
至此,CUDA安装完毕。
2. 安装Anaconda2
我安装的版本是python2.7版本,如果你的电脑是python3.6的话也可以,这里有一篇文章,Windows10下python3和python2同时安装。安装比较简单就不在叙述。
3. 安装TensorFlow-gpu
打开命令提示符,使用命令pip install tensorflow-gpu 进行安装。这时你会发现 安装很慢,而且很容易出现安装出错,所以我这里换一种安装方法。下载tensorflow_gpu-1.8.0-cp27-cp27m-win_amd64.whl文件,这个安装包只能用python2.7版本安装,其他的版本网上有很多下载链接就不在提供地址了。
下载好之后将目录指定到tensorflow_gpu-1.8.0-cp27-cp27m-win_amd64.whl文件目录下,记住一定要是英文目录,不能出现中文字。输入命令pip install tensorflow_gpu-1.8.0-cp27-cp27m-win_amd64.whl
4. 这时候你可能会出现如下错误
这个错误是由于futures版本过低的原因,需要重新安装,但是你会发现想要卸载futures都会出错,这里教一个小技巧,找到你python的安装路径D:\mysoft\Anaconda2\Lib\site-packages(这是我安装的路径),在此路径下删除futures文件
然后重新打开命令窗口输入命令pip install futures==3.1.1
安装成功后再重复第3步重新安装TensorFlow。到此安装结束。
5. 测试TensorFlow是否安装成功
重新打开命令窗口输入python命令,再输入import tensorflow,如果没报错就证明安装成功了。
设计FHS(Filesystem Hierarchy Standard)的目的主要是为了给Unix-like系统的管理员提供一个管理系统以及目录结构的一个参考。
FHS实际上仅是规范在根目录(/)下面各个主要目录应该放什么样的文件。FHS定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如/etc应该要放置设置文件,/bin与/sbin则应该要放置可执行文件等等。
基本简介 因为Linux的开发人员实在太多了,如果每个人都使用自己的目录配置方法,那么将可能会带来很多管理问题。你能想象,你进入一个企业之后,所接触到的Linux目录配置方法竟然跟你以前学的完全不同吗?很难想象。所以,后来就有所谓的文件系统层次标准(Filesystem Hierarchy Standard,FHS)出台。
第二层则是针对/usr及/var这两个目录的子目录来定义。例如/var/log放置系统登录文件、/usr/share放置共享数据等等。
定义 由于FHS仅是定义出最上层(/)及子层(/usr, /var)的目录内容应该要放置的文件数据,因此,在其他子目录层级内,就可以随开发人员自行配置了。举例来说,FC4的网络设置数据放在/etc/sysconfig/network-script/目录下,但SuSE Server 9则是将网络放在/etc/sysconfig/network/目录下,目录名称是不同的。
另外,在Linux中,所有的文件与目录都由根目录/ 开始。那是所有目录与文件的源头。然后再一个一个分支下来,有点像树状。因此,我们也称这种目录配置方式为:“目录树(directory tree)”。
FHS标准使得众多的Linux发布包有了可以遵循的标准,使得软件和用户可以预测已经安装了的文件和目录的位置。它定义了如下的内容
定义了文件系统中每个区域的用途 定义了所需要的最小构成的文件和目录 给出了例外处理和矛盾的特殊例子 FHS根据文件的可共享、不可共享、静态和动态等特点,将目录树架构分为/、/usr、/var三部分。
/ 根目录是整个系统最重要的一个目录,因为在Linux系统中所有的目录都必须挂载在根目录下,也即所有的目录都是由根目录衍生出来。系统开机是所需要的开机软件、内核文件、函数库等都必须在根目录下。因此FHS也建议根目录不要安装在非常大、数据存取非常活跃的分区上,如此一来就能尽可能地降低系统不必要的错误。建议:根目录越小越好,且应用程序安装目录不要和根目录放置于同一分区。根目录下一般建议由以下耳机子目录:
/bin 供所有用户使用的基本命令程序文件
/sbin 系统管理员使用的工具程序
/boot 引导加载器(bootloader)必须用到的静态文件:kernel、initramfs(initrd)、grub等
/dev 存储特殊文件或设备文件: 字符设备(线性设备)、块设备(随机设备)
/etc 系统程序的配置文件(只能为静态的,不能是二进制)
/lib、/lib64 为系统启动或根文件系统上的应用程序(/bin, /sbin)提供共享库(libc.so.* ld*),以及为内核提供内核模块(modules)
/media 便携式设备的挂载点,cdrom、floopy等
/mnt 其他文件系统的临时挂载点
/opt 第三方程序的安装位置,可选路径;
/srv 当前主机为服务提供的数据
/tmp 为那些会产生临时文件的程序提供的用于存储临时文件的目录
/usr user hierarchy 全局共享只读数据路径
/var var hierarchy存储常发生变化的文件
/proc 内核级进程存储其相关信息,多为内核参数,例如net.ipv4.ipforward虚拟为net/ipv4/ipforward,存储于/proc/sys
/sys sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;为管理内核提供了一种统一模型的接口
/usr 根据FHS建议软件安装后将他们的数据合理地分别放置到这个目录下,而不要自行新建该软件自己的独立目录。/usr放置的数据属于可分享的且不可变动的,/usr可分享给局域网内的其他主机来使用。
/usr/bin
/usr/sbin
/usr/lib
/usr/lib64
/usr/include C程序头文件