php怎么设计单态,如何解决跨域问题?
现在开发项目,大部分公司采用的都是前后端分离的方式进行开发,由于现在产品形态越来越多,网页、手机端、桌面端等等,为了面对各种端,数据中心化、微服务概念的出现,我们为了集成这些服务,不得不去面对一个常见的问题——解决跨域请求的问题。
以前工作开发中,经常会有这样的问题,前端工程师的前端页面由于跨域问题报错了,来协调后端开发人员解决,后台开发人员还那解释你来看我这边的接口是正常的,应该是你的问题,这是前端开发人员的心顿时是崩塌的,如果你还不知道怎么办的时候,也许会默默的自己去寻找解决方案,一查解决方案,这个工作应该需要前后台一起配合,你还得给后端开发人员去好说歹说,让他们也看看一起解决。我很能理解作为前端的我们真是不容易啊。
关于跨域这个问题,不仅前端工程师需要了解,后端工程师也需要了解更应该重视,因为后面会提及到相关的解决方案,需要共同配合才能完成。借着回答这个问题的机会,我来把跨域的相关内容进行系统的梳理,分享给大家。
什么是跨域跨域(CORS)——跨源资源共享。换成我们前端开发人员能理解的就是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript的实施的安全限制。
换个通俗的比方来说,比如经常会有一些模仿金融机构的钓鱼网站,用了和金融机构类似的域名,你点击进去一看,竟然和你熟悉的金融网站一模一样,如果你没注意域名的差别,如果你在网站上输入了卡号和密码信息那就很危险了,有可能这个网站是frame了金融机构的网站,如果金融网站没有做相关的安全限制,你的信息完全有可能被非法分子获取。由此可见浏览器的同源策略存在是十分有必要的。
我顺便在给大家介绍下如何区分是否是同源,所谓的同源是指,域名,协议,端口均为相同。接下来举几个示例,方便大家进行理解:
常用方法一:使用 JSONP 进行 Get 请求这应该是我们接触到的第一个解决跨域的方法,笔者记得前端入门经典红皮书里有过介绍,JSONP有两部分主成:回调函数和数据。回调函数是当响应完成在页面中调用的函数,回调函数的名字一般在请求中进行制定。而数据就是传入回调函调函数中的JSON数据。为了解释这个,还是我们来看下面这个例子吧:
比如我们来实现一个获取当地天气数据的功能,我们需要在后端与天气接口平台交互获取天气数据,前端页面通过GET后端API的方式获取天气信息。
1、首先定义我们前端页面的回调函数功能,我们定义了一个gotWeather的函数:
2、接下来定义请求方法,请注意callback后面的参数和回调函数保持一致的名字:
3、我们后台接口最终要返回非类似这样的数据内容:
你会发现,数据能够正常返回,你也许会问为什么这样可以,不违背同源原则吗?其实之所以有效,并且不违反安全性,因为这是经过前后端共同协作,约定以这种方式传递数据。但是你会发现使用这种方法会有一个问题是,只能用于Get请求。
常用方法二:跨域资源共享(CORS)请求方式目前这种方式用的比较多,应用比较广泛,如果你的项目受部署环境限制的话,建议还是用这种。
1、什么是CORS?
CORS是一个W3C标准,全称是“跨域资源共享”(跨源资源共享)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持目前,所有浏览器都支持该功能,IE浏览器不能低于IE10.IE8 +:IE8 / 9需要使用XDomainRequest对象来支持CORS。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
CORS 请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
2、什么是简单请求?
2.1、首先介绍下什么是简单请求,请求方法是以下请求方法:
Head
Get
Post
2.2、HTTP 的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同时满足上面两个条件,就属于非简单请求。一句话,简单请求就是简单的 HTTP 方法与简单的 HTTP 头信息的结合。
2.2、简单请求的大致流程我做下解释:
加入我们的一个网站页面地址需要去请求一个服务端的API,这个页面的请求头可能是这样的:
上面的头信息中,Origin字段用来说明,本次请求来自哪个域(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
如果Origin指定的源,不在许可范围内,服务器会返回一个正常的 HTTP 回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为 HTTP 回应的状态码有可能是200。
如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。具体的请求交互流程如下图所示:
如果一切顺利正常的话,你就会看到服务端一些返回的头信息
3、什么是非简单请求
3.1、 简单的介绍下什么是非简单请求(not-so-simple request)
非简单请求是那种对服务器提出特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的 CORS 请求,会在正式通信之前,增加一次 HTTP 查询请求,称为“预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。这是为了防止这些新增的请求,对传统的没有 CORS 支持的服务器形成压力,给服务器一个提前拒绝的机会,这样可以防止服务器大量收到DELETE和PUT请求,这些传统的表单不可能跨域发出的请求。
3.2、通过示例,我们来了解其实现的原理
3.2.1、比如我们在前端页面的请求代码时这样的如下所示:
上面代码中,HTTP 请求的方法是PUT,并且发送一个自定义头信息X-Custom-Header。
3.2.2、浏览器发现,这是一个非简单请求,就自动发出一个“预检”请求,要求服务器确认可以这样请求。下面是这个“预检”请求的 HTTP 头信息。
“预检”请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。
除了Origin字段,“预检”请求的头信息包括两个特殊字段。
(1)Access-Control-Request-Method 该字段是必须的,用来列出浏览器的 CORS 请求会用到哪些 HTTP 方法,上例是PUT。
(2)Access-Control-Request-Headers 该字段是一个逗号分隔的字符串,指定浏览器 CORS 请求会额外发送的头信息字段,上例是X-Custom-Header。
3.3、服务器收到“预检”请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。
3.4 一旦服务器通过了“预检”请求,以后每次浏览器正常的 CORS 请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
3.4 文字内容有点多,把刚才描述的内容用一张流程图表述下,大家会清晰许多,如下所示:
4、与 JSONP 的比较
CORS 与 JSONP 的使用目的相同,但是比 JSONP 更强大。JSONP 只支持GET请求,CORS 支持所有类型的 HTTP 请求。JSONP 的优势在于支持老式浏览器,以及可以向不支持 CORS 的网站请求数据。
5、接下来给后端开发人员分享下如何配置跨域请求
5.1 PHP 简单示例
5.2 Node 开发人员使用 Express 简单示例:
5.2.1 首先安装 cors 中间件:
npm install cors
5.2.3 然后配置比如入口文件,server/
index.js
5.2.4 你可以对跨域进行配置,如下图所示:
5.2.5 你可以做个请求示例尝试下,如果一切正常,你可以在 web 开发者工具中看到如下所示:
java 的由于我不太熟,可以自行解决方案,原理和 PHP 的道理是差不多的。
常用方法三:nginx 反向代理这个方法应用也十分广泛,也是十分常见的,这也需要服务端配合下面还是用一段Ngxin配置来说明这个问题,如下图所示:
实现原理类似于Node中间件代理,需要你搭建一个中转nginx服务器,用于转发请求。使用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。
小节以上是解决跨域问题最常用的三种方式,应该能解决你业务中遇到的问题,有点需需要提示的是方法二和方法三不要混着用,否则会报“Access-Control-Allow-Origin Not Allow Multiple value”的错误,我推荐大家用方法三使用nginx反向代理做跨域解决方案,比较简单和直接,可谓一劳永逸。当然跨域的方法还有其他的,比如使用WebSocket、postMessage API 、各种 iframe 的解决方案,由于不太常用和篇幅问题原因,就不再一一介绍了,感兴趣的小伙伴们可以自行搜索。
如果你觉得本回答分享对你有所帮助,欢迎给个赞?支持下,分享出去让更多的人知道,如果你有其它的方法,欢迎再留言区进行分享。
注:本回答第二部部分参考阮一峰的《JavaScript 标准参考教程(alpha)》
更多前端内容分享,欢迎关注「前端达人」及其微信公众号
到底是对还是错呢?
转载约瑟夫萨默斯先生的一篇文章,以飨读者。
为什么饮用水如此重要?首先,你的身体的70%是由水组成的,所以保持身体水分的新鲜是必不可少的,这样才能保持身体正常工作。当身体的水需求得不到满足时,它会产生各种负面的短期和长期健康后果。
长期脱水可导致类风湿性关节炎,偏头痛,心绞痛,结肠炎,消化不良,高血压,肥胖,痔疮,乳腺癌,肺结核,肾结石,鼻窦炎和子宫癌!
醒来后饮水,帮助身体更好地避免这些情况,保持身体全天保持水分。
我该如何进行空腹饮水?您在空腹饮水后的一整天都会感到精力充沛。
在醒来之后,刷牙洗脸之前和便便后立即喝大约160毫升的温水2-4次(家中的刷牙缸一般是300毫升左右的容量,可接水半缸作为参考);
空腹饮水后的15-30分钟内不要吃任何东西;
在进食前至少30分钟喝水,但在早餐,午餐和晚餐后的两小时内尽量不要喝水;
如果你不能空腹喝四杯水,那么你可以从一杯或者你的身体接受能力开始,逐渐增加水的摄入量,直到达到640毫升的水平。
饮水对空胃的主要好处1.帮助摆脱身体里的毒素
当你喝水时,它会自然地催促你的肠道运动。到了晚上,你的身体会自行修复并排出体内的所有毒素。当你早上空腹喝水时,你会清除这些有害的毒素,让你的身体保持清新健康。多喝水可以帮助增加肌肉细胞和新血细胞的产生。
2.改善新陈代谢
空腹饮用水可使您的新陈代谢率提高至少24%。这对那些严格控制饮食的人来说非常重要。代谢率增加意味着消化系统得到改善。如果你消化得更快,你将能够更容易地遵循你的饮食习惯。醒来后立即饮用水可净化结肠,使其更容易吸收营养。
3.加强健康减肥
当你早上空腹喝水时,你会释放所有的毒素,它会改善你的消化系统。你会感觉不那么饥饿,你大量进食的渴望会减少。这可以防止暴饮暴食引起的体重增加。
4.减轻胃灼热和消化不良
消化不良是由胃中酸度增加引起的。当酸回流到你的食道时,你会遭受胃灼热。当你空腹喝水时,这些酸被推倒并被稀释,解决了这个问题。此外,这为即将到来的早餐提供了一个良好的胃口。
5.改善肤色和皮肤光泽
脱水会导致皮肤过早出现皱纹和毛孔印。在一项研究中发现,空腹喝500毫升水可以增加皮肤的血液流动,使皮肤焕发光彩。此外,全天多喝水意味着你的身体释放毒素,这将使你的皮肤更容光焕发。
6.促进闪亮,光滑,健康的头发
脱水会对头发生长产生严重的影响。多喝水可以从里到外滋养你的头发。水占头发重量的近1/4。摄入水分不足会导致头发变脆,发丝变细。你应该每天多喝水,但空腹喝水可以更大程度地改善头发的质量。
7.预防肾结石和膀胱感染
醒来后立即饮用水对于预防肾结石和膀胱感染非常重要。事实上,空腹饮用水会稀释导致肾脏结石的酸。饮用的水越多(达到健康的限度),就越能保护您免受因毒素引起的各种膀胱感染。
8.加强免疫系统
空腹饮用水有助于冲洗和平衡淋巴系统,从而提高免疫力。强大的免疫系统可以让您远离各种疾病,并防止您经常生病。
如您所见,醒来后立即饮用水有很多好处。毫无疑问,这是在不花钱的情况下为您的生活方式做出积极改变的最简单方法!
编者注:上述内容讲了空腹饮水的好处,但是需要注意的是,饮用的水不能是冷的,摄氏35-40度是最适合饮用的温度。
能不能用Python弄个人工智能来写C?
现在已经有很多工具能通过人工智能的方式去辅助我们更快地写代码,虽然离完全自主的编写代码还差很远,但是已经能帮助开发者更高效的完成开发任务,下面为大家简单介绍一下。
一、GitHub CopilotGitHub近期发布的的代码智能生成插件,目前支持VSCode、JetBrains等IDE平台,不同于其他代码补全工具只提供最多一行的补全结果,Copilot能通过代码上下文以及语言描述,生成整个代码片段,无疑是开发者的编码利器。它是如何做到的呢?Copilot使用的是OpenAI据说烧了数千万美元研发出来的GPT-3模型,Copilot在GPT-3模型基础之上通过对GitHub的开源代码进行学习,得到了Codex模型,该模型具备强大的代码生成能力。但是由于该模型非常庞大,需要有足够的硬件支撑,所以Copilot目前只能通过邀测的形式小范围试用。从FAQ中的信息显示,Copilot未来可能不会大面积免费开放,未来想要尝试该工具的开发者要准备好预算。GitHub Copilot提供了片段级的代码补全功能,可以用于注释生成代码、生成单元测试等场景。提供了远程服务模式,需要将代码上传到远端,所以如果是企业的开发者可能要注意数据安全了能够通过代码上下文、注释及语言描述生成方法级的代码片段通过单元测试方法名生成单元测试及Mock数据。GitHub Copilot是一款非常好用的代码生成工具,适合生成通用的工具代码、leetcode算法、单元测试等场景的高频代码,而对业务代码的生成则依然存在语法错误的问题,可惜Copilot只提供了远程服务模式,并且基于Copilot当前的技术路线也不太可能提供离线模式,这点可能会带来潜在的隐私及代码数据的泄露风险,希望以后收费不会太贵。个人体验评价语言及IDE支持:⭐︎ ⭐︎ ☆ ☆ ☆代码补全:⭐︎ ⭐︎ ⭐︎ ⭐︎ ☆代码搜索:不支持二、TabNineTabNine是一款比较年轻的开发工具,刚发布的时候还是比较惊艳的,那个时候OpenAI刚开源GPT-2模型不久,TabNine基于GPT-2模型在海量代码数据上进行调优,打造出了一款针对代码的深度学习引擎,它能智能识别代码的上文信息,提供长序列的代码补全结果。目前,已经被Codota公司收购,并主推该工具,宣称支持所有主流的开发语言。TabNine提供代码智能补全功能,支持以下特性:免费版只提供较为基础的补全功能,收费的Pro版本补全效果更好远程服务模式,代码需要上传到远程服务器,但是模型更强大,本地内存占用少离线模式,能够把模型下载到用户本地,无法联网也可使用补全,但是本地内存占用高,有时候CPU会飙高针对专业版提供了适配企业/私有代码的能力,是需要收费的TabNine能提供长序列的代码补全,在我体验过的同类工具中,TabNine是支持的开发语言种类以及IDE平台最多的工具。但是与其他工具相同,它会推荐出不完整的代码以及存在语法错误的代码。从部分开发者的反馈了解到,有部分开发者喜欢TabNine即时学习代码模式的能力,这点是相比其他工具比较不错的,虽然目前提取代码模式的能力还存在比较多的缺陷,但是相信未来会逐渐完善。个人体验评价语言及IDE支持:⭐︎ ⭐︎ ⭐︎ ⭐︎ ⭐︎代码补全:⭐︎ ⭐︎ ⭐︎ ☆ ☆代码搜索:不支持三、阿里云Cosy阿里云的智能编码插件Cosy于2021年10月份发布,到现在才两个月时间,是个相对年轻的工具。目前仅支持Java语言。通过其帮助文档了解到,它使用深度学习模型加语法分析结合的技术,通过深度学习模型强力的学习能力生成长序列代码,同时又通过结合语法分析的能力去纠正模型生成的错误。我个人比较喜欢的是Cosy的代码搜索功能,它从GitHub和StackOverflow中抽取出了常用的代码片段,让我能很方便的在IDE中直接搜索需要的信息。阿里云Cosy提供的代码智能补全仅提供IntelliJ IDEA插件,支持Java语言,相比于其他工具支持的语言种类比较少,相比于TabNine,在补全效果上有一些优化,减少了补全半截的情况。支持整行的代码补全结果离线模式,Cosy会在首次启动时把模型下载到本地,之后便可断网使用我个人比较喜欢的是阿里云Cosy的代码示例搜索功能,支持以下特性:在IDE内支持指定API的代码示例搜索在IDE内支持通过功能描述搜索StackOverflow、GitHub等来源的开源代码片段阿里云Cosy的代码补全在TabNine的基础上更进一步的解决了部分生成错误代码的缺陷,但是在细节打磨上还存在一些问题,与TabNine、GitHub Copilot相比各有千秋。Cosy的代码搜索功能相比其他工具确实是一个比较好的亮点,让我的日常“抄”代码轻松很多。个人体验评价语言及IDE支持:⭐︎ ☆ ☆ ☆ ☆代码补全:⭐︎ ⭐︎ ⭐︎ ☆ ☆代码搜索:⭐︎ ⭐︎ ⭐︎ ⭐︎ ☆四、Kite说到业界在代码智能补全领域发布最早的工具,Kite便是其中之一,它成立于2014年,在Atom/Vim/Spyder等编辑器发布代码智能提示插件,初期只面向Python开发者,当前扩展到面向绝大部分主流开发语言。并于2020年初发布JetBrains插件,2021年初发布VSCode插件。Kite支持目前主流的16种开发语言以及16种代码编辑器,但是从我的使用体验上来看,其最擅长的还是Python语言,毕竟是Kite最早支持的语言类型。Kite提供基于机器学习的代码智能补全功能,支持以下特性:远程服务模式,代码需要上传到远程服务器离线模式,能够把模型下载到用户本地,无法联网也可使用补全专业版能针对用户的代码库进行训练Kite也提供了Python官方文档搜索功能支持Python API的官方文档及少量示例Kite适合Python开发者,毕竟Kite是以Python起家,在Python语言上打磨了很多年,虽然不像其他同类工具一样,能提供非常惊艳的长序列代码补全,但是它对IDE自带补全的排序优化效果还是很不错的。Kite的API文档搜索能搜索到常用的Python API官方文档,但是大部分能在IDE中通过查看API定义查看,代码的使用示例比较缺乏。个人体验评价语言及IDE支持:⭐︎ ⭐︎ ⭐︎ ⭐︎ ☆代码补全:⭐︎ ⭐︎ ☆ ☆ ☆代码搜索:⭐︎ ⭐︎ ☆ ☆ ☆五、Codota除了Kite,业界另一个涉足最早涉足该领域的工具是Codota,Codota成立于2013年,在2014年下旬发布第一个Jetbrains插件版本,主要面向Java开发者。但是,目前Codota公司收购TabNine之后,已经放弃了Codota这款插件,并将老产品改名为了TabNine。Codota提供了代码补全功能,在Java语言上效果比较好基于程序分析、统计分析的规则化代码补全,主要能针对部分类名、常用的代码模板进行补全Codota提供了IDE内的代码示例搜索功能(支持Java、JavaScript)支持搜索引用了指定API的代码示例在其他代码补全工具发布之前,Codota还是一个比较不错的开发利器,特别是丰富了IDE自带的代码模板,可以帮助开发者节省很多低级编码的时间,Codota也有一些用于生成代码的小功能,这里就不再扩展。但是在目前AI爆发的时代,Codota的产品演进没有跟上步伐,所以Codota公司已经放弃该产品的演进,转而大力发展收购的TabNine。个人体验评价语言及IDE支持:⭐︎ ⭐︎ ☆ ☆ ☆代码补全:⭐︎ ⭐︎ ☆ ☆ ☆代码搜索:⭐︎ ⭐︎ ⭐︎ ☆ ☆六、微软IntelliCode要说做开发工具哪家强,那肯定是微软最厉害,上面提到的GitHub Copilot使用的GPT-3模型,其研究组织OpenAI也是受微软10亿美元投资的,所以Copilot也有微软的功劳。微软自己开发的另一款工具IntelliCode,在2018年7月发布,支持C#、C++、Java、Python、SQL Server、TypeScript/JavaScript、XAML,并且在2021年初发布Visual Studio IntelliCode Insiders插件。跟其他众多补全工具一样,提供了代码智能补全的能力,目前支持VSCode以及Visual Studio。效果较好的语言:C#、C++IntelliCode提供了单API的代码智能补全,跟IDE自带补全类似,但是在排序上有所优化适配企业/私有代码(只支持C++、C#)支持离线模式在Java语言上与IDE自带的补全结果区别不大。IntelliCode能对IDE自带补全结果进行排序优化,但是支持的场景比较少,并不是所有补全都能提供排序优化,目前体验下来仅局限于方法调用的代码。整体体验下来,感觉IntelliCode在Java语言上实用性不强,基本上没有体感;在Python语言上至少在VSCode上还是比较方便的,适合不喜欢长序列/片段级代码补全工具的开发者。个人体验评价语言及IDE支持:⭐︎ ☆ ☆ ☆ ☆代码补全:⭐︎ ☆ ☆ ☆ ☆代码搜索:⭐︎ ⭐︎ ☆ ☆ ☆七、AIXcoderAIXcoder从天眼查了解到其成立于2017年,根据官网主页的信息,它也采用了深度学习的技术,并且对模型进行了压缩,以便于提升用户下载模型的速度,减少用户本地CPU的开销。AIXcoder提供了对用户本地代码库学习的工具,但是免费版有次数限制,而且学习本地代码库的时候电脑会比较卡。让我有点疑惑的是,AIXcoder官网主页视频中演示了IDE内的代码搜索功能,但是在实际插件中只提供了一个跳转到浏览器中的按钮,并不能在IDE内直接搜索(难道是需要付费的?)。目前发布了Jetbrains及VSCode插件,主要支持Java、Python、C/C++、JavaScript、Typescript、Go、PHP等语言。AIXcoder提供的代码智能补全与Kite比较相似,都会对IDE自带的补全结果进行排序优化,只是AIXcoder在Java上效果好一些,支持以下特性:远程服务模式,代码需要上传到远程服务器,速度更快一点,卡顿感会减少离线模式,会把模型下载到本地官方主页的演示视频说是支持IDE内的代码搜索,但是我安装插件后发现只能跳转到网页端的搜索页面上,无法在IDE内搜索,难道这块功能是需要收费的?总的来说AIXcoder在刚发布的时候还是很不错的,但是最近发布了太多同类工具,AIXcoder的代码补全体验相比其他工具算不上出彩,希望AIXcoder能继续提升。个人体验评价语言及IDE支持:⭐︎ ⭐︎ ⭐︎ ☆ ☆代码补全:⭐︎ ⭐︎ ☆ ☆ ☆代码搜索:IDE内不支持目前的代码补全工具,亦或是智能编码辅助工具,是对IDE自带补全能力的扩展,而不是替代,从这些工具中我们能切实的感受到AI带来的生产力,AI不再只存在于论文中,或许不久的将来,AI真的能自动写代码了呢?如果是针对问题中的C++代码,建议使用IntelliCode;如果是Java开发建议使用GitHub Copilot、阿里云Cosy、TabNine,希望我的回答能帮到你。Linux系统和Windows系统本质上的区别是什么?
一、就操作系统设计的复杂度上,windows要超过Linux
如果windows抛弃人机操作的窗口界面,其性能并不比linux差;
编写Web浏览器的难度要远大于编写Web服务器的难度;
二、为何大公司喜欢用linux
1、免费且开源,相对于免费,开源更加重要;
2、开源意味着更安全;
3、开源意味着可优化;
因为开源所以透明,因为透明,所以安全,但安全是相对的。
所谓的安全是针对大公司,是针对那些真正懂linux内核的人。他们可以自己定制化linux,比如加入自己特性化的功能,修改潜在的漏洞,或者他们认为需要完善的地方,甚至可以调优linux来解决自身业务的瓶颈。
透明是把双刃剑,对那些只会linux命令的人,开源并不意味着安全,因为你根本搞不清楚自己使用的机器是否被控制, 如果别人给你一个内核中藏有木马的linux,那么恭喜你,你可能永远都会沉浸在自己幻想的所谓安全中。
换句话说,如果windows开源了,那么windows对大公司是安全的,他们可以一窥windows内核,并对其增删改,去掉 所有图形化元素,将动态加载驱动改为内核态加载,优化IOCP并将其发挥到极致,我相信windows也会变成安全、稳定、 可靠、优秀的服务器,而且会比linux还要优秀。
但对于绝大部分在windows下做开发的程序员来说,windows开不开源其实跟你没有半毛钱关系,除非你有能力将windows 上千万行的代码耐心看一遍,前提是你要能看懂。首先,你要把汇编语言再学习一遍,把操作系统的书多看几遍,把编译原理的书也多看几遍,否则这些代码在你面前和天书没本质区别;其次你要有足够的时间和足够耐心;最后,你要真能识别出风险,毕竟windows是最成熟的商业操作系统,如果你认为自己的智商能够超越微软那些顶级架构师几十年的精心设计和打磨,那你还改屁操作系统啊,直接进中科院设计国产OS为国增光吧。
记住:对别人的安全并不意味着对你安全!
开发后台程序和懂服务器、懂操作系统,完全是两个概念,这两者的差别就像狗和热狗的差别一样。 在linux上开发java后台应用服务,并不意味着这个程序员有多了解linux,后台程序跑在Apache、Tomcat、Nginx这些 真正的服务器上,这些服务器在帮你的程序优雅的处理高并发、高吞吐量和低延迟,而这些服务器必须要充分利用 linux内核的性能,这就意味你要真正理解什么是多线程,什么是线程池,select、poll和epoll的区别;
三、在网络方面,windows的IOCP模型要优于linux的epoll模型
1、IOCP真正发挥了多核CPU的性能,让IO操作均衡的负载在不同CPU线程上,epoll很可能会让有的线程累死,有的饿死;
2、IOCP是Proactor异步IO,epoll是reactor同步IO;
打个不恰当的比方,IOCP属于导弹发射后不管,最后通知你击中目标;epoll属于发射后需要分阶段导航。有人说epoll给了程序员更高的自由度处理来自内核的IO数据,毕竟可以手把手的制导导弹,很有成就感,但那是针对高水品程序员,如果你的水平一般的话,那结果可能是灾难性的。很有可能你会亲手把发射的导弹送出地球,或者引发另一场战争。实际上IOCP在业务处理上的难度要大于EPOLL,因为异步IO的原因,你的上层完整的业务已被碎片化了。
3、windows比linux在服务器性能上的慢,并不代表IOCP比Epoll差,这是windows定位的问题,如果你要让用户易用,那就要在某些方面做些牺牲。
多说几句:
1、我特烦那些人云亦云,一知半解的人,言必谈linux好,说来说去就是那么几条:linux开源、安全、稳定。你看,很多大公司在用,windows还要经常打补丁,有时还崩溃。linux都特么开源了,等于人人都可以随时打补丁,人家偷偷打补丁还要让你知道么?如果自己代码写的烂,不管是linux还是windows,都一样的下场。合着linux就是专门为跑你的烂代码设计的,永远不崩溃跑不死么?
2、你要是觉得linux好,那就在linux上写代码、看小电影、上网聊天,最好不要在windows上办公。你一边用着windows,一边鄙视windows,端起碗来吃肉,放下碗就骂娘,有意思么?
3、你拿linux服务器方面的性能比windows 服务器性能,拿长处比短处;你怎么不拿windows的人机交互和linux的人机交互做对比啊。当然这种装逼犯,肯定会自豪的说:我们大牛级猿就喜欢玩这种DOS命令行,你咋不复古去玩打孔卡片交互呢。你干嘛还用智能触屏手机,干脆腰上挂个BP机,左手小灵通,右手大哥大,不是更拉风么?
我特么明明能用打火机点着的,你非要给我给我展示一段钻木取火野外求生。说到底计算机、操作系统只是工具,怎么好用怎么好,不是让你噼里啪啦对着键盘一顿敲,自我感觉风骚的一比。我特么就问你:键盘敲出来的命令和鼠标点出来的命
你最常用的一个linux命令是什么?
1、显示目录和文件的命令
Ls:用于查看所有文件夹的命令。
Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容
Du:显示目录或文件大小
2、修改目录,文件权限和属主及数组命令
Chmod:用于改变指定文件的权限命令。
Chown:用于改变文件拥有属性的命令。
3、创建和删除目录的命令
Mkdir:用于创建目录
Touch:创建一个新的文件
Vi:创建一个新的文件
Rm:删除文件或目录
Cp:复制命令
4、显示文件内容的命令
Cat:用于显示指定文件的全部内容
More:用分页的形式显示指定文件的内容
Less:用分页的形式显示指定文件的内容,区别是more和less翻页使用的操作键不同。
Head:用于显示文件的前n行内容。
Tail:用于显示文件的后n行内容。
Tail -f:用于自动刷新的显示文件后n行数据内容。
5、查找命令
Find:查找指定的文件。
Which:用于查询命令或别名的位置。
Locate:快速查找系统数据库中指定的内容。
Grep:查找文件里符合条件的字符串。
6、关机和重启计算机的命令
Shutdown:-r 关机后立即重启
Poweroff:用于关机和关闭电源
Reboot: 用于计算机重启
7、压缩和打包命令
Tar:用于多个文件或目录进行打包,但不压缩,同时也用命令进行解包
Gzip:用于文件进行压缩和解压缩命令,文件扩展名为.gz结尾。
Gunzip:用于对gzip压缩文档进行解压缩。
Bzip2:用于对文件或目录进行压缩和解压缩
Compress/un compress: 压缩/解压缩.Z文件
Zip/unzip:压缩解压缩.zip文件
8、用户操作命令
Su:切换用户命令
Sudo:一系统管理员的身份执行命令
Passwd:用于修改用户的密码
9、改变目录和查看当前目录命令
Cd:进入工作目录
Cd..:会退到上一级命令
Pwd:显示当前用户所在工作目录位置
10、vi编辑器
首先用vi命令打开一个文件
末行模式命令:
:n,m w path/filename 保存指定范围文档( n表开始行,m表结束行)
:q! 对文件做过修改后,强制退出
:q 没有对文件做过修改退出
Wq或x 保存退出
dd 删除光标所在行
: set number 显示行号
:n 跳转到n行
:s 替换字符串 :s/test/test2/g /g全局替换 /也可以用%代替
/ 查找字符串
11、网络通信常用的命令
Ping:用于查看网络是否连接通畅
12、功能测试面试经常问到的命令
man 察看命令详解,只要觉得哪个命令不清楚,man它就可以了.
ls 列出文件
-l: 逐行显示且列出详细属性
-a: 列出所有文件包括以.开头的隐藏文件
cat 读取文本内容
-n: 显示行号
-b: 显示行号且忽略空行
cat -n 1.txt
wc 计数
-l: 行数
-w: 字数
-c: 字符数
wc -l file1 file2 ......可以统计多个文件
cp 拷贝文件 目录
-i: 交互模式,如果目标文件存在,则询问是否覆盖
-r: 拷贝目录
cp file1 file2 file3.... dir 表示将file1,file2...拷贝到dir
cp -r dir1 dir2 dir3... dirn 将dir1, dir2,dir3...拷贝到dirn
file 察看文件类型
file test.sh
mv 移动文件,更改文件名
-i: 交互模式,如果目标文件存在,则询问是否覆盖
-r: 移动目录,跟改目录名
rm 删除文件
-i: 交互模式,询问是否删除
rm -r dir1 dir2 dir3...可删除多个
mkdir 创建目录
-p: parent,父目录不存在,则创建父目录
mkdir -p test/test
rmdir 删除目录
等同与rm -r
rmdir dir1 dir2 dir3 ....
rm -r dir1 dir2 dir3 ....
chmod 更改权限
chmod -R 777 DIR改变目录下所有文件权限为777,必须是-R
权限 -rwxrwxrwx
421421421
最前面的-表示文件类型为普通文件
接下来三位表示所有者权限
接下来三位表示组权限
最后三位表示其它用户权限
如果某一权限没有被分配,用-表示。-rwxr--rwx表示组没有写和执行权限
文件加夜有可执行权限,但表示是否容许在该目录下寻找文件
kill
-9 强制结束
more 显示文本内容,每次一屏,按空格继续
find / -name "*.sh" | more
tail 从指定的位置开始显示后面得内容
tail -f server.log 用于在server上边运行边察看日志
tail -10 dos2unix.sh 察看最后10行
head
与tail对应
compress
-f 压缩文件
-v 显示压缩比例
compress -vf project.tar 将产生project.tar.Z且project.tar被删除
uncompress -f 解压缩文件
uncompress project.tar.Z 将产生project.tar且project.tar.Z被删除