无服务器演示—通过Comic Vine API随机获得的漫画人物
IT专业人员星期二#32
Vuex保持什么“数据”状态
潜入并从头开始学习React! 了解Reactjs,Redux,React路由,动画,Next.js基础以及更多方法!
1.预处理
5RazõesPelas Quais看板者看板Pod Falhar
KDE Plasma 5.14.5评估
KDE Plasma 5.14.5评估

在我对Gnome的评论之后,我想我应该看看在Manjaro Linux上运行的KDE Plasma版本5.14.5。 当您将KDE与Gnome进行比较时,您会注意到KDE的布局更为传统,我不得不说我不是粉丝。 它具有特殊的功能,因此我不能对此进行指责,但是有些地方感觉有点不对劲。 例如,下面显示的设置面板不一致。 我认为让KDE烦恼的是浪费了多少空间。 如果查看上面的示例屏幕截图,您将明白我的意思。 您还会注意到,当显示的分辨率为3840 x 2160时,文本很小,并且显示比例缩放导致换行时出现一些奇怪的问题。 在Gnome上使用显示缩放比例时,我没有遇到任何问题,因此我必须为此将KDE标记几分。 就外观而言,它是非常基本的,具有出色的透明度,但是我不会选择它作为我的主要桌面环境。 如果我想要一个更传统的图形用户界面,则可以使用XFCE,如果我想要简单易用的东西,可以使用Gnome。 如果我想要轻巧的东西,那么我会选择i3,因为那是一个非常高效的窗口管理器。 如果您喜欢图形效果,则很可能会喜欢KDE Plasma,但我发现它们只是浪费系统功能。 它们不会增加KDE的可用性,也不会分散用户的注意力。 我喜欢KDE的一件事是文件管理器,如下面的屏幕快照所示。 文件管理器使我非常想起Windows资源管理器,考虑到Windows资源管理器已经存在了很长时间,这并不是一件坏事。 我不得不说,这是我很长时间以来第一次使用KDE,尽管它不是我最喜欢的桌面环境,但我可以理解为什么它如此流行。 对我来说,如果我正在寻找一个初学者的桌面环境,那么我会选择Gnome;如果我想要一个轻量级的桌面环境,那么我将会选择XFCE。 在编程方面,尽管没有什么比一个好的平铺窗口管理器更胜一筹了,因为您可以将多个窗口同时显示在屏幕上,并且可以使用键盘或鼠标轻松地在它们之间切换。 当与GVim或Emacs结合使用时,平铺窗口管理器在生产力方面非常出色。 在其中添加Web浏览器以获取文档或参考资料,您将拥有最终的开发环境。 我敢肯定会有很多人不同意我。 如果您是其中之一,请在评论中告诉我您的想法。

Shell案例研究:硬链接与符号链接
Shell案例研究:硬链接与符号链接

假设您有一个包含名为“ App”的应用程序的目录。 随着时间的流逝,您会发现错误,进行一些更改并修复许多错误,您会不断更新“ App”,到目前为止,已经创建了“ App 2.3”版本。 您已将所有版本的App保留在同一目录中,并累积了23种不同的App版本! 它们都包含相同的名称,但编号不同,每次您要在App上工作时,都必须一遍又一遍地输入版本号。 您所知道的下一步,您将无法确定正在使用哪个版本! 如果您只需键入名称“ App”,这是否会更容易? 这是符号链接和硬链接进入图片的地方。 让我解释… -硬链接 硬链接本质上是目录条目,将名称与系统上的文件相关联。 基本上,这意味着在创建带有名称的文件时,该名称(“这是硬链接”)将指向文件的数据。 假设您创建了一个名为“ Hello”的文件,单词“ Hello”是硬链接,它指向包含您提供的任何数据的地址存储器。 您可以建立另一个指向相同文件名“ Hello”的硬链接。 让我们将第二个硬链接称为“世界”。 如果您键入“ World”,也可以访问文件“ Hello”,它们都指向相同的数据。 要在shell中创建额外的硬链接,您只需使用ln [现有文件] [名称]。 -符号链接 符号链接与硬 链接具有相同的特征,它们都指向目标。 唯一的区别是符号链接也可以指向目录(“文件夹”)甚至路径目录,而硬链接只能指向文件。 硬链接必须指向现有文件,而符号链接则不能指向任何文件。 符号链接可以简单地看作是快捷方式,可以将您带到分配给它的任何目标的快捷方式。 由于删除它们不会对给定目标产生任何影响,因此对于需要快捷方式打开所需特定目标的情况,这是一种更安全实用的解决方案。 假设您希望团队使用“ App 2.0”而不是“ App 2.1”,则可以使用名为“ App”的符号链接并将其指向“ App 2.0”。 这样,您的团队只需输入“ App”,就可以使用“ App 2.0”。 要在shell中创建符号链接,您还可以使用命令行ln ,但是您将添加额外的选项-s 。 ln -s [任何目标] [名称] 。

