<script> /* *函数作用域 * - 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁 * - 每调用一个函数就会创建一个新的函数作用域,他们之间是互相独立的* * - 在函数作用域中可以访问到全局作用域的变量 * - 在全局作用域中无法访问到函数作用域的变量(声明) * -当在函数作用域中操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用 * 如果没有则向上一级作用域中寻找,直到找到全局作用域。 如果全局作用域中依然没有则会报错ReferenceError */ //创建一个变量 var a = 10; function fun(){ var a = 我是函数中的变量a; var b = 20; console.log(a =+a); } // fun();//显示 // console.log(b =+b);//在函数中声明在全局中访问 /* *若想再在函数中找全局中的a----输入window.a方可打印全局的a的值--使用window对象 */ /* *在函数作用域中也有声明提前的特性, * 使用var关键词声明的变量,会在函数中所有的代码执行之前被声明 function fun3(){ var a; console.log(a); a = 35;//var a;a=35是未赋值的 } fun3(); */ /* *函数声明也会在函数中所有的代码执行之前执行、、相当于函数中的全局声明函数,,,,只是周期短fun3()调用完了就执行完了。但在全局中声明函数周期是script */ function fun3(){ fun4(); // console.
Esther是一个小型团队的管理者,大家都很喜欢她。她亲切友好,彬彬有礼,又善解人意。她是解决问题的能手,习惯将挫折看作是机遇。她对工作十分投入,还能鼓励同事保持平静。有了这样一个容易相处的下属,她的上司感到很幸运,也常对Esther的高情绪智力(emotional intelligence,EI)赞赏不已。Esther自己也认为情绪智力是她的强项之一,也很欣慰自己在领导力发展过程中不必在这方面多花功夫。但奇怪的是,虽然Esther总是那么乐观,但她却开始觉得自己的事业已经停滞不前。她的表现未能达到公司的要求。她开始心想:“情绪智力也不过如此。”
Esther和她的上司所陷入的误区并不罕见:他们对情绪智力的定义过于狭隘了。他们只关注到Esther的社交能力、敏感意识和可爱之处,而忽略了情绪智力的一些要素,而正是这些要素,才能够让她成为更有魄力、更高效的领导者。
《哈佛商业评论》最近的一篇文章指出了像Esther这样积极友善的管理者可能缺乏的一些技能:向员工给予负面反馈的能力、为推行改革而得罪别人的勇气以及跳出固有思维模式的创造力。但是,这些缺陷并非Esther的情绪智力所致,而是仅仅说明了她的情绪智力技能发展得不均衡。这30年来,我们研究了杰出领导者的各个强项,并从中开发了一套情绪智力与卓越领导力的关系模型。我们在这个模型中发现,拥有一套均衡的特定情绪智力能力,实际上能够帮助领导者应对这些严峻的挑战。
情绪智力有许多模型,每种模型都有相应的一套能力。人们通常会将这些模型混为一谈,并将它称为“情商”(emotional quotient,EQ)。我们认为,“情绪智力”一词更合适。根据我们的定义,情绪智力由四个领域组成:自我意识、自我管理、社会意识、关系管理。
情绪智力的领域与能力
✔ 自我意识:自我情绪意识 ✔ 自我管理:自我控制能力、适应力、以成就为导向、乐观态度 ✔ 社会意识:同理心、组织意识 ✔ 关系管理:影响力、指导能力、冲突管理能力、团队精神、具启发性的领导力 这四个领域总共包含12种可习得技能,统称“情绪智力能力”。这些能力都能让员工与领导者有出色的表现。这些能力包括同理心、乐观态度、自我控制能力。
显然,Esther在这几个方面都很擅长。但是,成就、影响力、冲突管理、团队协作与启发性领导力等重要能力也包括在情绪智力中,而这些能力和第一组能力一样,都会涉及到自身的情绪;任何一位有抱负的领导者都应该也关注这些能力的发展。
比方说,如果Esther擅长冲突管理,那她一定善于向他人传达负面反馈。如果她更偏向影响他人,那她会将传达这种负面反馈当作是领导她的下属、帮助他人成长的一种方式。举个例子:假设Esther有位骄横跋扈、说话伤人的同事,她很可能会将这位同事的每一句话都掩饰过去,但是若拥有更全面、更均衡的情绪智力技巧,那么她就会直接向这位同事沟通,明确指出对方为人处世的问题。同时,她也会运用自我情绪控制能力,防止自己反应过度。直面棘手问题,正是冲突管理的核心所在。Esther还可以用影响策略,向她的同事解释她这么做是为他好。同时让他明白,如果试着体会自己的行为对周围人所产生的影响,那么就会了解自己的改变对每个人都有益。
同样的,如果Esther发展出了具启发性的领导力,那她在推动改革方面就会更成功。拥有这种能力的领导者能清楚表达出一个愿景或使命,使自己和下属共同产生情感上的共鸣。这对于激励团队朝着新方向发展,可谓至关重要。一些研究发现,情绪智力、推动改革和远见领导力之间,的确存在着很强的关联性。
如果领导者想要出类拔萃,他们就必须均衡地发展出各项情绪智力能力。一旦做到了这一点,出众的业务表现就会随之而来。
那么,当你已经擅长情绪智力的某些方面的时候,该如何知道还需要在哪些方面提升呢?
你只需要检讨一下自己的这12种能力,就能够大略知道自己在哪些地方可能需要提升了。情绪智力有几种正式模型,其中大部分自有一套评估工具。在选择使用某套工具时,先要考虑这套工具在推测领导力水平方面表现如何。有些工具是用来评估你的自我认识;它们和性格测试有着密切的关联性,而这些性格测试也会探究人的“自我图式”(self-schema)。还有其他评估工具,如耶鲁大学校长彼得·沙洛维(Peter Salovey)和他的同事研发的评估工具,则是把情绪智力看做是一种能力;比起其他情绪智力测试工具,他们的MSCEIT测试(一种可销售产品)就和智商相关性更高。
我们推荐采用360度全方位评估,这样既包括了自我评估,也包含了认识你的人对你的看法。这种外来反馈对于评估情绪智力的各个方面都特别有帮助,其中就包括了自我意识(“你怎么知道自己不了解自己?”)。你可以请同事给你反馈意见,这样能帮助你在大体上了解自己的强项和弱点。问的人越多,你对自己就越了解。
正式的360度评估包含了你的同事以匿名方式对你的行为所提供的系统性评价。研究发现,这一评估方式与智商或个性都没有太大关系,但它们能最有效地推测出一个领导者的效力、实际业务绩效、参与度以及工作(与生活)满意度。我们研发的模型以及“情感与社会能力量表”(Emotional and Social Competency Inventory,又称ESCI 360)正符合这一类别。ESCI360是一种可销售评估工具,由光辉国际合益集团与我们共同研发。这个工具会根据他人对领导者的可观察行为的评价,衡量领导者的12种情绪智力,从而对领导者进行整体评价。研究发现,一个领导者的自我评价和他人评价之间差距越大,他实际表现出的情绪智力能力越少,业务绩效也越差。
这些评估测试对你的情绪智力的全面评价十分重要;此外,如果想补足自身情绪智力中的薄弱环节,那么仅仅是知道情绪智力包含了这12种能力,就是至关重要的第一步。踏出了这一步后,接受指导便是提升自我情绪智力欠缺之处的最有效途径。当你在练习用新的方式工作时,你可能会经历起起伏伏,这个时候专家的指点迷津对你而言无比珍贵。
即便是那些明显具有领导才能的人,也都能够更深入了解自己在情绪智力的哪些方面仍有成长的空间。别以为情绪智力就是要保持温顺可爱、愉快活泼,更不要认为这样做就会让你的情绪智力完美无缺。另外,“情绪智力对你的事业毫无帮助”之类的想法,都会阻碍你成为一名优秀的领导者。
1 程序框架 import tkinter as tk # 框架--面向过程 root_window =tk.Tk() # 1.创建应用程序主窗口对象(也称根窗口) btn = Button(root_window) # 2.添加各种可视化组件 btn.pack() # 3.通过布局管理器,管理组件的大小和位置 btn.bind(<Button-1>,func) # 4.通过绑定事件处理程序,响应用户操作(func为定义的回调函数) root_window.mainloop() # 开启主循环,让窗口处于显示状态 import tkinter as tk # 框架--面向对象 class Application(tk.Frame): # Frame是组件之一,矩形区域,可以作为别的组件的容器 def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widget() def create_widget(self): # 创建别的组件 self.btn = Button(self) # 参数self指的是Frame对象自己,作为按钮的父窗口 pass if __name__ == '__main__': win = tk.Tk() win.geometry(400x300) frame = Application(master=win) win.mainloop() 2 窗口重要属性 win.
前言 本篇文章分享一下通用漏洞挖掘的过程,想要获得通用漏洞证书,首先要求是中危及中危以上的通用型漏洞且所属公司的注册资本大于5000万。挖掘一个漏洞其实不难,个人觉得是目标公司资产的搜集。访问CNVD平台发现某网关系统被师傅提交过任意文件读取漏洞,然后搜索目标再来挖掘一下说不定能捡个漏。
未授权访问查看管理员账号密码 目标是个网关系统,使用弱口令进入系统后,开始测试功能点,在系统用户处测试抓包:
删除cookie后发现仍然可以访问管理员相关信息包括密码、手机号码等:浏览器直接访问,然后查看密码即可:任意文件下载 后台存在日志查询功能点, 查看服务器日志时有下载功能:点击下载并抓包:将参数fileName的值删除重放后报错泄漏了物理路径,其中fopen(../../../log/)猜测是downFile.php文件中的源代码:
在参数fileName后拼接:../../../VAG/pag/web/html/serverLog/downFile.php,查看downFile.php源码。定义了$file_dir的值为../../../log/,这里用户传入的值$file_name没有进行任何过滤,就直接拼接在变量$file_dir后面然后使用fopen函数打开拼接后的文件。
这里使用../可以直接下载任意文件:任意文件读取 在测试服务器日志时,服务器返回的代码中含有参数showFile.php?fileName=:这里构造数据包/serverLog/showFile.php?fileName= 可以直接查看目标源文件:在测试过程中发现存在未授权访问,在浏览器中可以直接读取文件源代码:未授权创建存储型XSS 发现在资源管理功能点存在未授权,可以创建存储型XSS,插入XSS平台地址:当管理员访问资源管理功能点时:
XSS平台成功获取到系统管理员cookie:
任意用户密码修改 在后台管理测试修改密码功能点,这里原始密码随意输入,点击保存并抓包。发现在/data/checkIsExist.php数据包中会对当前账户的原始密码进行校验,原始密码错误返回1,密码正确返回0。这里将服务器返回的数据包修改为0,进入下一个数据包,这里是对密码进行修改。
释放数据包后显示密码修改成功:使用修改之后的密码去尝试登录,可以成功登录到管理后台。
此时想到这个系统存在很多未授权操作,如果修改密码功能点也存在未授权,那么就可以直接重置系统任意用户的密码。
这里浏览器直接访问修改密码的URL,发现用户名为空:这里按照之前的流程先走一遍,点击保存并抓包,发现name参数的值为空,这里修改为admin:
在修改服务器返回的数据包为0之后,再将参数name的值修改为admin:释放数据包后,显示修改成功:使用修改之后的密码去登录,成功登录到管理后台。
后来测试发现,不需要原始密码的验证也是可以的,直接使用修改密码的数据包来进行修改密码,即可将密码重置:总结 将漏洞提交CNVD平台后,存储型XSS被驳回了,但是因为是未授权创建存储型XSS,再次提交最终审核通过了。最后觉得挖掘漏洞的话还是要细心,并且资产搜集非常重要!
转 https://www.freebuf.com/vuls/331439.html
菜鸟教程: https://www.runoob.com/echarts/echarts-ajax-data.html
参考: https://blog.csdn.net/qq_35713752/article/details/93493220
java实现的。
本来想找一个,结果好费劲又得安装Python又得安装库的,还不如自己实现,恰好最近在解析超级复杂的.c文件,统计个行数简直是小case。
注释只考虑了以下3种,大概率也够用了:
//xxx /*xxx*/ /** * xxx */ <!--xxx--> //忘记考虑了html中的注释,算啦,以后再说,不大重要 效果:
---------------------------------------------------------------------------------------- Language files sumLines blank comment code code/sumLines ---------------------------------------------------------------------------------------- JAVA 103 10663 1597 1309 7757 72.75% JSP 2 8 2 0 6 75.00% HTML 52 11566 1398 20 10148 87.74% JS 390 225696 36322 6288 183086 81.12% CSS 80 46068 5474 600 39994 86.82% ---------------------------------------------------------------------------------------- SUM 627 294001 44793 8217 240991 81.97% ---------------------------------------------------------------------------------------- 代码:
package com.example.java_practise.统计代码量工具; import java.
按照CSS样式书写(或引入)的位置,CSS样式表可以分成三大类:行内样式表、内部样式表和外部样式表 1.内部样式表
内部样式表(内嵌样式表)是写到HTML页面内部,是将所有的CSS代码抽取出来,单独放到一个style标签中。
<style>标签理论上可以放到HTML文档的任何地方中,但一般会放到文档的<head>标签中。
2.行内样式表
行内样式表是在元素标签内部的style属性中设定CSS样式,适合简单的样式修改。
3.外部样式表
外部样式表适合样式比较多的情况,核心是样式单独写到CSS文件中,然后把CSS文件引入到HTML页面中使用。
引入CSS样式表分为两步:
(1)新建一个后缀名为css的样式文件,把所有的CSS代码都放入此文件中。
(2)在HTML页面的<head>标签中,使用<link>标签引入这个文件。
本文和接下来的几篇文章为阅读郭霖先生所著《第一行代码:Android(篇第2版)》的学习笔记,按照书中的内容顺序进行记录,书中的Demo本人全部都做过了。 每一章节本人都做了详细的记录,以下是我学习记录(包含大量书中内容的整理和自己在学习中遇到的各种bug及解决方案),方便以后阅读和查阅。最后,感激感激郭霖先生提供这么好的书籍。
第4章 手机平板要兼顾——探究碎片 平板电脑和手机最大的区别就在于屏幕的大小,一般手机屏幕的大小会在3英寸到6英寸之间,而一般平板电脑屏幕的大小会在7英寸到10英寸之间。
屏幕大小差距过大有可能会让同样的界面在视觉效果上有较大的差异,比如一些界面在手机上看起来非常美观,但在平板电脑上看起来就可能会有控件被过分拉长、元素之间空隙过大等情况。作为一名专业的Android开发人员,能够同时兼顾手机和平板的开发是我们必须做到的事情。Android自3.0版本开始引入了碎片的概念,它可以让界面在平板上更好地展示。
4.1 碎片是什么 碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛。
它和活动实在是太像了,同样都能包含布局,同样都有自己的生命周期。你甚至可以将碎片理解成一个迷你型的活动,虽然这个迷你型的活动有可能和普通的活动是一样大的。
那么究竟要如何使用碎片才能充分地利用平板屏幕的空间呢?想象我们正在开发一个新闻应用,其中一个界面使用RecyclerView展示了一组新闻的标题,当点击了其中一个标题时,就打开另一个界面显示新闻的详细内容。如果是在手机中设计,我们可以将新闻标题列表放在一个活动中,将新闻的详细内容放在另一个活动中,如图所示:
可是如果在平板上也这么设计,那么新闻标题列表将会被拉长至填充满整个平板的屏幕,而新闻的标题一般都不会太长,这样将会导致界面上有大量的空白区域,如图:
因此,更好的设计方案是将新闻标题列表界面和新闻详细内容界面分别放在两个碎片中,然后在同一个活动里引入这两个碎片,这样就可以将屏幕空间充分地利用起来了,如图:
4.2 碎片的使用方式 碎片通常都是在平板开发中使用的,新建一个FragmentTest项目,创建一个平板模拟器,开始我们的碎片探索之旅吧。效果如图:
4.2.1 碎片的简单用法 最简单的碎片示例来练练手,在一个活动当中添加两个碎片,并让这两个碎片平分活动空间。新建一个左侧碎片布局left_fragment.xml,代码如下所示:
<?xml version=1.0 encoding=utf-8?> <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation=vertical android:layout_width=match_parent android:layout_height=match_parent> <Button android:layout_width=wrap_content android:layout_height=wrap_content android:id=@+id/button android:layout_gravity=center_horizontal android:text=Button/> </LinearLayout> 只放置了一个按钮,并让它水平居中显示。然后新建右侧碎片布局right_fragment.xml,代码如下所示:
<?xml version=1.0 encoding=utf-8?> <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation=vertical android:background=#00ff00 android:layout_width=match_parent android:layout_height=match_parent> <TextView android:layout_width=wrap_content android:layout_height=wrap_content android:layout_gravity=center_horizontal android:textSize=20sp android:text=This is right fragment/> </LinearLayout> 将这个布局的背景色设置成了绿色,并放置了一个TextView用于显示一段文本。
接着新建一个LeftFragment类,并让它继承自Fragment。
(书中所述,:“注意,这里可能会有两个不同包下的Fragment供你选择,一个是系统内置的android.app.Fragment,一个是support-v4库中的android.support.v4.app.Fragment。这里我强烈建议你使用support-v4库中的Fragment,因为它可以让碎片在所有Android系统版本中保持功能一致性。
比如说在Fragment中嵌套使用Fragment,这个功能是在Android 4.2系统中才开始支持的,如果你使用的是系统内置的Fragment,那么很遗憾,4.2系统之前的设备运行你的程序就会崩溃。而使用support-v4库中的Fragment就不会出现这个问题,只要你保证使用的是最新的support-v4库就可以了。另外,我们并不需要在build.gradle文件中添加support-v4库的依赖,因为build.gradle文件中已经添加了appcompat-v7库的依赖,而这个库会将support-v4库也一起引入进来。”)
实际上,android.support.v4.app.Fragment 没有;android.app.Fragment 过时;用的是import androidx.fragment.app.Fragment;
现在编写一下LeftFragment中的代码,如下所示:
package com.zhouzhou.fragmenttest; import android.os.Bundle; import android.
要想得到强签名的dll有两种情况:
1.给项目添加强命名
在你的项目右键->属性->签名,勾选“为程序集签名”,新建 或 浏览已经新建过的.pfx文件,然后重新build项目,生成的dll就是强命名的dll了。 2.直接给dll强命名
运行vs自带的命令提示工具,执行 sn -k [文件名].snk 命令创建snk文件(其中[文件名]你自己命名,可以包含路径); 使用ildasm **.dll /out:**.il 将dll生成中间语言文件 再使用ilasm **.il /dll /key=[文件名].snk 生成dll,该dll会覆盖之前没用签名的dll。 问题:当添加完签名的项目编译报下列错误
错误 1 无法导入以下密钥文件: **.pfx。该密钥文件可能受密码保护。若要更正此问题,请尝试再次导入证书,或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_67579BF105843F74。
解决方法:
运行vs自带的命令提示工具,执行 sn -i [文件名].pfx [VS_KEY],然后会让你输入密码,此时输入创建pfx时设置的密码即可。
注意:在cmd中输入密码时没有任何显示,输入完直接回车就行了。
Linux操作系统简介 Linux的命令模式与命令的执行 一、Linux操作系统简介 1.1Linux是什么?操作系统/应用程序?
操作系统是实现计算机硬件资源有效控制及硬件资源分配的程序,提供计算机运行所需要的基本功能(如网络功能)。除此之外还提供开发软件的环境,所以操作系统也会提供一整组系统调用接口供开发应用程序使用。而Linux就是一个操作系统,它包含系统内核与系统调用接口两层,Linux属于计算机程序但不是应用程序。
1.2操作系统与硬件及应用程序的关系:
1.3操作系统与硬件之间的关系简析:
由1.2中的示图可以看到操作系统的内核与硬件是紧密相连的,硬件由操作系统的内核控制,每种操作系统都自己的内核,操作系统的内核基本上都是为特定的硬件而设计的。比如Linux最开始的时候就是针对386的计算机开发的,也就是说最初的Linux仅能驱动368的硬件。
由于不同的硬件它的功能函数不相同,所以所以操作系统不能在不同的硬件平台上运行,例如IBM的Power CPU与Intel的x86架构就不一样。
所以在2006年之前的苹果电脑使用的是IBM的PowerPC CPU硬件架构,所以当时的苹果电脑的操作系统Mac OS不能运行在windows系统所运行的X86硬件平台上,windows系统也不能安装到苹果电脑上。不过2006年之后苹果电脑使用的硬件是Intel的X86架构平台,所以这类苹果电脑能安装windows系统。
由于Linux是开源的操作系统,所以它的代码可以被修改成适合在各种硬件架构上运行,也可以说Linux具有可移植性。
1.4Linux的发展历史:
1961年由Fernando J. Corbató(费尔南多·何塞·科尔巴托)教授领导的团队,在麻省理工学院计算机中心研发的CTSS(兼容分时系统)于11月首次演示,后来成熟的CTSS经过修改在IBM7094上运行。可以到这个网站Multics了解CTSS相关的更多内容。
1969年Ken Thompson(肯·汤普森)针对一台DEC公司推出的PDP-7主机,使用汇编语言写了一组内核程序,同时还包括一些内核工具程序,以及一个小小的文件系统,这个系统就是Unix原型——Unics。这个系统有两个重要概念,分别是:
所有的程序或系统设备都是文件; 不管程序本身还是附属文件,所写的程序只有一个目标,且要有效的完成目标。 1973年DennisRitchie(丹尼斯·里奇)开发出C语言,并用C语言写出了一个正式的Unix内核。
1974年Ken Thompson(肯·汤普森)与DennisRitchie(丹尼斯·里奇)合作使用C语言重新改写并编译了Unics的内核,最后命名发布了Unix的正式版。
1977年重要的Unix分支——BSD诞生:由于Unix是以高级的C语言写成的,相对于汇编语言需要与硬件有密切的配合,C语言与硬件相关性没有那么大,这使得Unix很容易被移植。1973年隶属于美国电信巨头AT&T的贝尔实验室取得Unix源码后,针对大型主机的特性开始加以定制源代码,这使得Unix移植到另一台不同的主机成为可能。1973年以后便与学术界合作开发,最重要的就是加州伯克利大学的合作。伯克利大学的Bill Joy(比尔·乔伊)取得Unix的内核代码后,修改成适合自己的机器版本,并且增加了很多工具软件与编译器,最终命名为Berkeley Software Distribution(BSD)。
Bill Joy(比尔·乔伊)也是Unix行业Sum microsystem(太阳微系统)的创始人,Sum microsystem(太阳微系统)公司就是以BSD开发内核进行自己的商业Unix版本开发,后来可以安装到x86硬件架构上的FreeBSD就是BSD改版的。
1979年AT&T推出System V第七版Unix后,System V这个版本可以运行在X86个人计算机上,改变了Unix之前只能在服务器和大型工作站上运行的情况。因为商业考虑AT&T发行第七版Unix时特别提到“不可针对学生提供源代码”的限制,从此开始引起Unix行业的版权顾虑,引发很多版权纠纷。
1979年Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授因为版权限制,为没有内核源代码提供给学生教学,教授为了避免版权纠纷,在完全不参考Unix内核代码的情况下,手写了Minix的Unix-like的内核程序,并且对Unix兼容。1984年开始编写代码,到1986年完成,并于次年出版Minix相关书籍,同时与新闻组(BBS及News)相结合。Minix版本并不是完全免费,无法在网络上提供下载,必须要通过磁盘/磁带购买。虽然很便宜,但由于没有网络上的流传,所以传播速度并不快,但购买磁盘时会附上Minix的源代码,这意味着用户可以学习Minix的内核程序。
1984年Richard Mathew Stallman(理查特·马修·斯托曼)发起GNU计划,GNU计划与FSF基金会成立。1983年斯托曼因为自己使用lisp操作系统是麻省理工学院的专利软件,无法共享。后来他接触到Unix,发现Unix可以在不同的机器间移植,虽然Unix依旧是专利然间,但基于的硬件架构还是比较开放,于是他开始将他基于Lisp编写的软件移植到Unix并将源代码公布出来。1984年开始发起GNU计划,这个计划的目的是:建立一个自由、开放的Unix操作系统。但建立一个操作系统太复杂,GNU计划仅仅他一个斯托曼,于是反其道而行之,他将Unix上运行的应用软件,在不参考源代码的情况下(避免吃官司)开发出同样功能的应用软件,并开放出来供别人免费试用。由于免费且功能差不多,很多人多直到并开始使用GNU软件,GNU官方网站。
GPL版权声明:斯托曼为了避免自己开源的软件被别人拿去做成专利软件,将GNU与FSF开发出来的软件,都是用GPL的版权声明,GPL强调的重点并不是“免费”,而是指“自由度”的软件,斯托曼进一步强调了自由的意义:用户可以自由的执行、复制、在发行、学习、修改与强化自由软件。一个软件使用GPL版权声明之后,他自然成了自由软件,这个软件具有的特色:
1.取得软件与源代码:你可以根据自己的需求来使用这个自右软件; 2.复制:你可以自由地复制该软件; 3.修改:你可以将修改过的程序,再度自由发行,而不会与原先的编写者冲突; 4.回馈:你应该将你修改过的程序回馈于社区; 5.修改授权:你不能将一个GPL授权的自由软件,在你修改后而将它取消GPL授权; 6.单纯销售:你不能单纯的销售自由软件; GPL里的单纯销售并不是不能销售,而是除了销售软件本身应同时搭配售后服务与相关手册,这些就要工本费了。自由软件赖以生存的是“服务”,如果你购买了自由软件它会同时提供手册说明、一定时长的咨询和售后服务、软件升级与其他辅助工作等附加服务。
1988年Linus Torvalds(林纳斯·托瓦兹)在赫尔辛基大学基于Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授的Minix操作系统公布的源码学习内核设计概念,但并基于Minix在Intel的368机器上开发应用,虽然他也认为Minix很棒,但由于他希望能实现多任务环境(即CPU具备执行多任务的特性),而Tanenbaum教授始终不愿意进行功能加强。于是他开始自己编写内核程序,并将源代码放到了GNU上供大家下载和修改,由于托瓦兹在FTP网站上的管理员放置的目录起名为Linux,从此大家就称这个内核为Linux。
由于Unix上的软件无法在Linux上运行,这时候托瓦兹有两种方法,一种是修改软件,让软件可以在Linux上运行;另一种则是修改Linux,让Linux符合软件能够运行的规范。由于Linux希望能兼容Unix,与是托瓦兹选择了第二种做法“修改Linux”。为了让所有软件都可以在Linux上运行,于是托瓦兹开始参考POSIX规范。POSIX是针对Unix与一些软件运行时的标准规范,只要依据这些规范来设计内核与软件,理论上就可以搭配在一起执行。因为兼容Unix,所以Linux也可以被称为Unix-like。
早期的Linux跟386硬件相关性很强,不具备移植性,后来因为开源社区的其他成员参与,在1994年Linux便被移植到很多硬件上。IBM、HP等公司的硬件都被Linux系统所支持,2019年的5.3版本开始支持X86的硬件。
1.5Linux的版本:
3.10.0-123.e17.x86-64 主版本.次版本.发布版本-修改版本 在3.0版本之前采用奇偶数版本分类,每个版本好的第二位即(次版本)为奇数时表示开发测试版,这个版本主要时内核开发工程师使用,用来新增内核代码,当这个版本被众多工程师测试没有问题之后加入下一个稳定版本内核中;每个版本号的次版本为偶数则表示为稳定版。例如2.5.xxx表示开发测试版,2.6.xxx表示稳定版。
在3.0版本之后则采用主线版和长期维护版,内核主要依据主线版本开发,例如3.10在3.9的架构下继续开发的新主线版本。旧的版本在新的主线版本出现之后,有两种处理机制,一种是结束开发,即程序代码已结束,不会有继续维护的状态;另一种机制为保持该版本的持续维护,亦长期维护版本。例如3.10即为长期维护版本,这个版本的程序代码会被持续维护更长时间,若程序代码有Bug或其他问题,内核维护者会持续进行程序代码的更新维护。
可以通过下面这个命令来查看当前系统的内核版本,然后再在Linux内核档案查看对应的值。
uname -r
1.6Linux发行版:
由于GNU的GPL授权并非不能从事商业行为,于是就有很多商业公司专门来销售Linux发行版,由于Linux的GPL版本声明,因此,商业公司所销售的Linux发行版通常都可以从互联网上面下载。由于发展Liniux发行版的社区与公司是在太多,例如有名的Red Hat、SUSE、Ubuntu、Fedora、Debian等,为了解决各个发行版之间可能存在的差异性问题,Linux发行版使用的内核都由Linux内核档案发布,这些发行版很多基础应用软件都是相同得,比如网页服务器Apache、电子邮件服务器Postfix/sendmail、文件服务器Samba等。
为了使Linux的发行版差异不至于太大,且让开发商开发时有所依据,还有Linux Standard Base(LSB)等标准来规范开发者,以及目录结构的File system Hierarchy Standard(FHS)标准规范。唯一的差别,可能就是该厂商开发出来的管理工具,以及套件管理的模式。基本上每个Linux发行版除了架构的严谨度与选择的套件内容外,其实差异并不太大。