编程语言哪家好,这一直都是程序员乐此不疲争论的话题。但你有没有想过,哪种编程语言是2022年行业最需要的呢?
对此,在过去的八个月里(从2021年10月到2022年6月),国外网站DevJobsScanner分析了超过700万个开发者的工作需求,得出了目前行业内需求量最大的8种编程语言。
为了得出准确结果,DevJobsScanner只挑选这700万个需求中有明确编程语言要求的工作,舍弃了对语言要求模糊的工作机会。以下是具体内容:
1.Javascript / Typescript
自从Javascript作为网络编程语言出现后,它就一直流行至今。也就是说,目前Javascript是整个市场上需求量最大的编程语言。此外,Typescript(一种具有类型安全的Javascript超集)的到来也起了助推作用。近年来,Typescript的受欢迎程度只增不减。许多新的Javascript框架完全是用Typescript编写的,如Angular和NestJS。
在这八个月里,DevJobsScanner发现了48.6万个工作机会,占明确编程语言需求工作的32%。
按月份划分的Javascript / Typescript工作需求占比:
2.Python
Python成为2022年需求量第二大的编程语言。它的多功能性,从脚本、运行服务器或用于数据分析等,是实现这一里程碑的关键。此外,Python还拥有规模最大的社区之一。
在这八个月里,DevJobsScanner发现了30.8万个工作机会,占明确编程语言需求工作的20%。
按月份划分的Python工作需求占比:
3.Java
需求量第三大的编程语言是Java。自1995年创建以来,Java一直非常受欢迎。尽管在过去的几年里,随着Kotlin等更现代语言的出现,它的受欢迎程度一直在下降,但它仍然稳居前三。目前许多顶级公司在使用像Spring这样的框架,这也有助于Java保持这一地位。
在这八个月里,DevJobsScanner发现了26.2万个工作机会,占明确编程语言需求工作的17%。
按月份划分的Java工作需求占比:
4.C#
C#是一种通用的、多范式编程语言,主要基于其前身C++。作为一种通用语言,C#的使用范围很广,最常见的用法是与.NET框架一起使用。它在Unity游戏框架中也被大量用于脚本编写,.NET框架和Unity在顶级公司中都很受欢迎。
在这八个月里,DevJobsScanner发现了13.5万个工作机会,占明确编程语言需求工作的9%。
5.PHP
PHP一开始只是简单的 "个人主页工具 "编程语言,但自其创建27年以来,如今仍然是需求量第五大的语言。PHP主要用于Web开发,与Laravel或Wordpress等框架结合使用。
在这八个月里,DevJobsScanner发现了10.9万个工作机会,占明确编程语言需求工作的7%。
按月份划分的PHP工作需求占比:
6.C/C++
从C语言的首次发布到现在已经过去了50年,而从后来C++的出现到现在也已经过去了37年,C++最初的名字是“C with Classes”。一直以来,C/C++通过对语言的定期补充和改进保持了其受欢迎程度。
现代C++包括面向对象、泛型和函数特性,它还有助于低级内存操作。它在行业中的使用范围很广,在视频游戏、服务器、数据库、空间探测器和其他许多地方都可以看到C++的身影。
在这八个月里,DevJobsScanner发现了8.5万个工作机会,占明确编程语言需求工作的5.5%。
按月份划分的C/C++工作需求占比:
7.Ruby
Ruby是需求量最七大的编程语言,它最受欢迎的用法是与Web框架Ruby on Rails结合在一起。尽管第七名看起来不高,但Ruby被广泛使用在Twitter、Crunchbase和Github等顶级科技公司。
在这八个月里,DevJobsScanner发现了6.6万个工作机会,占明确编程语言需求工作的4.2%。
按月份划分的Ruby工作需求占比:
8.Go
Go是谷歌在12年前创建的一门年轻的语言。最初,谷歌设计Go是为了在多核、联网机器和大型代码库的时代提高编程效率。从下面的图表中可以看出,Go的受欢迎程度正在缓慢增长,在2023年它可能会进入前五名。目前,像Uber和Twitch等一线公司正在使用Go。
在这八个月里,DevJobsScanner发现了3万个工作机会,占明确编程语言需求工作的2%。
按月份划分的Go工作需求占比:
需求量最大的编程语言(完整列表)
以下是2022年编程语言及其各自需求量的完整图表:
以及按月份划分的同一视图:
总结
很明显,Javascript和Typescript在开发者就业市场上占主导地位。在明确要求使用编程语言的工作机会中,Javascript和Typescript总共占了32%。这一巨大的数字意味着,每三个工作机会中就有一个需要Javascript或Typescript的知识。
Python和Java是2022年需求量第二和第三的编程语言,但在过去的两个月里,Java的工作机会数量已经超过了Python。
C#是另一种值得关注的语言,在这8个月中,它一直在缓慢增长。Go的情况也是如此,它一直在逐月增加。DevJobsScanner预测这两种语言,尤其是Go,在未来可能会发挥更大的作用,占据更多的就业市场份额。
最后,这个排名和你想的有出入吗?你目前在使用哪个编程语言呢?
版权声明:本文转载为CSDN博主「CSDN 程序人生」的原创文章。
783 查看全文
框架之间的论战一直以来都是 JavaScript 社区的热门话题,也是业内的圣战之一。从刚开始的 jQuery,到后来的 AngularJS,再到现代框架,相关的讨论从未停歇。
参与者
自从 JavaScript 这场框架“战争”开始以来,Backbone 与 Sencha 等框架逐渐“体力不支”,在战斗中倒下了,它们所遗留下的只有大量需要维护的代码。而存活下来的,像 jQuery 则变得越来越强大,如今拥有一个庞大的社区;另外存活下来的还有像 Angular 这样没有预期中发展得那么好的框架,让人略感遗憾。
1.jQuery
jQuery 是一个快速、简洁的 JavaScript 框架,它可能是目前最老的参赛者了。由于 jQuery 曾经修复了浏览器之间的互操作性,因此它非常流行,但它的应用却很难扩展。
不过如今,jQuery 已经不是主流框架之一,也不再是大多数项目的最佳选择。
2.AngularJS
AngularJS 作为一个基于 JavaScript 的开源前端框架,目前它已经达到了生命周期终止的状态(EOL),未来将不再获得任何支持与维护,Angular 团队希望现有用户能够迁移到下一代的 Angular 框架中。
由于它曾是框架生态系统的一次巨大飞跃,因此有不少人依旧怀念它。但因为它已经不再被积极维护了,所以不算是一个竞争者。
3.Angular
Angular 是如今高效和开源的 JavaScript 框架之一,起初它的诞生是为了与 React 竞争。随着 AngularJS 越来越老,出现许多问题,而 React 却发展得很好的情况下, AngularJS 团队决定对其进行现代化改造,将 AngularJS 重写为 Angular。
Angular 最令人感到繁琐的应该就是其陡峭的学习曲线,它需要很多概念,因为并不是所有东西都是直截了当的。想要学好 Angular 是很不容易的——它既继承了 AngularJS 的学习曲线,又有像 RxJS 或分层依赖注入这样的困难之处。
(Ben Nadel 的原图)
Angular 存在的另一个问题是它至今还有许多目标没有达成。例如,自从 Angular 2.0 以来,不少人都期待能有一个简单的方法来创建服务器端渲染的页面,但直到 2022 年 2 月,Angular.io 网站自身在没有 JavaScript 的情况下仍然是无法工作的。
事实上,Angular 的最大问题是碎片化和版本升级。版本升级的困难程度甚至令用户不愿意冒险升级其应用,关于这一点,你可以在 npm 网站 上查看。
(有很多在使用旧版本的用户)
4.VueJS
Vue 是比 AngularJS 性能更强,且比 Angular 更稳定、更容易使用的框架。Vue 在其模板系统中非常接近最初的 Angular,它既保持了 AngularJS 的简单性,同时又从 React 获得了一些灵感。
不过 VueJS 在版本 1 和版本 2 中存在一个严重的问题:它不能很好地处理数组,编写者把他们错误选择更新算法导致的结果归咎于 JavaScript。此外,如果你不使用像 Vuex 或 Redux 这样的库,可能就会出现严重问题。你可以在这里看到一个在 AngularJS 中工作的应用程序,但却不能在 VueJS 中看到。
(Vue 文档的摘录,将其变化检测算法的局限性归咎于 JavaScript)
所幸,这个问题在版本 3 中已经得到了解决。
5.SvelteJS
SvelteJS 是一个逐渐强大的竞争者,它声称自己的主要优势是在构建时会将组件转换成高效率执行的命令代码。据 SvelteJS 表示,这比 React 采取的声明式更好。
SvelteJS 使用起来的确更简单,但转换成命令代码以及生成的组件并不像看起来那么容易。在某些情况下,SvelteJS 无法正确检测更改,当这种情况发生时,状态可能会被破坏并且视图也不会正确更新。这个问题引起了很多关注,导致 SvelteJS 像过去的 VueJS 一样,很难证明它其中的项目都是合理的。
6.StencilJS
StencilJS 作为基于 Web Components 设计的框架,从技术上讲,StencilJS 并不算是真正的框架。实际上,StencilJS 允许编写组件,并将其翻译到其他框架。如今,它可以将组件转换为 Angular、React、Vue 和 Web Components 组件。
7.Mitosis
你可能并没有听说过 Mitosis,但正是因为它让我写了这篇文章。Mitosis 是 Angular 的创建者 Misko Hevery 开发的最新框架,并且 Mitosis 与 StencilJS 具有相同目标—— 将其组件转化为许多框架。
8.React
React 是最古老的现代框架之一,在 npm 存储库中有超过 10 年的历史。尽管如今 React 已经发生了很大的变化,但它仍然与大多数以前的版本兼容。近年来,React 发展得越来越好,有人表示,是 React 钩子(React 函数组件的副效应,用来为函数组件引入副效应)创建了这个更好的框架。
不过 React 最厉害的地方并不是它的钩子或是任何可见的功能,而是别的地方——React 推动了 JavaScript 的最新标准,也推动了 JSX 的发展。React 不再是一个框架,但也许它从来都不是——它只是一个库。React 努力地推动标准,最终,它将自己从用户代码中移除。
最终的获胜者
获胜者当然就是……React,不过这并不是 React 本身,而是其背后的哲学。React 本身就是一个库,它可以被许多其他库所取代,例如 Preact 或 React Native。但如果你仔细观察,会发现 StencilJS 或是 Mitosis 与 React 非常相似,这并不是一个巧合,因为:
“最好的框架是将自己从用户代码中剥离出来的框架"
React 在很大程度上利用了 JavaScript 和 JSX(嵌入了 XML 的 JavaScript),而且用户代码对 React 来说是不可知的,只要稍加调整,完全相同的代码就可以在其他框架中运行。
因此,毫无疑问,React 是框架之战的最终赢家。
782 查看全文
去年 10 月,欧盟委员会提出一项新议案,计划使 USB-C(即 USB Type-C)成为所有智能手机、平板电脑、相机、耳机、便携式扬声器和手持视频游戏机的标准接口。这让苹果公司非常不满,为了表示抗议,苹果声称该提案会扼杀创新,但抗议最终被否决。
而近日,苹果产品的使用者 hoakley 在其 Mac 中就遇到了一个有关 USB-C 的问题,他发现与所有其他 M1 型号一样,新的 Apple Silicon Mac 不完全支持通过 USB-C 连接的存储。
hoakley 表示,如果不降低 M1 Mac 自身的安全性,它就无法访问任何 USB-C 存储设备上的 S.M.A.R.T.(自我监测、分析及报告技术)健康指标。这迫使他要在没有健康指标的完全安全性和降低安全性以访问这些指标之间做出选择。
问题的起源
1995 年,S.M.A.R.T. 被纳入 AT 附件 (ATA:高技术配置) 标准以支持对硬盘健康状况的监控。到了 1996 年,苹果放弃用于硬盘的 SCSI(小型计算机系统接口)接口,此时 PowerPC Mac 中的 ATA 替代品开始支持 S.M.A.R.T. 。
1998 年,随着第一台 iMac 的推出,苹果引入了 USB,使用户能够从外部连接相对便宜的硬盘。尽管通过 USB 监控 S.M.A.R.T. 是可能的,但苹果决定不支持它,因此在 2015 年添加 USB-C 端口时也做出了类似的选择,始终没有通过 USB-C 支持 S.M.A.R.T.。
第三方内核扩展
如果你想通过任何形式的 USB 连接支持 S.M.A.R.T. 监控,唯一的途径就是第三方内核扩展,即 SAT SMART——直至今天使用的仍是 Jarkko Sonninen 五年前最后一次更新的开源代码。
第三方内核扩展已被弃用多年,这也成为了 Apple Silicon Mac 中的一个严重问题。如今苹果积极鼓励用户在完全安全模式下运行这些新模型——该模式禁止加载任何第三方内核扩展。所以如果你想在 M1 系列 Mac 上加载 SAT SMART 内核扩展,你只能选择降低它的安全性。
Time Machine
Time Machine 是 Mac 的内置备份功能,它可以自动对使用者的所有文件进行备份,包括应用、音乐、照片、电子邮件、文稿和系统文件。它是自动备份功能的一大突破,内建于 macOS,能为 Mac 上的一切建立最新拷贝,包括数位相片、音乐、家庭影片与文件。只要使用者有需要,利用 Time Machine 就能轻易回到过去恢复任何资料,甚至能恢复整个电脑系统。
Time Machine 作为一种本地化的数据备份方式,想要使用它,首先需要做的就是在 Mac 上连接一个外接硬盘(需另外选购)。不过由于 M1 系列 Mac 不支持添加适合这些备份的内部存储,所以只能选择本地连接或网络连接。
也许几年前你可能考虑过使用 Time Capsule(苹果一款集无线硬盘驱动器和无线基站为一体的产品),但苹果在 2018 年就停止了这些产品的生产。另外,适用于 Time Machine 的第三方 NAS(网络附加存储)系统也受到苹果弃用 AFP(网络协议,为 Mac 计算机提供文件服务)的限制,导致一些主要制造商因此放弃了对 Mac 支持。此外, 比起 iCloud Drive 仅将用户文件与服务器同步,Time Machine 能够提供完整的系统备份来用于系统还原。
假设你对这种弃用和停产产品的解决方案是本地附加存储,那么你需要知道唯一得到苹果完全支持的总线是 Thunderbolt(雷电接口),可用于昂贵的 RAID 硬盘阵列或 NVMe 固态硬盘。直到你了解 Time Machine 的备份是在 macOS 启用 I/O 节流的情况下进行的,后者在性能方面都还是很有吸引力的,因此你不会看到那些只有昂贵的外部固态硬盘才能够达到的性能。
解决方法
在了解 M1 Mac 不提供对 USB-C 存储完全支持的情况下,我们应该改用 Thunderbolt(雷电接口)来替代。目前,无论你是购买完整的驱动器还是使用机箱自行组装,2TB 固态硬盘的溢价约为 600 元以上。但在很多时候,这种附加费基本上是被浪费了的。
举个例子,hoakley 的 OWC Thunderbolt 3 固态硬盘机箱,尽管容纳了 SATA(串行硬件驱动接口)单元,享有全面的 S.M.A.R.T. 支持,但总共 8TB 的成本约超过 7000 元——这个价格几乎与入门级 M1 iMac 相同。
在这种情况下,苹果公司究竟要建议使用者怎么做?是在完全安全的情况下运行自己新的 M1 Mac,同时放弃监控其 Time Machine 备份存储的健康状况;还是降级设备的安全性并安装第三方内核扩展,以便使用者能够对存储备份的驱动器进行监测?
而 hoakley 认为,或许还有一个更好的选择:苹果可以通过投入一点工程时间添加 S.M.A.R.T. 健康监测来完全支持 USB-C。
838 查看全文
Java 作为当前最流行的编程语言之一,常被用于企业级应用开发中。
近日,安全公司 ForgeRock 的研究员 Neil Madden 发现在 Java 15、16、17、18 版本的 ECDSA(椭圆曲线数字签名算法)签名验证中存在一个严重漏洞,黑客可以通过该漏洞轻松地伪造 TSL 证书和签名、双因素身份验证消息等,以及对文件和其他数据进行数字签名。
对此,Neil Madden 甚至将该漏洞比作科幻剧《神秘博士》中经常出现的空白纸:
《神秘博士》中有一个反复出现的情节装置,即医生通过出示一张实际上完全空白的“纸”来摆脱困境。这种纸也被称之为“通灵纸”,这使得看着它的人可以看到医生想让他们看到的任何东西,如:安全通行证、搜查令或其他。
这场景放在 Java 这门语言上,意味着黑客可以透过有问题的 Java 版本,向用户展示“非常真实”的加密通信、身份验证令牌、代码更新等等,而用户根本察觉不到有任何的异常。
不过好在 Oracle 发布了一则《重要补丁更新公告-2022 年 4 月》的说明,在 520 个新安全补丁中,对于 Java 漏洞也进行了修复,在此也呼吁使用 Java 15、16、17、18 的开发者或企业尽快进行更新。
ECDSA 漏洞
所谓 ECDSA,是指使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。与 RSA 或其他加密算法相比,ECDSA 的一个关键优势是它生成的密钥更小,使其非常适合用于包括基于 FIDO 的 2FA、安全断言标记语言(SAML)、OpenID 和 JSON 在内的标准中。
针对这一漏洞,Oracle 将其编号为 CVE-2022-21449,严重性评级为 7.5(满分 10)。不过,安全公司 ForgeRock 最早在 2021 年 11 月 11 日发现此问题时,将其评为 10 级漏洞。
Madden 解释道,“很难夸大这个漏洞的严重性。如果你将 ECDSA 签名用于这些安全机制(SSL、JWT、WebAuthn)中的任何一个,并且如果你的服务器在 2022 年 4 月重要补丁更新 (CPU)之前运行任何 Java 15、16、17 或 18 版本,那么攻击者可以轻而易举地完全绕过它们。现实世界中几乎所有的 WebAuthn/FIDO 设备(包括 Yubikey)都使用 ECDSA 签名,许多 OIDC 提供商使用 ECDSA 签名的 JWT。”
与此同时,来自 Infosec 的专家 Thomas Ptacek 甚至将这一漏洞描述为“年度加密漏洞”。因为这个漏洞非常容易被利用,而且存在明显的编程错误。
漏洞原理
简单来看,ECDSA 签名由两个值组成,称之为 r 和 s。要验证签名是否有效,必须检查涉及 R 和 S 的等式,即签名者的公钥,以及消息的加密哈希。
根据安全公司 Sophos 解释,验证步骤如下:
S1:选择一个介于 1 和 N-1 之间的密码健全的随机整数 K。
S2:使用椭圆曲线乘法从 K 计算 R。
S3:万一 R 为零,请返回步骤 1 并重新开始。
S4:从 K、R、要签名的哈希和私钥计算 S。
S5:万一 S 为零,请返回步骤 1 并重新开始。
理论上,当等式两边相等时,可以验证通过,签名有效。如果不对等,那说明对方不是自己人,不值得信任。但是这个相等也是有前提的,就是 r 和 s 的值不能为零。这是因为如果 r 或者 s 有任何一个值等于 0,那么通过验证的公式,只会有以下结果:0 = 0 X(来自私钥和散列的其他值),无论 X 的值是什么,等式都会成立。这意味着开发者只需提交一个空白签名即可成功通过验证检查。固然,这个值不能为零。
而此次 Java 中 ECDSA 的漏洞也是出现在这里,其应用的签名验证没有检查 R 或 S 值是否为零。
值得庆幸的是,Java 15 及以上版本应用率并不像早期版本那么广泛。据安全公司 Snyk 在 2021 年 2 月和 3 月收集的数据显示,企业采用 Java 15 的仅占 12%。多数企业还停留在 Java 8 等旧版本中。不过,使用任何受影响的 Java 版本也需要及时更新 Oracle 最新发布的补丁,详见:https://www.oracle.com/security-alerts/cpuapr2022.html。
847 查看全文
铁打的 Java,流水的版本。
不久前,Java 18 才正式发布,遵循 Oracle 六个月发一版本的频率,Java 19 将在今年 9 月出炉。这不,还没等众多开发者用上 Java 18,关于 Java 19 最新的两个目标功能就被披露了出来。
据外媒 InfoWorld 报道,根据正在进行的增强 Java 计划,Java 19 有可能承载大量功能,包括从通用泛型到值对象。其中,官方在 Java 19 中明确提出的两个最新特性分别是:用于表达向量计算的 Vector API,它将在 Java 下一版本中进行第四次孵化;将 JDK 一直到开源的 Linux/RISC-V 指令集架构(ISA)。
用于表达向量计算的 Vector API,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳矢量指令。使用该 API 的开发者可基于一个用户模型,使用支持自动矢量化的 HotSpot,从而获得了一种在 Java 中编写复杂矢量算法的方法,使矢量化更可预测和稳健。
在开发设计时,这个 API 主要目标包括了四个方面。一是,API 能够清晰简洁地表达范围广泛的向量计算;二是 API 与 CPU 架构无关,可以在支持向量指令的多个架构上实现;三是在 x64 和 AArch64 架构上具有可靠的运行和编译性能;四是能够实现 "优雅 "的降级,以应对矢量计算在运行时不能完全表达为矢量操作序列的情况。Vector API 先前已被纳入 JDK 16、JDK 17 和 JDK 19。
随着 Linux/RISC-V 的移植,Java 将获得对一个硬件指令集的支持,该指令集已经被广泛的语言工具链所支持。实际上,RISC-V 是一个相关 ISA 的系列。据官方透露,Linux/RISC-V 端口将只支持 RISC-V 的 RV64GV 配置,这是一个包括矢量指令的通用 64 位 ISA。Java 开发者可能会在将来考虑其他 RISC-V 的配置。
移植将支持以下 HotSpot VM 选项:模板解释器、C1(客户端)JIT 编译器、C2(服务器)JIT 编译器,以及所有当前的主线垃圾收集器,包括 ZGC 和 Shenandoah。实际的移植工作已接近完成;JDK 增强建议(JEP)的重点是将移植工作整合到 JDK 主线库中。
而除了以上两种特性之外,允许 Java 程序与 JVM 运行时之外的代码和数据互操作的 Foreign Function 和 Memory API 也或将出现在 Java 19 中。
最后,值得一提的是,和 Java 18 一样,Java 19 同样是非 LTS 版本,只要六个月的支持期,在此不太建议大家在生产环境中直接使用,不过其中的功能特性可供尝鲜。你期待吗?
875 查看全文
Filecoin是分布式存储网络,这在区块链行业中已人尽皆知,并为其带来了一个全新的发展方式。Filecoin的出现有效地解决了当前数据存储的两难局面,大大降低了存储和数据传输成本,并提高了数据的安全性,目前是一个没有竞争的项目。
那为什么我们说目前不存在竞争呢?
让我们来了解一下。第一, IPFS和 Filecoin是一个更自由,更开放的因特网。在 IPFS技术方面, IPFS的技术更有优势, IPFS不仅降低存储成本和宽带成本,还增加客户互联网信息存储的隐私和更高的安全性,而且使数据存储更高效,并且永久存储。
接下来就和大家分享一下 IPFS生态系统中的两个应用:
1创新应用
创新应用主要集中在区块链行业,这类落地应用目前阶段并不多见。其主要原因如下:一是区块链本身的发展受到限制,二是 Filecoin目前也刚刚发布不久,主网上线时间不长。
2应用转移
就是将传统型应用迁移到 IPFS上,这个关键集中在非区块链行业。
随着5 G,物联网技术,互联网时代的到来,人们的数据信息正在以惊人的速度增长,但需要完成这样的数据存储,消除重复冗杂的数据信息,查找这些数据的需求变得越来越重要。安全,可靠,高效已成为基本要求。
IPFS/Filecoin技术在目前处于领先地位,它不仅克服了数据存储技术中的大部分缺点,如去中心化数据库查询,而且还显示出由区块链技术分布式系统连接点产生的数据信息安全度,以及对数据信息操作者团队数据信息的控制,因此, IPFS也有“永不消退的系统文件”的称号。确保安装速度提高的海量信息也只有 IFPS了。
Filecoin整合了区块链应用程序,其本身就具备良好的生态环境,可以推动中国实体经济和数字贸易的高速发展。filecoin融合了高科技,并且还构建了分布式系统的基础设施,比传统的去中心化云存储更安全。
这说明 IPFS和 Filecoin紧密结合,不仅推动了区块链的发展,而且建立了一个更加开放、更加自由的互联网,在未来的升值空间也很大。所以IPFS和Filecoin形成了共生的关系。
1598 查看全文
持续了一年多的疫情让零售业遭受不小损失,但重大灾难发生的同时,也孕育着新的机会。此次疫情同样催化了数字化改革的热潮,特别是在零售行业,门店橱窗展示、自助收银、自助点餐、广告发布……这些在几年前看似新鲜的技术现在都已成为常态。越来越多的消费者正逐渐习惯数字化的零售商显。
自助零售
我国零售消费需求、人工成本及场地租金的上涨,将催生出更大的自动设备市场需求。随着人们消费观念和接受程度的转变,消费者对设备的智能化需求与日俱增,自动设备在中国市场发展潜力大。
智微智能精耕自助产业,推出系列自助主板和终端,搭载最新芯片,智微智能推出K075终端,超强的并行任务处理能力,高效的响应能力,丰富的接口,满足扫描,刷卡,触摸等更多的接驳需求。无论是外观还是使用感,都为用户提供更优质的体验,减少等待,二十四小时无人化,实现真正的快生活。
信息发布
数字化显示和AI技术的发展,让数字标牌、信息发布系统展现更加智能化的应用。利用显示界面以及感应技术与受众完成实时互动和数据交换,打造趣味性营销,点对点精准传播,从而为客户提供优质、高效的信息服务成为未来发展趋势。
K075可搭配智微智能JIPS 信息发布系统,利用信息发布系统可简单快捷实现广告内容制作和发布,搭载前端设备、传感器,利用人脸识别,智能语音系统,以及大数据服务,在无人工干预的情况下实现更加个性化服务能力,实现智能化数字传播,提升广告品牌运营效率。
智微智能K075介绍
智微智能JWIPC K075采用Intel Elkhart Lake平台,基于10nm工艺和SuperFin晶体管技术,主打低功耗嵌入式领域。集成Tremont CPU架构、11代核显架构(最多32单元/4K60输出),无风扇设计,优质节能;双通道内存,带来2倍内存带宽,保障内存数据频繁交互的流畅度。
K075支持三路HDMI显示输出,满足自助设备功能需求的同时提升广告播放效果,实现价值更大化。基于信息发布应用也可以实现多区域以及更丰富的内容播放,严格的设计、更强的工艺以及更强大的图像处理能力让其适应多种应用场景。
K075拥有丰富的接口,支持SIM卡槽,M.2接口扩展WIFI/BT模块;MINI PCIe接口可扩展3G/4G模块,满足不同环境的多种网络需求,多个USB3.1接口,实现更多外设接驳需求。预置智微智能自研的看门狗技术,支持远程开关机、网络唤醒、定时开关机、断电保护等无人值守功能,完善自助和信息发布应用。
优化零售体验,国内智慧商显市场和自助产业必将迎来一轮高峰。智微智能迎合市场发展,利用领先的技术,为市场应用提供更优质的产品和服务,加速市场发展升级,重塑商业价值、构建数字化新型零售商业模式。
1318 查看全文
据国家信息安全漏洞共享平台(CNVD)统计数据,2016年我国共收录通用软硬件漏洞 10822个,漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁,近年来我国频繁发布信息安全相关政策,鼓励安全可靠技术和产业生态发展,以应对这种局面。
安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片、服务器、存储、交换机、路由器;底层软件,包括操作系统、数据库、中间件等;应用软件,面向实际应用的不同领域;安全产品,保障边界安全、终端安全和管理安全产品。目前在安可领域,高端芯片服务器等硬件已能基本满足办公需求;基础软件正在实现国产化替代,如云宏虚拟化产品。而在国产系统下,应用生态便显得匮乏了。
实现应用软件从普通环境到安可操作系统环境的平滑过渡,是丰富国产应用生态、推动安可生态从“可用”走向“好用”的重要手段。云宏知库云安可版,便是典型的例子。
云宏知库云是基于文件管理的团队协作云存储平台,通过简单易用的操作、高便利性的文件访问方式、跨越用户单位内外部的高效协作、安全智能的文件管理和随时随地的移动办公模式,将用户大量非结构化数据云端化升级,转换为“数据资产”,赋能组织每一位成员,帮助用户团队实时协作、轻松分享,加速数据流转,提升业务效率。
而面向安可领域的知库云安可版,则采用访问安全策略控制、行为审计、文件加密备份、精细化权限控制等安全手段,达到防病毒、防勒索的目的。
云宏对于安可云生态圈的建设,秉承“N+1+N”融合架构设计理念,以一套安可云解决方案,提供高安全虚拟化、云管理平台、容器服务、知识管理等能力,向下支持x86、ARM、MIPS异构芯片架构的统一管理,向上支持国产操作系统、数据库、中间件,以及云宏知库云安可版等安可行业应用。得益于“N+1+N”融合架构,知库云安可版对安可终端实现完美适配,自上而下全方位守护数据资产安全。
知库云安可版的诞生,对安可领域用户单位内部办公文件统一存储、自动同步、组织间多终端分享协作、机要文件安全管控、政策文件下发在线学习等场景,起到良好的支撑效果。
云盘、办公软件、ERP软件等应用软件,是安可领域生态圈的重要构成部分,让安全可靠技术真正落地,赋能安可用户以信息化技术支撑政府决策、服务用户、协调解决问题。面对安可操作系统,更多的应用软件需要从安可领域的实际需求出发,推动安可产业创新发展。
1290 查看全文
1832 查看全文
3G
3G是第三代移动通信技术,是指支持高速数据传输的蜂窝移动通讯技术。3G服务能够同时传送声音及数据信息。3G是将无线通信与国际互联网等多媒体通信结合的一代移动通信系统。
3GPP
3GPP是The 3rd Generation Partnership Project(第三代合作伙伴计划)的简称,成立于1998年12月,由全球七大标准制定组织(SSO)合作形成——这七个标准制定组织分布世界,包括日本无线工业及商贸联合会(ARIB)、中国通信标准化协会(CCSA)、美国电信行业解决方案联盟(ATIS)、日本电信技术委员会(TTC)、欧洲电信标准协会(ETSI)、印度电信标准开发协会(TSDSI)以及韩国电信技术协会(TTA)。任何公司想要参与其中都必须先加入当地的协会才行,因此3GPP目前有550多名成员公司,这些公司来自于40多个国家,包含网络运营商、终端制造商、芯片制造商、基础制造商以及学术界、研究机构、政府机构。当初的主要目的是为了顺利从2G时代过渡到3G时代指定协议和技术标准,当然目前也为4G和5G制定了标准。
LTE
LTE(Long Term Evolution,长期演进)项目是3G的演进,始于2004年3GPP的多伦多会议。LTE并非人们普遍误解的4G技术,而是3G与4G技术之间的一个过渡,是3.9G的全球标准,它改进并增强了3G的空中接入技术,采用OFDM和MIMO作为其无线网络演进的唯一标准。在20MHz频谱带宽下能够提供下行326Mbit/s与上行86Mbit/s的峰值速率。LTE具有不同的迭代版本,其中Release 8是第一代LTE系统技术规范,Relese 10及之后的版本也被成为LTE-Advanced,传输速率更是超过了1Gbit/s。在2009年10月,中国政府正式向ITU提交了TD-LTE-Advanced作为4G国际标准候选技术的申请。
4G
4G是第四代移动通信及其技术的简称,是集3G与WLAN于一体并能够传输高质量视频图像且图像传输质量与高清晰度电视不相上下的技术产品。4G移动通信技术的根本目的主要是能够在各终端产品间发送、接收来自另一端的信号,并在多个不同的网路系统、平台与无线通信介面之间找到最快速与最有效率的通信路径,以进行最即时的传输、接收与定位等动作。
总结
3G、4G是通信技术
3GPP是标准制定者
LTE是3G到4G的过渡技术
1392 查看全文
使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:
server {
listen 8000;
server_name abc.com;
access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main;
location ^~/user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://user/;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://order/;
}
}1234567891011121314151617181920212223
^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/user/*后面的路径直接拼接到后面,即移除user。
upstream user {
server localhost:8089 weight=5;
}
upstream order {
server localhost:8090 weight=5;
}
server {
listen 80;
server_name abc.com;
access_log "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G" main;
location ^~/user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/user/(.*)$ /$1 break;
proxy_pass http://user;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/order/(.*)$ /$1 break;
proxy_pass http://order;
}
}1234567891011121314151617181920212223242526272829303132
proxy_pass结尾没有/, rewrite重写了url。
1369 查看全文
可能看到这个题目有人就要问了,账户结构又不直接影响转化和流量,随便设置一下就好了,有必要这么大动干戈地讨论怎么搭建吗?但到底是不是这样的呢?我们可以结合手上现有的案例去思考一下,例如,要复盘这次在巨量引擎上的广告投放,我们是不是得清楚自己投了哪些产品,投放到了哪些地域?用了什么定向?使用了哪些创意……等一系列问题,但一个一个去查广告是不是很繁琐?这个时候,如果你提前搭建了一个更有利于我们查看投放数据的账户结构,这些问题就迎刃而解了。接下来,我们就来重点说说合理搭建账户的重要性。
为什么要搭建合理的账户结构?
必要性1:搭建了健康有序的账户有助于进行广告管理,可以为后续的账户优化建立良好的秩序基础。
必要性2:可以细化投放策略,提升投放效果。
必要性3:清晰的创建思路,可以节省投放时间,及时发现问题并处理。
必要性4:便于数据统计与分析,可清晰的对比测试结果。
怎么搭建?5大要点要注意
既然有这么多优势,那该怎么搭建呢?现在,我们就来梳理一下广告优化的操作流程,操作流程共分为7个步骤,即账户结构规划,创建广告组,创建广告计划,创建广告创意,广告投放,报表分析和广告优化,虽然看起来比较简单,但还是有些要点需要注意。接下来,我们就来详细了解具体账户搭建过程中的要点。
要点1:搭建之前,首先要考虑整体账户结构规划。
在使用巨量引擎广告投放平台之前,即我们要投放什么产品,要了解广告组和广告计划的搭建思路,广告创意如何搭建,从哪些维度去思考等等,之后我们进行广告创意,完成这些操作之后,我们就可以进行广告投放了,广告投放过程中会产生投放数据,那么,为了得到更好的优化效果,就需要我们对这些投放的数据进行数据分析,根据数据分析的结果,再反哺我们的广告优化。这样,我们才能在账户搭建过程中,不断完善我们的账户和创意投放。在这里要跟大家强调一下,巨量引擎账户搭建还是有一定的科学方法可遵循的。
要点2:要对每个模块的功能要了如指掌。
推广管理:在推广这个界面,可以进行广告的创建与修改。一个广告账户包含三个层级,广告组,广告计划和创意,广告组管理广告计划,广告计划管理创意 。
报表版块:可以展示账户的推广数据,通过数据报告进行数据的监控与分析,根据数据进行广告的调整与优化。
财务版块:进行账号流水的查询与核对。
工具板块:辅助账户优化工具。分为6大类,账户辅助,定向辅助,创意辅助,优化辅助,计划辅助,开放平台,可根据投放需求选择合适的工具进行使用。账号管理:包含账户相关、消息中心,主页关联、预览绑定,可通过此模块管理或修改账户相关信息,查看消息、对公验证或进行广告预览的设置等。
要点3:要对广告账户的基本结构有了解。
一个账户包含广告组、广告计划、广告创意三个基本层级,支持多创意投放功能。一个广告账户可以包含多个广告组。广告组,主要管理推广目的,预算,一个账户最多可创建500个。广告计划,主要管理定向、出价、投放时间、预算,一个广告组最多可创建500个。广告创意,主要管理广告位、广告创意,一条计划最多可以创建30个。一个广告组可以包含多个广告计划,一个广告计划又可以包含多个广告创意。
要点4:具体账户搭建思路。
账户搭建之前我们要分析广告主推广目标、公司状况、产品特点和行业情况。怎么理解?首先,我们需要根据客户的需求来明确客户的推广目的,推广目标、推广需求、明确推广目的、投放位置、平台。第二,根据公司不同产品线收益及其他推广平台的成本表现、预算情况,明确推广品类,这样可以帮助我们便于搭建账户后分配预算和出价。第三,我们需要根据产品定位、卖点、受众特点,去帮助适配创意及定向。
第四,根据竞争对手特点、精品卖点、构思文案方向,形成差异化营销。
在对广告主的推广目标、公司状况、产品特点和行业情况等进行分析之后,还要选择适合广告主的搭建方法。是按照素材形式搭建?还是根据广告主产品搭建?还是针对投放地域搭建、还是根据投放时间进行搭建也是有技巧的。一般情况下,选择按照素材形式搭建,适用于产品相对单一但素材制作能力较强的广告主。选择产品搭建的,适用于产品类型丰富的广告主。选择针对投放地域搭建,适用于业务有明显地域特征的广告主。选择根据投放时间搭建,则适用于品牌活动较频繁的广告主。
接下来我们来列举几个常见的账户结构案例,第一个案例,某游戏类客户,它是通过投放平台、广告形式定性划分的。首先,客户在投放时,有IOS的下载需求,也有安卓的下载需求,那客户其实在IOS和安卓进行了详细了的区分,分为ios视频和iOS图片,安卓视频和安卓图片,在ios视频下他又进行了一个细致的梳理,从兴趣定向、兴趣关键词和DMP人群包进行了广告计划的搭建,在计划的搭建过程中,根据兴趣定向中他又进行了不同维度的A、B测试,从男性18-50岁和性别不限18-50岁来测试一下,看哪种性别会更适合,这样在广告计划的搭建过程中维度就清晰多了。其实,在广告组的设置中,我们可以灵活的去进行,如把固定需要测试的位置放在广告组的位置,把灵活需要测试的位置放在广告计划的维度。
第二个案例,某相册APP,它是按照用户使用的场景来进行划分的,按照素材和定向来划分广告计划的,其实,这种主要是针对使用场景比较多的广告主而言。
最后一个案例是,某团购类APP,这个比较特殊,因为客户其实对他的一个城市及地域的投放有严格的要求,所以在设置时,他按照地域来进行设置,广告组也是按照地域来设置,广告计划是按照单品和活动来设置,单品分为水果、零食、粮油,活动又分为一元购、新用户福利。所以,还是要根据自己的实际需求来进行合理搭建。
要点5:涉及到数字时要考虑清楚。
这里要注意的是广告组日预算不能低于1000元,预算修改幅度不能低于100元,在实际操作中要考虑进去。还有投放时要根据成本合理选择投放方式,如果说预算很有限,现在就只想要很低的成本,这个时候就建议优先选择低成本。如果说要优先跑量,那就最大化加强跑量效率。如果说要均衡投放,那就尽量均匀地消耗预算,避免流量突增。
关于如何在巨量引擎上搭建合理账户结构,暂时先给大家介绍这么多,毕竟再多秘籍,也得靠一步一步实践,希望大家都能搭建出科学合理的账户结构!
1132 查看全文
根据《晚点 LatePost》的独家消息,1 月 20 日,滴滴内部发公告称将成立技术委员会,CTO 张博担任技术委员会主席,橙心优选 CTO 赖春波、国际化 CTO 卜峥担任副主席。技术委员会将在稳定性保障和中后台降本增效进行持续投入。
公告同时显示,高级副总裁章文嵩将于近期离职。他负责的基础平台工作,将由智能中台负责人杨毅接任;滴滴云将并入企业服务事业群,由蔡晓鸥负责。
离职之后,章文嵩仍将继续担任滴滴技术委员会名誉主席。
章文嵩于 2016 年从阿里云离职加入滴滴,曾负责基础平台、智慧交通、滴滴云等工作。章文嵩将继续担任滴滴技术委员会名誉主席,为滴滴技术体系建设提供指导和帮助。
据内部多名人士表示,这一变动或与 2020 年 9 月 30 日滴滴发生大面积宕机事故有关。 当时网约车、出租车等多个产品受到影响。此外,去年一名直接向章文嵩汇报的高级总监,因出现重大贪腐,被警方带走。
近一年来,滴滴有多名高管离职,包括滴滴高级副总裁兼普惠出行与服务事业群总经理付军华;技术副总裁、科技生态与发展部负责人郄小虎;国际化事业部 COO 仇广宇;技术副总裁、AI 实验室负责人叶杰平;副总裁兼网约车平台公司执行总裁陈熙等。相关职位由内部培养的管理者接任。这或表明,滴滴在做管理层更新迭代。
一直以来,滴滴的困境不在对手,而是自己。网约车是个高频、低毛利业务,降本增效会是未来一直存在的课题。而前提是,组织要足够高效。
1188 查看全文
<ul class="content">
<li>分类列表1</li>
<li>分类列表2</li>
<li>分类列表3</li>
...
<li>分类列表100</li>
</ul>
//css
.content{
height: 150px;
background-color: #ff8198;
overflow-y: scroll;}1234567891011121314
<template>
<div class="wrapper">
<ul class="content">
<li>分类列表1</li>
<li>分类列表2</li>
...
<li>分类列表100</li>
</ul>
</div></template><script>import BScroll from 'better-scroll'
export default {
name: "Category",
data(){
return {
scroll:null
}
},
//组件创建完后调用
created() {
//new BScroll('.wrapper')
},
mounted() {
//console.log(document.querySelector('.wrapper'));
this.scroll = new BScroll(document.querySelector('.wrapper'))
}
}</script><style scoped>.wrapper{
height: 150px;
background-color: #ff8198;
overflow: hidden;}</style>1234567891011121314151617181920212223242526272829303132333435363738
1.注意不要在created()方法中里面用BScroll,因为此方法是在组件创建时调用,如果把BScroll写里面会获取不到元素。
2.上面的代码中 BetterScroll 是作用在外层 wrapper 容器上的,滚动的部分是 content 元素。这里要注意的是,BetterScroll 默认处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略。所以,这里我们要滚动的是ul里面的li,但是ul不能作为父元素,否则只有一个li是滚动的,不是我们要的效果,所以要在ul外面包一个div。
3.切记,触摸滚动,而不是鼠标滚动,不要像我一样傻傻的用鼠标滚动,然后就看不到局部滚动的效果,还以为是哪里用的不对。解释:因为这个框架主要用于移动端,而我们移动端哪里来的鼠标,不就是触摸嘛。
1174 查看全文
你是否从前羡慕过那些大佬,那些人,什么都可以给你整出来。
你是否嫉妒过那些刷题王,那些人,手一挥代码就好。
而你做题,大脑一片空白,没有思路,代码bug连篇,感觉自己就是制造bug的。
如果是这样,就往下继续看
别灰心,大家一开始都是这样的,这只是过程中的一部分
你只需要做到以下几点,你会超过所有你想超过的人,只要你愿意。
1.不偷懒,不放弃
2.不要在意别人对你的看法,要做好自己
3.遇到不会函数就问百度(敏而好学,不耻问百度)
4.做题时可以换上方向思考
5.先从简单的到难得,不要勉强自己
6.拿着你的零花钱,买几本对你有用的编程书(电子书也行)
7.永远不要定下计划,因为计划赶不上变化,有时间就学习
8.一定要相信自己
9.做过的题目可以换一种算法再做一下
10.算法和思路是程序的主要组成,所以打代码前先思考一下,在大脑里模拟一下吧
11.不会的东西,以及找不出来的错误,可以问别人
12.不要和别人攀比,和自己比
13.可以骄傲,但永远不要小看一些事物
14.在网上搜一些小程序,可以学着制作
15.把学到的知识活学活用,也就是用到生活中,比如做作业觉得麻烦,可以弄个代码,帮你算
16.尝试疯狂刷题
17.可以做一些小游戏,自己玩玩或者分享给别人,这样自己会有成就感
1061 查看全文
5G商用已走过1年,“5G”衔接万物正散发出诱人光荣,详细到交通出行,“5G车联网”作为轿车职业交融技能展开研讨中的一个重要范畴,现已成为国内外新一轮科技立异和工业展开的热门。我国软件网整理车联网工业的新近意向,洞悉职业展开的三大趋势。
趋势一:方针盈利加速车联网工业布局
十三五时期,多部委主导方针引领,加速培养5G交融运用,不断深化依据C-V2X的车联网规范体系、工业协同和演示运用,构建新式车联网工业环境和工业规范,加速推进工业互联网和5G的交融运用,全面支撑轿车与多个工业的网联化智能化协同展开。
趋势二:5G车联网的生态圈不断完善
车联网的生态圈现已构成,正在催生很多新技能、新产品、新服务,其间5G技能在车联网运用中起着无足轻重的效果。
截止2020年10月,我国已累计建造5G基站超70万个,5G终端衔接数超越1.8亿。车联网的三个中心:网络衔接、轿车智能化、服务新业态,都是建立在5G根底设备的基座上。
从细分职业来看,车联网工业是轿车、电子、信息通讯、路途交通运输等职业深度交融的新式工业,是全球立异热门和未来展开制高点,工业链条长,工业人物丰厚,跨过服务业与制造业两大范畴,彼此浸透,跨界交融,这些是车联网工业的杰出特征。
从工业结构来看,车联网工业的参与者首要包括车厂、车主、网络运营商、软硬件供给商、内容供给商等。本年5月份,华为在其官网发布了其5G轿车生态圈的第一批18家车企。这些车企分别是:一汽集团(一汽红旗、一汽飞跃、一汽解放)、长安轿车、春风集团(春风乘用车、春风小康)、上汽集团(上汽乘用车、上汽通用五菱)、广汽集团(广汽新能源)、北汽集团(北汽新能源)、比亚迪、长城轿车、奇瑞控股、江淮轿车、宇通(客车)、赛力斯、南京依维柯、T3出行。
1114 查看全文
五子棋还是有很多大佬发的,今天我也发一篇萌新写的小五子棋
这个是终端版的,如果有问题请大家指出,我去修改
代码如下:
screen = []screen_change=0def into():#初始空白棋盘
for i in range(screen_change):
list_width=[]
for j in range(screen_change):
list_width.append(' '+' |')
screen.append(list_width)def user_black():
while True:
coordinate = input("黑方请输入你想填下子的坐标 例1,2或者5,5")
coordinate=coordinate.split(',')
width_num = int(coordinate[0]) - 1
high_num = int(coordinate[1]) - 1
if screen[width_num][high_num][1]!=' ':
print('你输入的地方已经有棋子了,请重新输入')
continue
screen[width_num][high_num] = ' ' + '@' + ' |'
break
screen_print()def user_white():
while True:
coordinate = input("白方请输入你想填下子的坐标 例1,2或者5,5")
coordinate = coordinate.split(',')
width_num = int(coordinate[0]) - 1
high_num = int(coordinate[1]) - 1
if screen[width_num][high_num][1] != ' ':
print('你输入的地方已经有棋子了,请重新输入')
continue
screen[width_num][high_num] = ' ' + '#' + ' |'
break
screen_print()def eeferee():#判断输赢
#判断行
for i in range(screen_change):
for j in range(screen_change-4):
if screen[i][j][1]==screen[i][j+1][1]==screen[i][j+2][1]==screen[i][j+3][1]==screen[i][j+4][1] and screen[i][j][1]!=' ':
return False
for i in range(screen_change - 4):
for j in range(screen_change):
if screen[i][j][1]==screen[i+1][j][1]==screen[i+2][j][1]==screen[i+3][j][1]==screen[i+4][j][1] and screen[i][j][1]!=' ':
return False
for i in range(screen_change - 4):
for j in range(screen_change - 4):
if screen[i][j][1]==screen[i+1][j+1][1]==screen[i+2][j+2][1]==screen[i+3][j+3][1]==screen[i+4][j+4][1] and screen[i][j][1]!=' ':
return False
for k in range(4,screen_change):
if k>=4:
if screen[i][k][1] == screen[i+1][k-1][1] == screen[i+2][k-2][1] == screen[i+3][k-3][1] == screen[i+4][k-4][1] and screen[i][k][1] != ' ':
return False
return Truedef screen_print():#打印棋盘
print('——' * (screen_change*3+1))
for i in range(screen_change):
print('|',end=' ')
for j in range(screen_change):
print(screen[i][j],end=' ')
print()
print('——'*(screen_change*3+1))def main():
global screen_change
screen_change = int(input('请输入你设定的棋盘大小:'))
into()
screen_print()
while eeferee():
user_black()
if not eeferee():
break
user_white()
print('游戏结束')if __name__=='__main__':
main()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
效果图如下:
1151 查看全文
Eclipse 基金会于近日推出 Eclipse Theia 1.0 稳定版,并宣称其为 Visual Studio Code 的真正开源替代方案(a True Open Source Alternative to Visual Studio Code)。Theia 完全由非营利性且供应商中立的 Eclipse 基金会主导,并由多元化社区进行开发,不会因单一供应商的决定而损害多元化社区的利益。
犹记得在三年前,还是Eclipse 大行其道,不知怎么的,好像逐渐就被idea蚕食了许多份额,这次的推新,是否也有Eclipse 的不甘心在里面?
从上图的官网介绍可以看出,Theia 整合了云端 IDE 和桌面 IDE,这是一个可扩展的平台,包括开发者、组织机构和供应商在内的任何人都能够基于 Theia 使用最新的 Web 技术开发功能完备的多语言云端和桌面 IDE。
当作为云端 IDE 时,Theia 会在两个独立的进程中运行,它们分别被称为前端和后端(对应的就是本地浏览器和远程服务器),彼此之间通过 WebSockets 的 JSON-RPC 消息或 HTTP 的 REST API 进行通信。而作为桌面 IDE,前端和后端均在本地运行。
官方提到 Theia 可以作为 Visual Studio Code 的替代方案,因此其界面也和 Visual Studio Code 极为相似。更重要的是,Theia 原生支持 Visual Studio Code 扩展协议,也就是说我们可以在 Theia 上安装和重用 Visual Studio Code 扩展。
Theia 灵活的架构让它成为了一个可扩展、可调整的平台,使用者可以根据特定的用例以非常细粒度的方式对其进行深度定制,而无需为项目提交补丁或分叉项目。下图是 Arm 基于 Theia 进行定制开发的项目:
Visual Studio Code 作为一个桌面终端应用,微软为各个平台提供了可用的二进制包,但希望替代它的 Theia 却没有在官网提供下载链接。原因在于 Theia 并不是一个最终产品,这也是为什么标题把它称作「IDE 框架」。你可以根据自己的需求基于 Theia 构建和自定义一款属于你的 IDE。例如,假设你需要一个完全支持量子计算语言和对应工作流的 IDE,那就可以在 Theia 的基础上增加扩展或移除不必要的模块,进而构建出一个功能完备的 IDE。或许这就是 Theia 强调自己「真正开源」的原因。
那么,你现在在用哪一款编程工具呢?
1105 查看全文
MySQL优化的本质:
1. 结合MySQL数据库的主要特性(数据存储与数据查询),使得数据存储占用空间更小,更新、查询速度更快,并发程度更高,使得服务器资源利用率更高。
2. 尤其是对于大数据量、高并发的业务场景,避免因不合理的设计拖垮数据库,造成数据库宕机、数据丢失、业务无法正常进行等问题,保证服务的可用性。
以下为本人总结的部分优化建议:
选择InnoDB引擎。InnoDB引擎支持事务、行级锁、并发性能更好,CPU及内存缓存页优化使得资源利用率更高。
使用UTF8字符集,UTF-8MB4。无需转码,不存在乱码的风险,更节省空间。
减少存储过程、视图、触发器等使用,尽量将计算逻辑设计运用至业务代码层面,避免因耗时计算影响到数据库的并发,严重时拖垮数据库。
使用自增主键。Innodb是基于B+树的索引组织表,使用自增主键,数据行写入可以提高插入性能,可以避免页分裂,减少表碎片提升空间和内存的使用。
禁止使用外键,外键导致表和表之间的耦合。更新和删除操作涉及关联的表,极大地影响sql的性能,甚至可能造成死锁。
禁止使用TEXT、BLOB类型。更多的磁盘和内存空间将被浪费,且大字段查询将会清理掉热点数据的缓存,导致缓存命中率急剧下降并影响数据库性能。如有必要,创建另一个表记录,将热点数据与大字段数据分离。
适当的建立索引,避免全表扫描。
不要过多的建立索引,建议控制在5个以内。索引的本质是对数据顺序的记录,占用存储空间,不宜过多。可使用EXPLAIN来查看了解索引命中情况。
索引的建立原则:为常用于where或orderby语句后的字段建立索引,但对于数据值变化少(区分度不大)的情况不适用,如“性别”字段,一般值为“男/女/未知”等,建立这种索引并不能加快查询速度,却浪费了磁盘空间。
更新十分频繁的字段上不宜建立索引。更新操作会变更B+树,重建索引,这个过程十分耗性能。
联合索引的建立要满足“最左匹配”原则,将命中率更高的字段建立在最前面。
列值设置默认值,禁止null值,以防破坏索引,影响查询效率。
不在where语句后使用函数或者表达式计算,会造成索引失效。
不使用NOT IN和<>操作,%开头的模糊查询,避免全表扫描;
避免使用属性隐式转换。如phone='123456789’为字符串不写成phone=123456789。
尽量建立覆盖索引,避免回表查询。
唯一/普通索引的选择。唯一索引需要唯一性检查,不能利用 change buffer特性。需要频繁从磁盘读取数据,涉及随机 IO 的访问,效率变低。所以能使用普通索引的场景尽量不使用唯一索引。
更新条件列要使用索引,避免无法通过索引键加锁而升级为表级锁。
varchar字段过长时考虑使用前缀索引。
禁止对大型表使用JOIN查询或子查询。会生成临时表,消耗内存和CPU,极大地影响数据库性能。关联查询可在业务代码层拆分为多次单表查询。
避免存储大文件。大文件可存至专门的文件系统,如OSS。
根据业务需要合理地确定字段类型与长度,避免空间浪费。
大事务尽量拆成多个小事务,减少锁记录和时间。
最长事务代码块尽量放在程序的最后执行。
尽量减少基于范围的数据检索过滤条件更新,避免间隙锁带来的影响而锁定了不该锁定的记录。
注意间隙锁,批量更新&删除操作尽量避免并发,以免造成意外的死锁。
数据量大的业务系统,考虑分库分表,按业务系统的划分垂直分库,单表数据量过大考虑分表(水平/垂直分表)
1106 查看全文
最近在学习使用python编写爬虫爬取自己学校网站的信息并存入mysql中,在爬取过程中异常顺利,但是在存入Mysql的过程中却踩了好几个坑,分享一下在用pymysql存数据时踩过的几个坑。
Pymysql向mysql存入数据,我写的是先链接数据库,然后用字符串的形式编写好mysql的指令块,再通过pymysql的execute和commit上交执行,所以其实在这个过程中容易发生错误的就是这些mysql指令的编写。
遇到的其中一个坑就是:
pymysql.err.InternalError: (1054, "Unknown column 'XXXXX' in 'field list'")
这个坑上网搜了一下网上都是这样的:
pymysql.err.InternalError: (1054, "Unknown column 'nan' in 'field list'")
这说是在存入mysql时要将nan替换成none,然后我就根据这个去检查我的代码,然后还是没发现错误在哪,最后又上网查,终于查到了我那个报错,才知道这是由于引号引起的,
最初写的插入Mysql的指令是:
'''INSERT INTO XXXXXXX(标题, 日期, 作者, 阅读量, 正文) VALUES(%s,%s,%s,%s,%s)'''1
然后改成了:
'''INSERT INTO XXXXXXXX(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''1
这个报错就解决了。
还有一个坑,让我搞了好久才搞定,就是:
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the...1
对于这个报错,上网一搜,就有很多,说是在将数据插入到mysql过程中,这些python的字符串需要转义,要用:
pymysql.escape_string(字符串变量)1
来处理,然后我就试了一下,一开始我直接把execute语句中的元组args加上这一句,然后报错:
AttributeError: 'tuple' object has no attribute 'translate'1
然后我又把这个元组建立时每个变量都加上这个函数,还是没用,还是显示
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the...1
可是还是上网搜,都是说需要转义,又试了改成execute(sql%args),和改成format但是就还是不行,然后我就试了一下新建一个python文件重新写,直接把要存进去的内容写进字符串,没用爬虫,然后他居然没报错!!
最后回到爬虫的那一个文件看了一下发现创建table的语句我写的是:
'''reate table if not exists passage(
标题 char(100) not null,
日期 char(30) not null,
作者 char(50) not null,
阅读量 char(20) not null,
正文 text(5000) not null)
'''1234567
然后插入的语句:
'''INSERT INTO pasage(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''1
把创建的passage写成了pasage,将插入的pasage改为passage,再运行,它就过了。。。。
其实还遇到了:
TypeError: not all arguments converted during string formatting1
这个是
'''INSERT INTO pasage(标题, 日期, 作者, 阅读量, 正文) VALUES("%s","%s","%s","%s","%s")'''1
这个语句中"%s"漏了一个加上就好了。
总的就是,写mysql的指令时要仔细一些。
1113 查看全文
12月14日,2021年全国计算机等级考试大纲发布。自2021年3月起,正式将国产办公软件WPS Office作为全国计算机等级考试(NCRE)的二级考试软件之一。
2003年,WPS Office就已进入国家一级计算机考试范围,本次新增的的二级科目“WPS Office高级应用与设计”将和一级科目在新版教育考试专用版WPS Office软件上实施。
1136 查看全文
NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。
numpy格式的文件可以保存为后缀为(.npy/.npz)格式的文件
1. tofile()和fromfile()
• tofile()将数组中的数据以二进制格式写进文件
• tofile()输出的数据不保存数组形状和元素类型等信息
• fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改
import numpy as np# 随机生成12个数字并将其有一维转换成3*4的矩阵形式a = np.arange(12)print("一维数组:",a)a.shape = 3,4print("3*4的矩阵:",a)# 将数组中的数据以二进制格式写入到文件a.tofile('a.bin')# fromfile在读取numpy文件时需要自己指定数据格式,并且原格式并为保存b1 = np.fromfile('a.bin', dtype=np.float) # 按照float读取数据b2 = np.fromfile('a.bin', dtype=np.int) # 按照int读取数据b3 = np.fromfile('a.bin', dtype=np.int32) # 按照int32读取数据print('float格式b1:{},\nint格式b2:{},\nint32格式b3:{}'.format(b1,b2,b3))b3.shape = 3,4print('b3:',b3)
2. save() 和 load(),savez()
• NumPy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息
• 如果想将多个数组保存到一个文件中,可以使用savez()
• savez()的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起名
• 非关键字参数传递的数组会自动起名为arr_0、arr_1、...。
• savez()输出的是一个扩展名为npz的压缩文件,其中每个文件都是一个save()保存的npy文件,文件名和数组名相同
• load()自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为键获取数组的内容
import numpy as npa = np.arange(12)a.shape = 3,4# 将数据存储为npy/npznp.save('a.npy', a)np.save('a.npz', a)c = np.load('a.npy')print('save-load:',c)# 存储多个数组b1 = np.array([[6, 66, 666],[888, 88,8]])b2 = np.arange(0, 1.0, 0.1)c2 = np.sin(b2)np.savez('result.npz', b1,b2,sin_arry = c)c3 = np.load('result.npz') # npz文件时一个压缩文件print(c3)print("数组b1:{}\n数组b2:{}\n数组sin_arry:{}".format(c3['arr_0'],c3['arr_1'],c3['sin_arry']))
3. savetxt() 和 loadtxt()
• 读写1维和2维数组的文本文件
• 可以用它们读写CSV格式的文本文件
用这种方式来对数据进行存储,方便深度学习中, 保存了训练集,验证集,测试集,还包括他们的标签,用这个方式存储起来,要啥加载啥,文件数量大大减少,也不会到处改文件名。算是get到了另外一种好的存储数据的方式
1112 查看全文
由于itchat运行时,老是报KeyError: ‘pass_ticket’,故itchat暂不能使用。而wxpy在使用时需要登录网页版微信,且动不动报KeyError: 'pass_ticket,所以不方便使用。本文给读者讲述一个简单的方法,实现给微信好友自动发送消息。
使用该功能前需要安装pyautogui和pyperclip,因此键盘点击win+R键,依次输入pip install pyautogui和pip install pyperclip便可安装。
话不多说,代码见:
import pyautoguiimport pyperclipimport time time.sleep(10) # 提前打开微信,等待十秒while True: pyperclip.copy('早起的鸟儿有霾吸') # 需要发送的内容 pyautogui.hotkey('ctrl', 'v') # 按下 ctrl + v 粘贴内容 pyautogui.mouseUp() # 模拟鼠标将左键抬起 pyautogui.moveTo(1315, 800) # 鼠标点击发送按钮 pyautogui.mouseDown() # 模拟鼠标将左键按下 pyautogui.mouseUp() # 模拟鼠标将左键抬起 time.sleep(30) # 设置等待时间123456789101112
pyperclip.copy(’’),括号中为发现的消息内容
pyautogui.moveTo(),括号中为微信’发送’按钮,填写前需要获取到按钮在显示器屏幕的位置。
该方法存在一个弊端,需要一直打开PC端微信,且微信弹窗不能移动。
下面来给大家介绍个简单的方法来获取发送按钮的位置,首先使用微信截图(默认为alt+a键),鼠标移动时,鼠标处显示有POS值,该值即为发送按钮相对屏幕的位置。因此当微信弹窗移动时,需要重新获取该值并更改pyautogui.moveTo()中括号值即可。
1315 查看全文
1067 查看全文
初学者记住一点,学习Java一定是连续性的且循序渐进的“系统化”学习,首先我给你提供一个优秀Java工程师的学习路线。
web前端方面:html、css,Java、jQuery、xml解析、Bootstrap
Java基础:Javase(Java语法、数组、面向对象、Java常用类、异常处理、集合框架、IO、多线程、网络编程、反射机制、)
数据库:MySQL、Oracle、JDBC
Javaweb:Tomcat、Jsp、servlet、ajax
企业级框架:Struts2+Spring+Hibernate+spring MVC+Mybatis(SSH、SSM)
以上知识点都吃透找到工作是没啥问题的,不过对于初学者来说,不可以小看这些的难度,想要真正理解每一个技术,还需要时间去琢磨啊。
根据我多年学习Java编程的经验给大家提出以下几点宝贵建议:
1.了解当今企业的需求,目前的Java工作要求都是两年工作经验以上的,但是你不必担心找不到工作,只要你掌握了招聘网站上的那些要求,就可以实现给企业创造价值的机会,对于互联网公司我最清楚了,他们不管你是哪里来的,只要你可以给公司创造价值,就会有你的用武之地,所以首要目标去了解当今的人才需求。
2.如果你是学生,你的优势在于时间,你可以制订一个半年到一年的学习计划,每天只需要学习一节或者两节视频就好,然后大量的练习去巩固和理解知识点,把基础打扎实。如果你是工作的,可能时间不是太多,那么你就需要提高学习效率,把有限的时间“规划”起来,今天完成哪些东西,就必须要完成,我强调一点,做好“系统的学习规划”,没有规划一定会失败。
3.找大神去请教,你不要想着只通过自己一个人就可以把任何一门手艺学的非常好,那几乎是不可能的,记住一定要跟对这个专业有经验的人多沟通,比如跟我沟通,人和人在交流中会碰撞出你不知道的东西,创造出新的思想和你不可能得知的知识,这是我过来人的经验,一定要听,多跟NB的人交流,对你很有帮助。
4.学习Java的学习方法至关重要,我相信很多自学过Java的小伙伴都有这样的疑问,很多程序我能看懂,但是让我写却很难,这明显就是不会学的表现,在听课的时候,你并没有真正的理解每一个东西的真正用途,课后你完全不知道应该如何应用,一个程序只有你真正动手去写出来,才是注入了生命力,看着像是活,不然就是死的,而这生命力就是我们给的。
5.因为学习时间过长,所以大家不可犯一个错误,边学边忘,所以时间久了忘记了是非常正常的,在规定的一个时间内,进行从头梳理,复习是必不可少缺少的,进行多复习,多动手练习,就会永久的记忆。
注意问题:
1.代码规范,从开始就养成良好的习惯
2.养成阅读博客的习惯
3.不要记笔记,多查Java的API
4.遇到问题,先动脑思考,别张嘴就问,而且问别人之前,先学会如何问问题,不然招人烦
5.初学者少看书,基本看不下去,Java的书少则300页,多则上千页,只推荐一本《Java核心技术》了解下原理就好,以后工作了,在多看技术性书籍
如果你对于学习Java整个流程有任何的问题,可以随时加裙六七八,二四一,五六三,学习方法,学习路线,系统学习规划,希望可以帮助大家少走弯路。
1218 查看全文
新手入门大数据,首先要搞清楚自己的基础水平,学习本是一件严肃的事情,不能盲目,要有目标。
首先分为两类:一是有一定的编程基础,想要学习大数据以达到技术的提升和深造;二是零基础想要涉猎大数据行业。
作为零基础的你,建议你不要急于涉猎大数据技术,而是先深入学习一门编程语言(java、Python等等)。当然了如果感兴趣也可以看一下推荐的书籍,但主要任务还是要放在基础上。
作为有基础的你,可以先从以下大数据书籍入手:
1、《为数据而生》
书中分别阐述在大数据1.0、大数据2.0和大数据3.0时代下,相对应的数据分析需要做到分析、外化、集成。
2、《智能时代》
这本书作者分七章从不同角度对大数据进行介绍,分别以技术和思维方式的改变为主线,从工业革命这个角度嵌入,顺理成章的延伸出大数据与智能化,但是没有将过多笔墨放在技术的深究上,而是选择从应用层面体现大数据的理念。大数据应用则会渗透到各行各业,这正是作者的用心之处。
3、《R语言预测实战》
R语言横跨了金融、生物、医学、互联网等多个领域,主要用于统计、建模及可视化。由于上手快、效率高,备受技术人员青睐。预测是大数据挖掘的主要作用之一,借助R语言来做大数据预测,可以兼具效率与价值于一身。
4、《数据之巅》
这本书中,从小数据时代到大数据的崛起,作者以宏大的历史观、文化观、大数据观,给我们描绘了一幅数据科学、智慧文化的全景图。
5、《Hadoop权威指南》
《Hadoop权威指南(中文版)》从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。
6、《Hive编程指南》
《Hive编程指南》是一本Apache Hive的编程指南,旨在介绍如何使用Hive的SQL方法HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。
想要成为大数据工程师,需要以下的专业技术知识:
hadoop 、spark、storm开发、hive 数据库、Linux 操作系统、分布式存储、分布式计算框架大数据处理和分析技术等等
1215 查看全文
使用position定位有四种方式,分别为absolute、relative、static、fixed,static是静态定位,也为系统自动定位。下面主要分析其他三种定位方式的特点。
1. 绝对定位:position:absolute
(1) 绝对定位是将元素依据已经定位(绝对、固定或相对定位)的离他最近的祖先元素进行定位,祖先元素没有定位或没有祖先元素则默认依据body浏览器窗口定位。
(2) 绝对定位的元素不论本身是什么类型,定位后都将成为一个新的块级元素,如果未指定宽高度默认自适应实际包含的内容区域(不在默认浏览器宽度)。
(3) 绝对定位后的元素将处于赋予其他元素之上,自身不占位置,他原来在正常文档流中所占的空间同时被关闭,就是说绝对定位的元素不占据页面空间,原空间被后续元素使用。
绝对定位必须用left、right、top、bottom属性之一激活,用于指定元素左、右、上、下外边距距离已定位祖先元素(或浏览器)左、右、上、下内边框的距离。
如果定义多个属性,当left、right、冲突时以left为准,当top、bottom冲突时以top为准,如果一个也不指定则元素扔按普通文档流布局,但他自己不再占据空间,后续元素上移与其重叠。
绝对定位元素定位后相对祖先元素的位置不在变化,若页面内容较多拖动页面滚动时,定位元素会随页面一起滚动。
绝对定位元素重叠覆盖其他元素时可用z-index属性设置他们的叠放次序。
2. 相对定位:position:relative
(1) 相对定位是让元素(可以是行内元素)相对于它在正常文档流原位置按left、right、top、和bottom偏移量移动到新位置。
(2) 相对定位的元素移动后保持原外观样式大小,移动定位后不会占据新空间会覆盖新位置原有元素,原位置空间被保留,其他元素相对他原来的位置不变。
(3) Left、right、top、和bottom指定相对原位置移动的偏移量,可以使用带单位数值、相对父元素的百分比%。
Left正值:左边向内—向右移动,负值:左边向外—向左。
right正值:右边向内—向左移动,负值:右边向外—向右。
top正值:上边向内—向下移动,负值:上边向外—向上。
bottom正值:下边向内—向上移动,负值:下边向外—向下。
3. 固定定位:position:fixed
固定定位与绝对定位absolute相似,定位后元素也生成为新块级盒框、覆盖新位置原有元素,在正常文档流中所占的原空间关闭被后续元素使用。
固定定位与绝对定位absolute的区别是定位的元素无论父元素是否定位都会直接在浏览器窗口中定位,不会随滚动条拖动页面而滚动,固定定位用left、right、top、bottom指定浏览器左、右、上、下各边向中心的偏移量作为定位元素外边距位置
总结:元素的定位模型中需要区分每个属性值的不同定位方式,分为绝对定位、相对定位、固定定位以及默认定位和继承父元素。其中绝对定位和固定定位都脱离原本的文档流,而相对定位则遵循原本的文档流。设置元素的定位方式后,还需要指定偏移量。可以从上、右、下、左四个方向进行偏移。并且可以利用Z-index属性设置元素之间的层叠顺序。
1235 查看全文
现在很多公司都比较流行前后端开发分离(注意:是开发的分离,而不是简单的前后端代码分离),比如前端开发是一波人,后端开发是另一波人。这样可以更好体现术业有专攻以及提升整体项目的效率。使用常规的HTML/JS/CSS等开发还好办,大家可以在同一个环境里协同开发。但去到用VUE做前端开发的环境里,这种常规的协同方式显然是行不通的,因为VUE的代码是不能直接使用到项目上,要通过编译输出成HTML/JS/CSS才能部署到开发环境的。这样就会引发另一个问题,VUE的开发环境与后端的开发环境不在同一个上,比如前端用的是VSCODE开发VUE,而后台可能使用的是eclipse,这两者是怎么顺利通过联合测试,然后发布到生产环境的呢?
这个实际要分两种情况,一种是前后端代码最终是整合在一个系统部署在一起的,另一种情况是前端部署在一个应用服务器,后台部署在另一个应用服务器。无论哪种情况都是要经过联调才能真正发布上去。因为我这里是部署在一起的,所以只讨论这种情况的联调。如果两波人做前后端怎么调试呢?一种最简单的方法就是双方启动服务,前端开发人员把后台开发人员的IP端口及resful或servlet路径写在代码上,调试通过后,再把这部分代码替换成生产环境然后再构建出源码。这种应该是最土的方法了。还有一种是使用axios的代理,使用axios的配置实现跨域和联调,最重要的是调试完成后直接build出来的代码就可以放到生产环境中不用再去修改这个后端的IP端口。下面看下是怎么实现的,有更好的方法,欢迎大家留言。
首先在main.js中引入axios 组件,然后重写axios的baseURL
这句意思是判断是否为开发环境,如果是开发环境就用/api否则就是空
关键几句已经标注如下:
其中process.env.NODE_ENV和process.env.BASE_API是在dev.env.js里面定义,这个JS是定义一些开发环境的变量。代码如下:
做完以上两文件的代码编写后,我们在config目录下的index.js中配置axios代理,其中target就是代理要跳转到的后台服务,pathRewrite路径重写,意思是以/开头的请求路径均会跳转到代理服务。
配置完上面几个关键配置文件后,我们就可以使用了,用法如下,
我们运行下VUE,看下页面请求,可以清楚看到已经代理请求到后台服务。
然后我们build出来把源码文件直接放到服务器中不用做任务修改,在实际生产环境中请求效果如下:
可以看到,生产环境是没用到代理的,也就是VUE中开发环境与生产环境的配置是互不影响的,前端开发人员与后端开发人员联调没问题后可以直接构建部署到生产环境。
至此,VUE使用代理实现前后端代码联调已介绍完毕,可能有其他更好的方法,欢迎大家留言探讨。
————————————————
版权声明:本文为CSDN博主「tinalucky」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tinalucky/article/details/106594307
1294 查看全文
随着前端的发展,越来越多的人开始加入到前端的队伍中来,那么对于前端新人来说,2020年前端的发展方向是什么呢?爱创课堂小编总结了下面四个前端的发展趋势及方向,希望能给大家一些帮助,更多前端资讯可以搜索爱创课堂。
1. 超级 APP 下「Web 标准的重新定义
在微信小程序出现以前,大家在谈 Hybird、ReactNative,但终归只是技术层面的狂欢,始终没有业务属性的注入。小程序的出现:一方面告诉业界在当前设备上 Webview 也没差到哪去,另外一方面告诉业界如何让有能力的商家在超级 APP上进行私域运营。
进一步的,从技术角度说,在上层 DSL 的严格限制下,超级 APP 就可定义符合自己诉求的 Web 标准,弥补当前 Web 标准的不足,最后和客户端配合,结合离线、预加载、定制Webview 能产出类似于 NSR 等各种酷炫的技术模型,让 Web 在端内低成本达到 Native 版的体验,端外也不会像 Weex 一样有点小别扭。
当前缺点也非常明显,在百家齐放的时刻,可能很难产生业界的最终标准,Web 的碎片化会更加严重。
2. 工程体系的再度升级
曾经我们谈 Yoman,谈 CLI 等系列构建工具,但在团队大了之后始终觉得差点什么。反观 Java 同学,从没听说过 Spring Boot 配置工程师。
2019 年工程体系一定会更加闭环,不再是一个脚手架这么简单。而是会结合 IDE,打通业务属性,从项目初始化、到编写代码、到 CI、到灰度、到发布 形成一个完成的闭环(可简单理解为『大微信小程序编辑器』)。
最后这种能力很可能会被大厂输出,上云,供小厂使用。
3. CodeLess 初现锋芒
大一点的公司都应该有很多前端的外包,这部分同学承担的大多是写中后台的一些代码,不需要解较深的业务。之所以产生这样的原因无疑是 正式前端员工觉得这部分代码太机械化而不想写,服务端同学又因为样式之类的不想搞。
关于中后台常用的表单,目前已经有很多的 Schema 结合自动产出表单的方案。在 2019 年猜测会和人工智能结合,对业务域上的表单建模学习,最终能达到输入 PRD/Sketch,能直接产出几乎可用的表单。
4. Serverless 让前端离业务更近
当前的前端工程师大多都是科班出身,虽不能和正宗的服务端开发同学比,但也可写很多服务端层的业务逻辑。当前已经有很多公司在做 BFF 层,来满足这部分诉求,但依旧摆脱不掉 运维、机器分配 这条拦路虎。
2019 年几乎所有知道名字的公司都在谈 Serverless(虽然并没有人知道如何落地 Serverless),随着 Serverless 的逐步落地,BFF 这层的代码会摆脱运维、机器分配等复杂的问题,同时大概率会由前端同学写这部分代码,服务端同学专注中台系统的实现。从业务上说,业务的试错成本也会大幅度降低。
(Serverless 是一块新的土壤,选型的同学一定会使用 TS。这也意味着,2020 不写 TS 可能真的就 Out 了)
以上就是总结的前端的一些趋势,希望能帮到你们。
————————————————
版权声明:本文为CSDN博主「大厂前端工程师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/webicketang/article/details/103203091
1196 查看全文
您是否曾经想过全球最大的软件公司之一是如何通过代码审查来确保高质量代码?
我也是。因此,我与同事一起调查了 Microsoft 是如何进行代码审查的。他们的做法是常见的做法吗?开发人员是否需要进行代码审查?他们使用哪些工具?让我们在这篇文章中找到答案。
首先,让我为您提供一些有关 Microsoft 的关键信息。微软大约有 140,000 名员工。其中约有 44%,即超过 60,000 名员工是工程师。成千上万的工程师同时使用相同的代码库来开发 Office,Visual Studio 或 Windows 等几种产品。
可以想象,确保不同子团队开发的代码可以完美地协同工作是一项艰巨的任务。在 Microsoft 中,代码审查起着重要作用,确保可以在如此大规模的范围内实现顺畅的协作。
在 Microsoft,代码审查是一种被广泛采用的工程实践。绝大多数工程师认为这是一个很好的最佳实践。而且大多数高效能团队都花了大量时间进行代码审查。
因为代码审查在 Microsoft 开发过程中起着如此重要的作用,所以它是我们深入研究并真正了解这种做法利弊的理想目标。在 Microsoft 进行的有关代码审查的大规模研究中,我们采访、观察和调查了 900 多名开发人员的代码审查实践。
我们的目的是了解 Microsoft 如何进行精确的代码审查。我们想知道,开发人员在进行代码审查时会遇到哪些代码审查陷阱,以及他们为克服这些挑战而开发的代码审查最佳实践。
大多数经验教训都是非常有价值的,不管对于小型团队和组织,还是对于大型团队和组织。如果你的团队还没有进行代码审查,那么我们会向您展示我们的发现以及代码审查的好处。我还将解释代码审查生命周期,以便您可以将这种实践纳入自己的开发过程中。
如果你的团队已经施行了代码审查,则可以将您的实践与 Microsoft 的代码审查实践进行比较。您的代码审查生命周期看起来是否有所不同?在下一篇文章中,我们将介绍代码审查陷阱和代码审查最佳实践。有了这些信息,您就可以开始查看您的团队是否已经实施了我介绍的所有最佳实践并克服了挑战。现在让我们开始吧。
在这项研究中,有 36% 的开发人员表示他们一天执行多次代码审查。另有 39% 的开发人员表示,他们每天至少进行一次代码审查。12% 的人每周进行多次代码审查,只有 13% 的人说他们在过去一周未进行代码审查。
这意味着 Microsoft 的开发人员将大量时间花费在代码审查上。因此,重要的是要确保这段时间是值得花费。那么,代码审查有哪些好处?
开发人员提到,代码审查最大的好处是提高代码质量并发现代码中的缺陷。代码审查的另一个重要好处是知识转移。
知识转移意味着互相检查代码的团队成员会熟悉大部分代码库。这也意味着代码审查最佳实践是在团队内部不断发展形成的。另一个优势是,新团队成员和初级开发人员可以在查看或获得反馈的同时学习和提高他们的编码技能。
如果开发人员在代码审查期间讨论替代解决方案,则不仅会改善代码库,而且对所有相关人员都有学习作用。因此,学习、指导和自我完善是 Microsoft 将代码审查视为有益实践的原因。
代码审查可以通过多种方式执行。可以是一个开发人员走到另一个开发人员的办公桌前一起看一些代码,也可以是团队一起检查代码。但是,在 Microsoft 进行代码审查时,最有可能遇到的情况是代码审查是借助工具完成的。
有各种各样的代码审查工具可用,并且在 Microsoft,团队可以自由选择他们的工具。在 2016 年,89% 的开发人员表示是使用 CodeFlow 代码审查工具。稍后,我将解释有关此代码检查工具的更多信息。从那时起,随着 Git 的崛起,工具的使用也发生了变化。让我们考虑一个典型的审查情况:
让我们想象一下 Microsoft 的一名开发人员,让我们暂且称她为 Rose。 Rose 刚刚完成了功能的一部分,现在希望获得同事的反馈。
好了,Rose 准备获得一些反馈。因此,她首先准备好代码以进行审查。此步骤包括她打开代码检查工具,预览代码的更改。代码审查工具执行一些对比任务,这些任务可以帮助 Rose 准确查看她所做的更改。
在仔细检查了这些更改之后,她准备了一些说明,告诉审阅者她做了什么以及为什么这么做。这个说明可帮助审阅者了解代码更改的目的及其动机。现在,可以将代码发送给审阅者了。
许多经验丰富的开发人员都知道谁应该参加代码审查。但是,对于团队中的新成员或新的工作领域,选择起来可能会比较棘手。如果 Rose 不知道自己应该添加谁,她可以查看团队的相关政策或询问同事。她还可以使用代码审查工具的推荐功能,该功能可帮助她来选择审阅者。
Rose 选择了她认为可以为这段代码贡献知识的审阅者。审阅者通常是其他开发人员,但也可以包括其他利益相关者,例如 dev-ops 工程师,UI 或管理人员。审阅者被选择可能是因为他们的专业知识,也可能是他们需要随时了解即将到来的变更。
一旦选好了审阅者,Rose 就会发送代码审查请求。代码审查工具会自动发送通知,以通知审阅者已创建了新的代码审查。通知将发送给所有审阅者。但是,通常团队的经理或产品经理也会添加到通知列表中,并为每次审阅自动通知他们。这些通知使他们能够了解到相关信息,不过他们不需要执行审核。
一旦 Rose 的同事有时间,他们将查看代码审查。每个审阅者都可以在代码中添加注释和评论。完成评审后,审阅者会将带注释的代码发送回 Rose。Rose 现在可以处理这些评论,并准备代码的新版本。
审阅者通常会查看一些信息:代码看起来是否有错误吗?有架构上的问题吗? 是否有一些小问题,例如缺少说明、拼写错误等?并非所有评论都同样有价值。但是,有几种最佳实践可提高代码审查注释的价值。
Rose 通过修正和解决建议来处理反馈。如果 Rose 发现存在一些误解或其他有争议的问题,她可能会去找同事亲自讨论。这有时比通过工具更容易,更个性化。
无论如何,一旦她处理完所有反馈,就将代码的新版本发送给审阅者。该新的改进版本称为修订版。
如果需要,她将收到进一步的反馈。这种迭代是否持续几次取决于更改的类型及其质量。对于简单和小的代码更改,通常只需要一个代码审阅修订。对于其他更复杂的更改或有问题的代码中的更改,可能需要几次迭代。
这是完全正常的,一部分原因是这个代码审阅反馈周期能激发作者与代码审阅者之间的讨论。
在此审查周期之后,审查者将代码标记为 OK,然后 Rose 可以将代码签入通用代码库。
有些团队制定了一些政策,允许开发人员在实际审查完成之前签入代码。这通常是针对一些微小的变化,以允许异步审查和加快开发速度。
我描述的所有步骤都是 Microsoft 典型代码审查生命周期的一部分,并由所有团队执行。根据团队的政策,团队对每个步骤的要求都会更加严格。
可以想象,微软有 60,000 名工程师和非常多的团队,并非都按统一标准来操作。Microsoft 的某些团队可能在代码检查生命周期中需要其他步骤或工具。我想简要介绍一下一些团队添加到代码审查过程中的一些额外步骤。
您最想要的功能可能是通过“自动检测”的错误代码来节省时间。我的意思是,如果您可以运行自动化测试并意识到代码无法按预期工作,那么这就是您应该做的:在审查之前运行测试。
这就是为什么有些团队要求在每次代码审查时都提交测试结果的原因。这样就不会有人会忘记运行单元测试了。而且它可以确保在给定的代码更改下测试实际上已经运行并通过。
其他团队甚至更进一步,以某种方式配置了代码审查工具:开发人员提交的每个代码审查都会触发构建。该版本包含该确切的更改,并且还启动了一系列自动化测试。这个构建和这些测试的结果将附加到代码审查中。通过这种方式进行配置,可以确保已使用公共代码库中的最新代码对代码更改进行了测试。
如果更改影响到用户界面,则要求开发人员提交屏幕截图也是一个好主意。这样,代码审阅者可以在不运行代码的情况下看到代码更改的影响。其次,在自己的计算机上运行代码时,代码审阅者可以发现差异。
静态分析工具就代码样式问题而言,可以为代码审阅者节省大量时间。 Microsoft 的某些团队将自动化的静态和动态分析工具用作专用的机器人审阅者。这些机器人在代码样式和其他静态问题上给出评论。因此,可以腾出时间让人工代码审阅者执行更多有趣的任务。
多年来,Microsoft 进行代码审查的事实上的标准之一是内部工具 CodeFlow。这是一个复杂的代码审查工具,可支持开发人员并指导他们完成代码审查的所有步骤。CodeFlow 在代码准备过程中提供帮助,自动通知审阅者,并具有丰富的评论和讨论功能。
您可以在下面的屏幕截图中看到,CodeFlow 是一个重 UI 工具,非常类似于 Word 或 PowerPoint。
如果需要,可以跳过此步骤,如果感兴趣,我将带您浏览 CodeFlow 的界面。查看屏幕截图,在左侧 (A),您会看到所有受影响的文档。
同样在左侧,您会看到 (B) 分配给该本次审查的审阅者列表及其状态(例如,已签署或待审核)。活动文档显示在编辑器 (C) 中。 在底部,您可以看到 (D) 所有文档的注释列表。
另一方面,在活动文档 (F) 中只有一个注释。此注释与代码的具体部分(即一行中的一个单词)相关。最后,在顶部,您将看到代码审查的总体状态,在截图中是完成状态。之前的数字表示不同的修订版本。在此审查中,有五个修订。
CodeFlow 最好的功能之一就是它的注释功能。
代码审阅者可以非常精确地选择她要评论的代码部分。例如,审阅者甚至可以仅突出显示一行中的一个或两个字符,而不是突出显示整行。然后,审阅者可以对该选择附加评论。
该评论会发送给代码作者或其他审阅者,并且可以围绕该评论发起对话。
这种评论功能感觉就像在诸如 Twitter 或 Facebook 之类的社交媒体平台上评论。因此,CodeFlow 中的评论体验非常自然,可以进行丰富的对话和讨论。另一个不错的好处是可以为每个注释线程分配状态。状态可以是“无法解决”,“已解决”或“未解决”。
一个有用的功能是可以选择两个不同的代码审查版本,并比较两者之间的差异。这意味着您可以准确地看到代码作者在一个代码审查修订版和另一个代码审查修订版之间进行了哪些更改。跟踪审核进度非常方便。
在 Microsoft,开发人员花费大量时间进行代码审查。为确保这些时间花得有价值,Microsoft 拥有自己的代码审查分析平台。
该平台存储所有代码检查数据,从正在检查的代码开始,到代码检查中涉及的开发人员,再到开发人员的所有注释。甚至可以追溯到每个修订的代码更改。
这些代码审查数据是 Microsoft 对代码审查进行一些实证研究的基础。许多产品团队还使用它来跟踪他们的生产率并了解他们自己的代码审查实践。另外,我在此博客文章系列中分享的许多关于 Microsoft 代码审查的见解都来自对该代码审查数据的研究和分析。
随着 Micorsoft 参与和收购 GitHub,一些变化是不可避免的。例如,Microsoft 已经广泛采用 Git 作为源代码版本管理工具。同时,在 Microsoft,以 pull requests 形式进行的代码审查正在增加。
作者:知识小集
链接:https://juejin.im/post/5db7c542518825644e28b4231227 查看全文