我对基本5.0 Juno的“评论”
我对基本5.0 Juno的“评论”

你好! 最后的评论是现在,最终版本已经发布,现在您应该了解Juno发行版的所有新功能,如果没有,那么这里是Cassidy发表的更改: 基本OS 5 Juno在这里 精炼,生产力和改进的开发人员平台 medium.com 尼克的精彩视频评论: 对于屏幕截图,我将使用Silverblue(SB)上的基本桌面(称为Pantheon!)安装。 我经常在basic上写博客/ YouTube,因为它是我最喜欢的四个桌面之一。 其余的显然是Plasma,Deepin和GNOME! 相对于前两个,Elementary的好处是Elementary与我日常使用的GNOME有很多共享,因此可以很容易地将它们并行安装,此外,我还可以轻松阅读和测试Github上的提交和更改 括号 我收到这些评论,认为我的评论通常是负面的。 真正! 那只是因为我觉得强调“坏”而不是“好”是最重要的 这就像在Github上打开Tilix上的一个问题,说“拆分视图有效! 太棒了!” 这有什么意义? 它本来可以工作! 特别是对于小学学生,我上传了50幅视频,并对他们开发的新视频进行了演示,因此请给我一点时间:p 比较这两个系统简直是荒谬的。 他们之间有两年的差距。 那是4个GNOME版本! 还荒谬的是没有官方支持的升级,但是好消息是,这将从Juno改变。 在下一版本中,我们将能够升级\ o / 如果您要问我,我会说Juno是有史以来第一个很好的基本发行版。 这主要是因为它基于Ubuntu 18.04 ,它是Canonical在很久以前发布的一个相当不错的版本。 先前的12.04、14.04、16.04只是失败,甚至导致Ubuntu社区泄漏 我在Juno 5.0的各种基本评论中看到的一个误解是,人们说“基本做到了,基本做到了等等”,但事实是,大量的基本新功能(平铺,夜灯,表情符号,性能等等) )直接来自最新的Mutter或GTK上游的GNOME或其他一些库 为了表达和抱怨,我不喜欢卡西迪·詹姆斯·布莱德(Cassidy James Blaede)发行说明中的​​事实 他没有说清楚 在上游GNOME中完成的工作,该基本团队没有贡献。 实际上,如果您在该帖子中搜索“ GNOME”,则没有任何参考! 真的不酷🙁 订婚 公平地说,拥有100名人员和30名开发人员并不是无穷无尽的,因此,期望他们在下游和上游都可以工作是不现实的,除此之外,开源是这样工作的 但是,真正令我印象深刻的是,社区参与在将人们带入GTK发展方面取得了基本成功。 如果不是初学者,那些可能从来没有为Linux桌面开发过的人, 这比向上游做出贡献更重要! 这项工作不仅使基本工作受益,还整体上使Linux桌面受益,首先是因为所有这些应用程序都是开源的,所以我们可以看到工作原理,其次是因为其中的许多应用程序已经在Flathub上,因此我们可以在任何发行版和台式机 基本操作系统几乎是Ubuntu 18.04,具有不同的桌面,一些不同的设置和默认值以及基本存储库。 一个用于他们的核心事物,另一个用于他们的AppCenter应用程序 无论如何,这里没有太多需要回顾的内容。 […]

ArrayList,Vector,LinkedList的区别及其优缺点?
ArrayList,Vector,LinkedList的区别及其优缺点?

ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但是它们具有各自不同的特征,主要如下: 一,同步 ArrayList,LinkedList未同步,并且Vestor已同步。 因此,如果您不需要线程安全,则可以使用ArrayList或LinkedList,可以节省同步开销。 但是在多线程的情况下,有时您必须使用Vector。 当然,有一些方法可以包装ArrayList,LinkedList,以便它们也可以实现同步,但是效率可能会降低。 二,增长数据 从内部实现机制来讲,ArrayList和Vector都使用Objec数组存储。 当您将元素添加到这两种类型时,如果元素数量超过内部数组的当前长度,它们都需要扩展内部数组的长度。 默认情况下,Vector会自动增长原始ArrayList大小的两倍。 在50%的空间中,最终您得到的这个收藏总是占据比实际需要更多的空间。 因此,如果要在集合中保存大量数据,使用Vector会有一些好处,因为可以通过设置集合的初始大小来避免不必要的资源开销。 三,搜索,插入,删除对象的效率 ArrayList和Vector,从指定位置(索引)检索对象,或在集合末尾插入,删除对象的同时,可以表示为O(1)。 但是,如果您在集合中其他位置添加或删除元素,则花费的时间将线性增加:O(ni),其中n是集合中元素的数量,而i是添加或删除元素的索引位置。 为什么会这样呢? 假设在执行上述操作时,集合中第ith个元素和第ith个元素之后的所有元素都将对对象执行(ni)个位移操作。 在LinkedList中,在集合中的任何位置插入和删除元素都需要花费相同的时间-O(1),但是索引元素O(i)的速度较慢,其中i是索引的位置。 通常我们都知道ArrayList和LinkedList大致不同: 1.ArrayList是基于动态数组的数据结构,LinkedList是基于列表的数据结构。 对于获取和设置随机访问,ArrayList比LinkedList更好,因为LinkedList可以移动指针。 对于new和delete操作,添加和删除LinedList更为有利,因为ArrayList要移动数据。 ArrayList和LinkedList是两个用于存储一系列对象引用的集合类。 例如,我们可以使用ArrayList存储一系列String或Integer。 那么ArrayList和LinkedList在性能上有何区别? ArrayList何时应使用LinkedList? 一。 时间复杂度 第一点很关键,内部ArrayList实现是基于对象数组的基础的,因此,它使用get方法访问元素列表中的任何一个(随机访问),其速度都比LinkedList快。 LinkedList中的get方法从列表的末尾开始按顺序进行检查,直到另一端为止。 对于LinkedList,没有更快的方法来访问列表中的特定元素。 假设我们有一个非常大的列表,其中的元素已经排序,该列表可能是ArrayList类型,也可能是LinkedList类型,现在我们列出二进制搜索(binary search),比较列表是ArrayList和LinkedList查询速度,请参阅以下程序: Java代码 包com.mangocity.test; 导入java.util.LinkedList; 导入java.util.List; 导入java.util.Random; 导入java.util.ArrayList; 导入java.util.Arrays; 导入java.util.Collections; 公共类TestList…{ 公共静态最终整数N = 50000; 公共静态列表值; 静态的 … { 整数值[] =新的整数[N]; 对于r (int i = […]

Java中有析构函数吗?
Java中有析构函数吗?

在Java中,垃圾收集器会自动删除未使用的对象以释放内存。 开发人员无需将对象标记为删除,因为该对象容易出错,并且容易受到内存泄漏的影响。 因此,明智的Java没有可用的析构函数。 如果对象持有打开的套接字,打开的文件或数据库连接, 则垃圾收集器无法回收这些资源 。 我们可以在close方法中释放资源,然后在Java 7之前使用try-finally语法来调用该方法,例如I / O类FileInputStream和FileOutputStream 。 从Java 7开始,我们可以实现接口AutoCloseable并使用 try-with-resources语句 编写更简短的代码 。 但是API用户可能会忘记调用close方法,因此finalize方法和Cleaner类应运而生。 但是请注意,它们不等同于析构函数。 无法保证finalize方法和Cleaner类都将立即运行。 他们甚至没有机会在JVM退出之前运行。 尽管我们可以调用System.runFinalization来建议JVM运行所有待完成的对象的finalize方法,但这仍然是不确定的。 此外, finalize方法可能会导致性能问题,死锁等。我们可以通过阅读以下文章中的内容找到更多信息:Java的finalize方法指南。 从Java 9开始 ,由于其缺点, 添加了Cleaner类以替代finalize方法 。 结果,我们可以更好地控制执行清洁操作的线程。 但是Java规范指出System.exit期间清洁程序的行为是特定于实现的,而Java不保证是否将调用清洁操作。

识别,调试和防止因多尺度隐式约束而引起的软件问题
识别,调试和防止因多尺度隐式约束而引起的软件问题

识别: 如果您将某个软件看作是一组任意的系统,它们相互影响以在多个级别上创建更大的系统,那么您将看到如何查看任何给定级别上的行为必须包括其之上的所有级别。 因此,例如: 对一组连续方法的调用涉及许多不同的类,它们是在较大的程序系统中实例化的各个系统。 这些方法中的许多方法受到各种编程规则的约束,这些规则可以在方法级别,类级别,过程级别,模块级别,整个系统级别进行定义,或者可能具有来自整个系统本身环境的其他约束。正在运行。 各个方法可能同时受不同级别的规则以多种方式约束。 在给定的测试中,更改到程序的另一个区域后,当该测试作为整个系统的一部分运行时,单个方法会失败,但是仍然作为单元测试通过,并且仍然通过各种“簇”的子集集成测试。 直接的直觉是认为该方法中的错误已被其他地方的更改所暴露,但是对该方法的分析并未发现任何问题。 可能发生的情况是,其他地方的更改引入了隐式约束,以副作用的方式,如果该约束生效,则会阻止该方法起作用。 不同的“聚集”测试可能会也可能不会执行该约束,因为它们可能涉及约束起源于或未约束的系统级别。 不同系统组件的集成程度越高,这种类型的交互作用就越常见,预测隐式约束的难度就越大。 这是开发人员遇到的最令人沮丧的错误模式之一。 它们导致如此多的挫败感的原因之一,是我们通常用于解决问题的方法与这些情况下所需要的方法直接相反。 解决方法: 通常,当在“整个系统”级别看到问题时,“根本原因”分析的方法包括将系统分解为更易于管理的部分,以便定位问题。 这个问题与将动物分开以寻找引起不适的原因没有什么不同-您可能会发现,但在仍然活着的动物中却不是。 “根本原因”这个名称本身定义了初始错误-原因根本不在“根本”级别上,而是在整个系统或环境级别上,对于后者,进一步的问题涉及在外部重现它。特定客户的环境。 假设您确实设法在整个系统级别重现该问题,那么,只要您有经验的人都有很多开发经验,就可以在您尝试分解问题区域时立即告诉您这些问题,而这些问题只是“消失”了。 我们倾向于在更实际的代码级别上寻找任何问题,这完全暴露了我们发现显示这种模式的问题的原因。 因此,必须在整个系统级别分析该问题。 这样做并不会减少对它的本地化,而只是意味着本地化必须在作为系统的整个系统的上下文中进行。 在许多情况下,这种模式的问题并非“无处不在”,而是仅在特定的安装站点上发生。 这为我们提供了在实验室环境中重现问题的首要任务。 进行此操作的明智方法如下: 在逻辑分组中,一次添加一组,发现问题现场发现的通常在实验室中不存在的不同环境方面。 添加每组后,测试以查看问题是否已实现。 在实验室环境中问题从潜在问题变为实际问题的时候,您已将问题的可能根源隔离到了这一系列方面。 但是,与其通过每次删除一个集合并添加一个方面来完善测试,更好的想法是一次删除一个方面直到问题消失。 这样做的原因是为了绕过我们分析的另一种固有趋势,这种趋势会干扰这种问题的解决,即寻求“一个”原因的趋势。 “原因”本身很可能(根据我的经验,因为可能已经考虑并测试了更多明显的方面),而“原因”本身就是环境中复杂的明显方面(即值得注意的方面)所隐含的东西,一起创建一个“不可见”的方面,这是问题约束的根源。 一旦发现了环境约束,就可以立即在代码级上更好地了解要查找的内容,因为它必须能够以明确的方式与该约束进行交互。 预防: 就问题模式而言,要回答的更重要的问题之一是“我们如何首先避免引起此问题?” 尽管有许多互补的方法可以帮助避免此类问题,但由于潜在问题的复杂性和实施的局限性,目前无法完全消除其出现的可能性。我们的陈述。 现在,我将探讨一种可以在短期内采用的潜在方法论,至少可以减少出现这些问题的可能性,以及已经被广泛采用的两种方法学,这些方法学都无济于事。方式,甚至可能加剧问题。 通常将“整体”系统指出为此类问题的根本原因。 同时,我们使用的许多最可靠的软件系统都是传统的单片设计(MVS,Unix),而大量的模块化系统却显示出严重的脆弱性,并伴随着许多遵循这种模式的问题。 这表明单片设计并不会固有地导致多尺度约束问题,分离的模块化设计也不一定能解决该问题。 子系统的分离在某些情况下可以简化交互,从而通常减少出现,但是在许多情况下,需要交互才能实现程序的初衷,因此可以通过重新引入紧急情况。 例如,将交互系统与共享的即时环境分开(例如,在单独的虚拟机中运行两个子系统)可以解决一些问题,但可以引入新的问题。 这并不会将其视为潜在的解决方案,解决方案不可避免地会产生不同的问题,并不意味着这些问题是等效的。 不过,请记住它可能带来的问题,可以最大程度地减少这些问题。 由于引入了新的系统规模,在这种情况下,虚拟机以系统方式共同完成给定任务的功能,因此,实现所需交互性的任何解决方法都可以重新引入导致出现新行为的依赖性,同时使它们不太明确。 添加新的比例尺本身可以引入新的隐式约束。 在实现所需交互性所需的任何变通办法中,额外的复杂性可能会在子系统规模和“ VM一起”规模之间引入其他规模。 通常针对这些问题提出的一种伪解决方案是将分离的子系统之间的交互性限制为一组最低限度的功能。 面向资源的体系结构是这种伪解决方案的一个很好的例子。 如果所有需要的程序交互性都是子系统之间的基本CRUD,并且使用可以轻松表示为通用资源的数据,那么问题就不会出现,因为系统的复杂性最初太低而无法产生紧急行为。 。 更现实地,为了实现功能目标,需要复杂的交互形式。 在一般的ROA类型的系统中实施这些解决方案时,既需要扩展解决方案,既可以扩展资源可以合理表示的概念,又可以重新引入ROA试图消除的复杂性。 更糟糕的是,这种复杂性不再显而易见,它大部分隐藏在“通用”表示之下,因此当试图理解系统时,本来相当透明的东西现在可能变得完全不透明。 这都增加了隐性约束可以出现和起作用的范围,并使它们更难以识别。 共享表示的过分简化引起的另一个问题是在其他方面增加了不必要的复杂性。 […]

使函数式编程神秘化(在一家真实公司中)
使函数式编程神秘化(在一家真实公司中)

多年以来,我们所有人都对在现实生活中的项目中使用函数式编程持怀疑态度。 在我们看来,大多数这种怀疑源自于这样的观念,即函数式编程无法访问,过于学术化或者不是非常有用。 我们听到的一些例子: “这太难了-我学习这门课时几乎没学过”; “这是一个很酷的理论,但是没有实际应用,也不适合商业项目”; “我应该如何避免现实世界中的副作用? 我们所做的一切在某种程度上都需要副作用”; “我们无法在公司雇用具有这些技能的人员”; “什么? 我应该在日常工作中使用单子吗?” 每个语句都包含一个事实,但是Nubank在大规模生产中使用函数式编程,并且我们认为这种范例比通常理解的更容易学习并且更有用。 这些担忧中有许多是因为函数式编程定义的确很广泛。 这里的关键是使用使您的生活更轻松的部件 。 在本文中,我们尝试提出一些要点,这些要点使我们在Nubank构建高度可用和可扩展的分布式系统时更加轻松。 这是现代函数式编程语言的一个杀手((常常被误解)功能。 但是,当我们拥有的是不变的“事物”时,我们应该如何更新属性? 我们是否每次都要制作一个新副本? 那不是太贵了吗? 要记住的第一件事是:对于不变的数据结构, 复制很便宜 。 您实际上并不需要重复数据,因为您不必这样做。 您所要做的就是指向相同的对象和样式。 让我们看一下在Python和Clojure中更新地图的代码段之间的比较: 上面的代码段将打印{'foo': 'baz', 'something': {'sub': 123}} 。 请注意,初始值会丢失。 现在使用Clojure: Clojure代码段显示{:foo bar, :something {:sub 123}}然后显示{:foo baz, :something {:sub 123}} 。 我们既有新的价值观又有旧的价值观。 assoc,在“ associate”中发音,是一个函数,它将添加或更新“ collection”(在这种情况下为map / dictionary或vector / array)中指定键的值。 如果键已经存在于地图上,它将被替换,如果不存在,则将被添加。 但是,这里发生了神奇的事情:您实际上并没有更改our-immutable-map ; 您正在创建一个与our-immutable-map […]