• 关于 自编译语言出现问题怎么解决 的搜索结果

回答

...自问自答,自己解决问题了。 原来是pycharmdebug存在问题,如果使用golang自带的命令build/run并没有这个问题...回复 @Xsank:回来继续说一下,换goland全解决了,哈哈回复 @fotomxq:我也上issue上看过了,貌似加上sqlite3的包debug会受影响,去掉后OK了回复 @Xsank:还有一个方案是先用mysql之类的数据库开发,最后发布产品换sqlite3。golang的mysql不需要用gcc编译。回复 @Xsank:我看了一顿国外解答,最后理解是:如果引用gcc的话,pycharmgolang插件的debug模式会阻断gcc某些版本信息,导致编译失败。所以只能直接用golang命令编译运行了。这就算解决了啊?那就debug不启动了?做后台开发的,使用编译性的语言的话,最好用命令方式build。另外最好[不是必须的]用类unix系统。这也是mac被程序员热衷的原因。谢谢~已经解决了~ 哈哈,我弄好了,但不知道是怎么搞定的。先是出现这个packagegithub.com/mattn/go-sqlite3:exec:"git":executablefilenotfoundin%PATH%。网上说要装msysgit,装了之后运行gogetgithub.com/mattn/go-sqlite3会变这样packagegolang.org/x/net/context:unrecognizedimportpath"golang.org/x/net/context"(httpsfetch:Gethttps://golang.org/x/net/context?go-get=1:dialtcp216.239.37.1:443:connectex:Aconnectionattemptfailedbecausetheconnectedpartydidnotproperlyrespondafteraperiodoftime,orestablishedconnectionfailedbecauseconnectedhosthasfailedtorespond.)。这下网上没解决方案了。于是又重新配置了一遍环境变量。再次运行gitbash就好了。我也不知道为什么但是好了

爱吃鱼的程序员 2020-06-08 20:54:26 0 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。

有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

回答

Kotlin的简介 Kotlin是由JetBrains公司(IDEA开发者)所开发的编程语言,其名称来自于开发团队附近的科特林岛。 多平台开发 JVM :Android; Server-Side Javascript:前端 Native(beta) :开发原生应用 windows、macos、linux Swift与Kotlin非常像 http://nilhcem.com/swift-is-like-kotlin/ kotlin发展历程 image.png java发展历程 image.png JVM语言的原理 image.png JVM规范与java规范是相互独立的 只要生成的编译文件匹配JVM字节码规范,任何语言都可以由JVM编译运行. Kotlin也是一种JVM语言,完全兼容java,可以与java相互调用;Kotlin语言的设计受到Java、C#、JavaScript、Scala、Groovy等语言的启发 kotlin的特性 下面不会罗列kotlin中具体的语法,会介绍我认为比较重要的特性,以及特性背后的东西。 类型推断 空类型设计 函数式编程 类型推断 image.png 类型推断是指编程语言中在编译期自动推导出值的数据类型。推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。 在开发环境中,我们往往写出表达式,然后可以用快捷键来生成变量声明,往往都是很准的,这说明了编译器其实是可以很准确的推断出来类型的。编程语言所具备的类型推断能力可以把类型声明的任务由开发者转到了编译器. java中声明变量的方式是类型写在最前面,后面跟着变量名,这就迫使开发者在声明变量时就要先思考变量的类型要定义成什么,而在一些情况下比如使用集合、泛型类型的变量,定义类型就会变得比较繁琐。 Kotlin中声明变量,类型可以省略,或者放到变量名后面,这可以降低类型的权重,从必选变为可选,降低开发者思维负担。java10中也引入了类型推断。 Javascript中声明变量也是用关键字var,但是还是有本质区别的,Kotlin中的类型推断并不是变成动态类型、弱类型,类型仍然是在编译期就已经决定了的,Kotlin仍然是静态类型、强类型的编程语言。javascript由于是弱类型语言,同一个变量可以不经过强制类型转换就被赋不同数据类型的值, 编程语言的一个趋势就是抽象程度越来越高,编译器做更多的事情。 空类型设计 空类型的由来 image.png 托尼·霍尔(Tony Hoare),图灵奖得主 托尼·霍尔是ALGOL语言的设计者,该语言在编程语言发展历史上非常重要,对其他编程语言产生重大影响,大多数近代编程语言(包括C语言)皆使用类似ALGOL的语法。他在一次大会上讨论了null应用的设计: “我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我加入了null引用设计,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。” null引用存在的问题 以java为例,看null引用的设计到底存在哪些问题 空指针问题NPE 编译时不能对空指针做出检查,运行时访问null对象就会出现错误,这个就是工程中常见的空指针异常。 null本身没有语义,会存在歧义 值未被初始化 值不存在 也许表示一种状态 逻辑上有漏洞 Java中,null可以赋值给任何引用,比如赋值给String类型变量,String a = null,但是null并不是String类型: a instanceof String 返回的是false,这个其实是有些矛盾的。所以当持有一个String类型的变量,就存在两种情况,null或者真正的String. 解决NPE的方式 防御式代码 在访问对象前判空,但会有冗余代码;会规避问题,而隐藏真正的问题 抛出异常给调用方处理 方法中传参传入的空值、无效值,抛出受检查异常给上层调用方 增加注解 Android中可以增加@NonNull注解,编译时做额外检查 空状态对象设计模式 空状态对象是一个实现接口但是不做任何业务逻辑的对象,可以取代判空检查;这样的空状态对象也可以在数据不可用的时候提供默认的行为 java8 Optional类 java8中引入了Optional类,来解决广泛存在的null引用问题.官方javadoc文档介绍 A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (return a default value if value not present) and ifPresent() (execute a block of code if the value is present). 来看一下是如何实现的。 举一个访问对象读取熟悉的例子 java 8 之前 : image.png java 8: image.png 总结: 1.用Optional还是会比较繁琐,这个也说明了设计一个替代null的方案还是比较难的。 optional的耗时大约是普通判空的数十倍,主要是涉及泛型、使用时多创键了一个对象的创建;数据比较大时,会造成性能损失。 java8 引入Optional的意义在于提示调用者,用特殊类型包装的变量可能为空,在使用取出时需要判断 Kotlin的空类型设计 Kotlin中引入了可空类型和不可空类型的区分,可以区分一个引用可以容纳null,还是不能容纳null。 String vs String? String 类型表示变量不能为空,String?则表示变量可以为空 String?含义是String or null.这两种是不同的类型. 比如: var a:String = “abc” //ok var a:String = null //不允许 var b :String? = null //ok a=b // 不允许 String?类型的值不能给String类型的值赋值 这样就将类型分成了可空类型和不可能类型,每一个类型都有这样的处理;Kotlin中访问非空类型变量永远不会出现空指针异常。 同样上面的例子,采用Kotlin去写,就会简洁很多 image.png 编程范式-函数式编程 编程范式是什么? 编程范式是程序员看待程序和写程序的观点 主要的类型 非结构化编程 结构化编程 面向对象编程 命令式编程 函数式编程 这些类型并不是彼此互斥的,而是按照不同的维度做的划分,一种编程语言可能都支持多个编程范式 非结构化编程 第一代的高级语言往往是非结构化编程 比如 BASIC语言 每一行的代码前面都有一个数字作为行号,通常使用GOTO的跳跃指令来实现判断和循环. 看一下下面这段代码是做什么的: image.png 实际上做的是:程序在屏幕上显示数字 1 到 10 及其对应的平方 采用这种方式写程序,大量的使用goto实现逻辑的跳转,代码一长,可读性和维护性就比较差了,形成“面条式代码” 结构化编程 采用顺序、分支、循环结构来表达,禁用或者少用GOTO; 并用子程序来组织代码,采用自顶向下的方式来写程序 代表语言是C语言 实现同样的逻辑: image.png 可见采用结构化编程,代码的逻辑会更清晰。 面向对象编程 思想: 将计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。 特性: 封装性、继承性、多态性。 命令式编程 把计算机程序视为一系列的命令集合 主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 “先做这,再做那”,强调“怎么做” 实现: 用变量来储存数据,用语句来执行指令,改变变量状态。 基本所有的常见的编程语言都具有此范式 函数式编程 声明式语法,描述要什么,而不是怎么做 类似于SQL语句 语言: kotlin swift python javascript scala 函数是第一等公民 可以赋值给变量,可作为参数传入另一个函数,也可作为函数的返回值 纯函数 y=f(x) 只要输入相同,返回值不变 没有副作用:不修改函数的外部状态 举个栗子 公司部门要进行outing,去哪里是个问题,要考虑多个因素,比如花费、距离、天数等等,有多个备选地点进行选择。 定义一个数据类: image.png 要进行筛选了,分别用sql,kotlin,java来实现 找出花费低于2000元的outing地点信息 SQL image.png Kotlin image.png java 7 image.png 可见kotin的写法还是比较接近于sql的思想的,声明式的写法,而不管具体如何实现;其中的:place->place.money<2000 就是函数,可以作为参数传递给fliter这个高阶函数;而且这个函数没有副作用,不改变外部状态。 再来一个复杂一点的: 找出花费低于5000元,时间不多于4天,按照距离排序的outing地点名称 SQL image.png Kotlin: image.png java 7 image.png 由此可见用kotlin的函数式写法,会更简洁,逻辑也更清晰,这段代码的目标一目了然,这种清晰在于实现了业务逻辑与控制逻辑的分离,业务逻辑就是由函数实现的,比如place->place.money<500,而控制逻辑是由filter,sorterBy等高阶函数实现的。 而java的传统写法是基于对数据的操作,避免不了遍历的操作,业务逻辑与控制逻辑交织在了一起,这段代码的目的就不是那么容易清晰看到的了。 总结 kotlin是实用的现代编程语言,吸收了众多编程语言的优点,支持类型推断、空类型安全、函数式编程、DSL等特性,非常值得学习和使用。

问问小秘 2020-04-30 16:33:40 0 浏览量 回答数 0

新用户福利专场,云服务器ECS低至102元/年

新用户专场,1核2G 102元/年起,2核4G 699.8元/年起

回答

python程序员的特征 Python语法优雅,功能强大,开发效率高。和其他语言相比,python最大的好处是接近自然语言,基本上不用考虑语法细节。所以,知乎上有网友是这么比喻学Python的:当土著拿到猎枪之后,他们射箭的技能退化严重,但因为食物更多了,厨艺有了长足的进展。当你不再为一些细枝末节的事担心之后,你就可以把注意力集中在另外一些问题上了。 python程序员明显特征就是:“懒” 他们一般都信奉极简主义,讨厌复杂的东西。以往追求高速运行,如今追求一字千金。(就是不喜欢打字)他们喜欢使用苹果产品。遇事想得多做的少,看起来比较冷静,碰到困难,先google,再行动。 被提bug的反应:你怎么还在用360安全浏览器 Java程序员的特征 和极简主义的Python恰恰相反,Java麾下的程序猿们喜欢码字,百行代码信手拈来,性子会走向两个极端,要么脾气变得暴躁,分分钟被各种报错逼疯;要么被磨得比较耐心,时间再长一点以后,思考问题会比较全面,而且会变得比较呆萌可爱,说话也因为考虑的多,变得啰嗦了。还有就是他们对内存价格那是了如指掌啊。 被提bug的反应:肯定是数据问题!你清下缓存试试、重启下电脑试试 C++程序员的特征 写C++的程序猿都比较沉稳持重,C++的难度极大,普通人不易掌握容易翻车,【珍爱生命,远离C++】但在大神手里简直是如虎添翼,可以被嵌入任何现代处理器中,几乎所有操作系统都支持 C++,跨平台性非常好,要什么有什么。也正因为它的难度系数高,能让c++猿们能够在开发人员里脱颖而出。 他们很少说自己精通XXX,喜欢接受挑战,每件事情都想研究个透彻,有的时候还会有些钻牛角尖,有很强的时间观念,闹钟一设设十几个。还有他们是Bug狂躁症深度患者。 **被提bug的反应: “这真的很奇怪!” “以前从来没有出现过这种情况!” “昨天还运行好好的啊!” “这怎么可能?” “一定是硬件出问题了!” ** C语言程序员的特征 如果把使用各大编程语言比作做菜,C++可能是豪华大宴,炖烤煎炸样样都来,C语言嘛就是干脆利落,一把菜刀走天下,有什么菜不是直接切一切,煮一煮不能解决的呢?C语言的特点很大程度上是简单,容易编译,灵活且贴近底层。 C语言程序员有许多共有的特征,他们做事干脆利落,说话简洁有层次,有点霸道总裁的样子,喜欢用“我觉得吧~”开始话题。 被提bug的反应: 你装的什么版本的类库(jdk) 这谁写的代码 Ruby语言程序员特征 Ruby 是一种简单快捷的面向对象(面向对象程序设计)脚本语言。从程序员的角度看,用 Ruby 写程序是一种非常愉悦的体验。这种愉悦体现在方方面面,包括 Ruby 代码简洁直观、更贴近自然语言、富于表达性、社区友好。 如果把编程语言们看作人的话,那么Ruby就是其中的一个小萝莉。在萌妹砸Ruby的影响下,程序猿们很有可能会变成热情,友善的程序媛… 被提bug的反应: 你为什么要那样操作?” 用户不会像你这么操作的。 PHP程序员特征 这个圈子里,永远有一个”PHP是世界上最好的语言“的冷笑话,能让相亲对象直接拉黑,这语言能不好么(逃),类似的段子已经成了php们的生活调味品。 所以: 玩笑过后言归正传,PHP当然是有它的优势和优点的,社区庞大,积极向上不说,既能面向过程又能面向对象,方便至极,最重要的是极其适合新手小白学习编程,无数程序员入门学习和开发使用。 他们的显著特征是:自信满满,心理承受能力好(不好不行啊)开朗…学了之后明显笑容变多了能淡定从容地自黑。 被提bug的反应: “这应该只是巧合吧!” “我没时间测试所有功能!” “这不可能是我代码的问题! 结论 以上观点无科学实验证明,仅为生活观察所得。一个人的性格很容易被周围环境所影响,而编程环境就是一个影响人性格的环境。所以某种语言用久了,都会和编程语言的特点挂钩。 有人总结,越是学习趋于人类思维方式的编程语言的程序员,性格能开朗点,因为他们是以近似人的思维思考问题,相反像c++这种语言,用久了就会生怕忘记点什么。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区

茶什i 2020-01-06 17:57:28 0 浏览量 回答数 0

问题

Vue面试题汇总【精品问答】

问问小秘 2020-05-25 18:02:28 63 浏览量 回答数 1

问题

2018MySQL技术问答集锦,希望能给喜欢MySQL的同学一些帮助

技术小能手 2019-12-01 19:31:11 1856 浏览量 回答数 0

问题

程序员报错行为大赏-配置报错

问问小秘 2020-06-11 13:18:25 6 浏览量 回答数 1

问题

【精品问答】大数据技术问题之Flink百问

问问小秘 2019-12-01 21:59:43 7280 浏览量 回答数 1

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法

kun坤 2020-06-02 14:30:33 0 浏览量 回答数 0

回答

首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法

kun坤 2020-06-14 12:17:32 0 浏览量 回答数 0

回答

" 首先给你个忠告永远不要省略if for while等语句的大括号 然后 一行只写一句话 最后 具体的错误等稍后我看过代码再给出 ###### 递归爆炸了,改成循环吧 ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以###### 简单看了一下你的代码 你的代码确实会栈溢出 这源于你并没有指定结束递归的条件 ###### 试试看这个 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void quick_sort(int a[], int start, int end) { int i = start, j = end; int key = a[i]; while(i < j) { for(; i < j; j--) { if(a[j] < key) { a[i++] = a[j]; break; } } for(; i < j; i++) { if(a[i] > key) { a[j--] = a[i]; break; } } } a[i] = key; if(start < i - 1){ quick_sort(a, start, i - 1); } if(end > i + 1){ quick_sort(a, i + 1, end); } } int main() { srand((unsigned)time(NULL)); //随机数种子准备 int array[N] = {0}; //要被排序的数据准备 for(int i = 0; i < N; i++){ //随机生成一些数据 array[i] = rand() % N; } clock_t start = clock(); //记录开始时间 quick_sort(array, 0, 999); //调用排序算法对数据进行排序 clock_t end = clock(); //记录结束时间 for(int i = 0; i < N; i++){ //打印输出排序后的数据 printf("%5d", array[i]); } printf("\n"); double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间 printf("快速排序运行时间:%lf秒\n", t); //输出时间 return 0; } ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法"

montos 2020-06-03 17:13:17 0 浏览量 回答数 0

问题

【精品问答】前端开发必懂之JS技术二百问

茶什i 2019-12-01 22:05:04 146 浏览量 回答数 0

问题

支付宝的性能测试

云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

回答

从业余程序员到职业程序员 程序员刚入行时,我觉得最重要的是把自己培养成职业的程序员。 我的程序员起步比同龄人都晚了很多,更不用说现在的年轻人了。我大学读的是生物专业,在上大学前基本算是完全没接触过计算机。军训的时候因为很无聊,我和室友每天跑去学校的机房玩,我现在还印象很深刻,我第一次走进机房的时候,别人问,你是要玩windows,还是dos,我那是完全的一抹黑。后来就只记得在机房一堆人都是在练习盲打,军训完,盲打倒是练的差不多了,对计算机就这么产生了浓厚的兴趣,大一的时候都是玩组装机,捣鼓了一些,对计算机的硬件有了那么一些了解。 到大二后,买了一些书开始学习当时最火的网页三剑客,学会了手写HTML、PS的基本玩法之类的,课余、暑假也能开始给人做做网站什么的(那个时候做网站真的好赚钱),可能那样过了个一年左右,做静态的网页就不好赚钱了,也不好找实习工作,于是就开始学asp,写些简单的CRUD,做做留言板、论坛这些动态程序,应该算是在这个阶段接触编程了。 毕业后加入了深圳的一家做政府行业软件的公司,一个非常靠谱和给我空间的Leader,使得自己在那几年有了不错的成长,终于成了一个职业的程序员。 通常来说,业余或半职业的程序员,多数是1个人,或者很小的一个团队一起开发,使得在开发流程、协作工具(例如jira、cvs/svn/git等)、测试上通常会有很大的欠缺,而职业的程序员在这方面则会专业很多。另外,通常职业的程序员做的系统都要运行较长的时间,所以在可维护性上会特别注意,这点我是在加入阿里后理解更深的。一个运行10年的系统,和一个写来玩玩的系统显然是有非常大差别的。 这块自己感觉也很难讲清楚,只能说模模糊糊有个这样的概念。通常在有兴趣的基础上,从业余程序员跨越到成为职业程序员我觉得不会太难。 编程能力的成长 作为程序员,最重要的能力始终是编程能力,就我自己的感受而言,我觉得编程能力的成长主要有这么几个部分: 1、编程能力初级:会用 编程,首先都是从学习编程语言的基本知识学起的,不论是什么编程语言,有很多共同的基本知识,例如怎么写第一个Hello World、if/while/for、变量等,因此我比较建议在刚刚开始学一门编程语言的时候,看看编程语言自己的一些文档就好,不要上来就去看一些高阶的书。我当年学Java的时候上来就看Think in Java、Effective Java之类的,真心好难懂。 除了看文档以外,编程是个超级实践的活,所以一定要多写代码,只有这样才能真正熟练起来。这也是为什么我还是觉得在面试的时候让面试者手写代码是很重要的,这个过程是非常容易判断写代码的熟悉程度的。很多人会说由于写代码都是高度依赖IDE的,导致手写很难,但我绝对相信写代码写了很多的人,手写一段不太复杂的、可运行的代码是不难的。即使像我这种三年多没写过代码的人,让我现在手写一段不太复杂的可运行的Java程序,还是没问题的,前面N年的写代码生涯使得很多东西已经深入骨髓了。 我觉得编程能力初级这个阶段对于大部分程序员来说都不会是问题,勤学苦练,是这个阶段的核心。 2、编程能力中级:会查和避免问题 除了初级要掌握的会熟练的使用编程语言去解决问题外,中级我觉得首先是提升查问题的能力。 在写代码的过程中,出问题是非常正常的,怎么去有效且高效的排查问题,是程序员群体中通常能感受到的大家在编程能力上最大的差距。 解决问题能力强的基本很容易在程序员群体里得到很高的认可。在查问题的能力上,首先要掌握的是一些基本的调试技巧,好用的调试工具,在Java里有JDK自带的jstat、jmap、jinfo,不在JDK里的有mat、gperf、btrace等。工欲善其事必先利其器,在查问题上是非常典型的,有些时候大家在查问题时的能力差距,有可能仅仅是因为别人比你多知道一个工具而已。 除了调试技巧和工具外,查问题的更高境界就是懂原理。一个懂原理的程序员在查问题的水平上和其他程序员是有明显差距的。我想很多的同学应该能感受到,有些时候查出问题的原因仅仅是因为有效的工具,知其然不知其所以然。 我给很多阿里的同学培训过Java排查问题的方法,在这个培训里,我经常也会讲到查问题的能力的培养最主要的也是熟练,多尝试给自己写一些会出问题的程序,多积极的看别人是怎么查问题的,多积极的去参与排查问题,很多最后查问题能力强的人多数仅仅是因为“无他,但手熟尔”。 我自己排查问题能力的提升主要是在2009年和2010年。那两年作为淘宝消防队(处理各种问题和故障的虚拟团队)的成员,处理了很多的故障和问题。当时消防队还有阿里最公认的技术大神——多隆,我向他学习到了很多排查问题的技巧。和他比,我排查问题的能力就是初级的那种。 印象最深刻的是一次我们一起查一个应用cpu us高的问题,我们两定位到是一段代码在某种输入参数的时候会造成cpu us高的原因后,我能想到的继续查的方法是去生产环境抓输入参数,然后再用参数来本地debug看是什么原因。但多隆在看了一会那段代码后,给了我一个输入参数,我拿这个参数一运行,果然cpu us很高!这种case不是一次两次。所以我经常和别人说,我是需要有问题场景才能排查出问题的,但多隆是完全有可能直接看代码就能看出问题的,这是本质的差距。 除了查问题外,更厉害的程序员是在写代码的过程就会很好的去避免问题。大家最容易理解的就是在写代码时处理各种异常情况,这里通常也是造成程序员们之间很大的差距的地方。 写一段正向逻辑的代码,大部分情况下即使有差距,也不会太大,但在怎么很好的处理这个过程中有可能出现的异常上,这个时候的功力差距会非常明显。很多时候一段代码里处理异常逻辑的部分都会超过正常逻辑的代码量。 我经常说,一个优秀程序员和普通程序员的差距,很多时候压根就不需要看什么满天飞的架构图,而只用show一小段的代码就可以。 举一个小case大家感受下。当年有一个严重故障,最后查出的原因是输入的参数里有一个是数组,把这个数组里的值作为参数去查数据库,结果前面输入了一个很大的数组,导致从数据库查了大量的数据,内存溢出了,很多程序员现在看都会明白对入参、出参的保护check,但类似这样的case我真的碰到了很多。 在中级这个阶段,我会推荐大家尽可能的多刻意的去培养下自己这两个方面的能力,成为一个能写出高质量代码、有效排查问题的优秀程序员。 3、编程能力高级:懂高级API和原理 就我自己的经历而言,我是在写了多年的Java代码后,才开始真正更细致的学习和掌握Java的一些更高级的API,我相信多数Java程序员也是如此。 我算是从2003年开始用Java写商业系统的代码,但直到在2007年加入淘宝后,才开始非常认真地学习Java的IO通信、并发这些部分的API。尽管以前也学过也写过一些这样的代码,但完全就是皮毛。当然,这些通常来说有很大部分的原因会是工作的相关性,多数的写业务系统的程序员可能基本就不需要用到这些,所以导致会很难懂这些相对高级一些的API,但这些API对真正的理解一门编程语言,我觉得至关重要。 在之前的程序员成长路线的文章里我也讲到了这个部分,在没有场景的情况下,只能靠自己去创造场景来学习好。我觉得只要有足够的兴趣,这个问题还是不大的,毕竟现在有各种开源,这些是可以非常好的帮助自己创造机会学习的,例如学Java NIO,可以自己基于NIO包一个框架,然后对比Netty,看看哪些写的是不如Netty的,这样会非常有助于真正的理解。 在学习高级API的过程中,以及排查问题的过程中,我自己越来越明白懂编程语言的运行原理是非常重要的,因此我到了后面的阶段开始学习Java的编译机制、内存管理、线程机制等。对于我这种非科班出身的而言,学这些会因为缺乏基础更难很多,但这些更原理性的东西学会了后,对自己的编程能力会有质的提升,包括以后学习其他编程语言的能力,学这些原理最好的方法我觉得是先看看一些讲相关知识的书,然后去翻看源码,这样才能真正的更好的掌握,最后是在以后写代码的过程中、查问题的过程中多结合掌握的原理,才能做到即使在N年后也不会忘。 在编程能力的成长上,我觉得没什么捷径。我非常赞同1万小时理论,在中级、高级阶段,如果有人指点或和优秀的程序员们共事,会好非常多。不过我觉得这个和读书也有点像,到了一定阶段后(例如高中),天分会成为最重要的分水岭,不过就和大部分行业一样,大部分的情况下都还没到拼天分的时候,只需要拼勤奋就好。 系统设计能力的成长 除了少数程序员会进入专深的领域,例如Linux Kernel、JVM,其他多数的程序员除了编程能力的成长外,也会越来越需要在系统设计能力上成长。 通常一个编程能力不错的程序员,在一定阶段后就会开始承担一个模块的工作,进而承担一个子系统、系统、跨多领域的更大系统等。 我自己在工作的第三年开始承担一个流程引擎的设计和实现工作,一个不算小的系统,并且也是当时那个项目里的核心部分。那个阶段我学会了一些系统设计的基本知识,例如需要想清楚整个系统的目标、模块的划分和职责、关键的对象设计等,而不是上来就开始写代码。但那个时候由于我是一个人写整个系统,所以其实对设计的感觉并还没有那么强力的感觉。 在那之后的几年也负责过一些系统,但总体感觉好像在系统设计上的成长没那么多,直到在阿里的经历,在系统设计上才有了越来越多的体会。(点击文末阅读原文,查看:我在系统设计上犯过的14个错,可以看到我走的一堆的弯路)。 在阿里有一次做分享,讲到我在系统设计能力方面的成长,主要是因为三段经历,负责专业领域系统的设计 -> 负责跨专业领域的专业系统的设计 -> 负责阿里电商系统架构级改造的设计。 第一段经历,是我负责HSF。HSF是一个从0开始打造的系统,它主要是作为支撑服务化的框架,是个非常专业领域的系统,放在整个淘宝电商的大系统来看,其实它就是一个很小的子系统,这段经历里让我最深刻的有三点: 1).要设计好这种非常专业领域的系统,专业的知识深度是非常重要的。我在最早设计HSF的几个框的时候,是没有设计好服务消费者/提供者要怎么和现有框架结合的,在设计负载均衡这个部分也反复了几次,这个主要是因为自己当时对这个领域掌握不深的原因造成的; 2). 太技术化。在HSF的阶段,出于情怀,在有一个版本里投入了非常大的精力去引进OSGi以及去做动态化,这个后来事实证明是个非常非常错误的决定,从这个点我才真正明白在设计系统时一定要想清楚目标,而目标很重要的是和公司发展阶段结合; 3). 可持续性。作为一个要在生产环境持续运行很多年的系统而言,怎么样让其在未来更可持续的发展,这个对设计阶段来说至关重要。这里最low的例子是最早设计HSF协议的时候,协议头里竟然没有版本号,导致后来升级都特别复杂;最典型的例子是HSF在早期缺乏了缺乏了服务Tracing这方面的设计,导致后面发现了这个地方非常重要后,全部落地花了长达几年的时间;又例如HSF早期缺乏Filter Chain的设计,导致很多扩展、定制化做起来非常不方便。 第二段经历,是做T4。T4是基于LXC的阿里的容器,它和HSF的不同是,它其实是一个跨多领域的系统,包括了单机上的容器引擎,容器管理系统,容器管理系统对外提供API,其他系统或用户通过这个来管理容器。这个系统发展过程也是各种犯错,犯错的主要原因也是因为领域掌握不深。在做T4的日子里,学会到的最重要的是怎么去设计这种跨多个专业领域的系统,怎么更好的划分模块的职责,设计交互逻辑,这段经历对我自己更为重要的意义是我有了做更大一些系统的架构的信心。 第三段经历,是做阿里电商的异地多活。这对我来说是真正的去做一个巨大系统的架构师,尽管我以前做HSF的时候参与了淘宝电商2.0-3.0的重大技术改造,但参与和自己主导是有很大区别的,这个架构改造涉及到了阿里电商众多不同专业领域的技术团队。在这个阶段,我学会的最主要的: 1). 子系统职责划分。在这种超大的技术方案中,很容易出现某些部分的职责重叠和冲突,这个时候怎么去划分子系统,就非常重要了。作为大架构师,这个时候要从团队的职责、团队的可持续性上去选择团队; 2). 大架构师最主要的职责是控制系统风险。对于这种超大系统,一定是多个专业领域的架构师和大架构师共同设计,怎么确保在执行的过程中对于系统而言最重要的风险能够被控制住,这是我真正的理解什么叫系统设计文档里设计原则的部分。 设计原则我自己觉得就是用来确保各个子系统在设计时都会遵循和考虑的,一定不能是虚的东西,例如在异地多活架构里,最重要的是如何控制数据风险,这个需要在原则里写上,最基本的原则是可接受系统不可用,但也要保障数据一致,而我看过更多的系统设计里设计原则只是写写的,或者千篇一律的,设计原则切实的体现了架构师对目标的理解(例如当时异地多活这个其实开始只是个概念,但做到什么程度才叫做到异地多活,这是需要解读的,也要确保在技术层面的设计上是达到了目标的),技术方案层面上的选择原则,并确保在细节的设计方案里有对于设计原则的承接以及执行; 3). 考虑问题的全面性。像异地多活这种大架构改造,涉及业务层面、各种基础技术层面、基础设施层面,对于执行节奏的决定要综合考虑人力投入、机器成本、基础设施布局诉求、稳定性控制等,这会比只是做一个小的系统的设计复杂非常多。 系统设计能力的成长,我自己觉得最重要的一是先在一两个技术领域做到专业,然后尽量扩大自己的知识广度。例如除了自己的代码部分外,还应该知道具体是怎么部署的,部署到哪去了,部署的环境具体是怎么样的,和整个系统的关系是什么样的。 像我自己,是在加入基础设施团队后才更加明白有些时候软件上做的一个决策,会导致基础设施上巨大的硬件、网络或机房的投入,但其实有可能只需要在软件上做些调整就可以避免,做做研发、做做运维可能是比较好的把知识广度扩大的方法。 第二点是练习自己做tradeoff的能力,这个比较难,做tradeoff这事需要综合各种因素做选择,但这也是所有的架构师最关键的,可以回头反思下自己在做各种系统设计时做出的tradeoff是什么。这个最好是亲身经历,听一些有经验的架构师分享他们选择背后的逻辑也会很有帮助,尤其是如果恰好你也在同样的挑战阶段,光听最终的架构结果其实大多数时候帮助有限。 技术Leader我觉得最好是能在架构师的基础上,后续注重成长的方面还是有挺大差别,就不在这篇里写了,后面再专门来写一篇。 程序员金字塔 我认为程序员的价值关键体现在作品上,被打上作品标签是一种很大的荣幸,作品影响程度的大小我觉得决定了金字塔的层次,所以我会这么去理解程序员的金字塔。 当然,要打造一款作品,仅有上面的两点能力是不够的,作品里很重要的一点是对业务、技术趋势的判断。 希望作为程序员的大伙,都能有机会打造一款世界级的作品,去为技术圈的发展做出贡献。 由于目前IT技术更新速度还是很快的,程序员这个行当是特别需要学习能力的。我一直认为,只有对程序员这个职业真正的充满兴趣,保持自驱,才有可能在这个职业上做好,否则的话是很容易淘汰的。 作者简介: 毕玄,2007年加入阿里,十多年来主要从事在软件基础设施领域,先后负责阿里的服务框架、Hbase、Sigma、异地多活等重大的基础技术产品和整体架构改造。

茶什i 2020-01-10 15:19:35 0 浏览量 回答数 0

问题

五步教你如何学习前端开发

云效平台 2019-12-01 21:44:57 7061 浏览量 回答数 4

回答

在校生要找到好工作,主要靠几个光环,学校光环、竞赛光环、项目光环、实习光环。其中项目经验尤为重要。有些同学就有疑问了: “我校招没offer,没有项目经验,是不是要报个培训班?” “我转行计算机,是不是应该报个班?” “我也想自学,可怎么学啊,选哪个方向啊?” 对于有些同学,当我还在想办法劝他自学时,给我贴出了培训班的广告词,真可谓,人有多大胆,口号就有多不要脸: “0基础入学,三个月包就业” “毕业月入不过万,不收学费” “从前是你找工作,接下来是工作找你” 当我推荐某些同学去培训时,又给咔咔咔亮出了几个帖子,说培训出来的受歧视啊、有些同学培训出来还是找不到工作啊,等等。 其实,选择自学还是培训是看自身情况而定,无论选择自学还是培训,都只是入门的一种手段,各有优劣势,本文就详细说说自学/培训怎么选,选择以后怎么办,记得帮我点赞哦。   目录: 自学还是培训,怎么选? 自学怎么学? 培训班到底在培训什么? 有些企业歧视培训班学员,培训班的问题到底出在哪? 一些建议 一、自学还是培训,怎么选? 无论你是什么学历、有没有计算机基础,这些都不是决定你适合自学的条件,具备如下三个条件的人都可以选择自学: (1)、时间充足 如果说从零基础靠自学达到找工作的水平,需要多久呢?我觉得至少一年,有的人可能需要两年。所以,如果你是大一、大二、大三的学生,你还有时间,可以选择自学。如果你是已经工作的,想转行计算机,可以边工作边学习,这个过程会比较辛苦,但也不是绝对不可行。 对于大四的同学,以就业为导向,建议你去培训。不可否认,培训是最快入门的方式,对于时间不足的同学而言,培训是最优解。同样地,如果你是已工作的,不存在财务压力,我同样建议你去培训,工作后的时间很珍贵,比不上在校期间有大把时间可以浪费,如果做好了必转的决心,以最快速度转行才是最优解。 (2)、自控力强 能管得住自己,自己定的目标能想尽一切办法实现的同学,真不多,能占人群中1/4已经不错了。 有些人学了半小时就会累,休息一会,就成这样: 我见过太多的半途而废的同学,也见过太多自己安慰自己式的学习方式,但就业就是一个试金石,你这段时间的努力有没有回报,去找工作的时候,就水落石出。 如果在自律这方面不太行的话,可以看下这篇文章,《启舰:你是怎么变自律的?》,找到自已的驱动器,完成自己的梦想。 (3)、具备高中以上学历 计算机本身是数学家发明的,或多或少会用到一些基本的数学知识、经常用到的很多算法都是数学知识的延伸,没有基本的数学功底,自学确实很难。 至于英语阅读能力还好说,只要会用有道词典,不会的去搜去看,总会读懂的,而且入门级的文献和视频中文版的资料已足够你入门,英语应该不是太大的问题。 如果你这三点都满足,恭喜你,你具有了自学的基础,可以选择自学。 二、自学怎么学? 1、选定一个方向 首先,我们选择方向的目的是什么?不就是为了找份工作吗?那直接到招聘类网站去搜下相关的岗位数量及要求不就好了,哪个数量多,自己也喜欢,那就选这个即可。 其次,如果是大三、大四即将毕业的同学,想知道最近哪个岗位好找工作的话。还可以看看很多培训机构的培训内容,现在很多培训机构都声称保就业,真的以为,培训几个月能培训出朵花来吗?不可能的,编程是个需要长期训练的活,几个月的培训,仅是入门而已,入门的水平能保证找份工作,就靠的是这个岗位门槛低,需求大,好找工作。 如果实在不知道选什么,我帮你找几个方向:python、java后端、Html5就业岗位都挺多,就业门槛低,相对好就业,如果也有其它方向推荐,大家可以留言。 2、找到几套视频教材 在入门时强烈不建议跟着书学 第一,不一定能看得懂 第二,书本的知识不成体系,入门有入门的书,进阶有进阶的书,实战有实战的书,需要自己去选择,本身就不是一件易事。 第三,视频可以看到老师的操作,而书本全靠自己摸 现在某某培训班的入门、进阶、实战的系列视频不要太好找,找到这么两套视频,对比着看,或者跟着一套视频深入看,来得更容易。人家培训班安排好的路线跟着学,不懂的自己搜,就已经排除了自已给自己安排路线的难点,况且人家本身就是面向就业的,培训出来的同学能保就业,只要你能跟着学通学会,自然找到工作也不是问题。 我精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!! 只要关注微信公众号【启舰杂谈】后回复你所需方向的关键字即可,比如『Android』、『java』、『ReactNative』、『H5』、『javaweb』、『面试』、『机器学习』、『web前端』、『设计模式』等关键字获取对应资料。(所有资料免费送,转发宣传靠大家自愿) 视频内容非常多,总共2184G、一千六百多册电子书,九百多套视频教程,涉及43个方向。我整理了很长时间,有些资料是靠买的,希望大家能最快的提升自己。帮我点个赞吧。 启舰:全网2184G计算机各方向视频教程/电子书汇总(持续更新中)​   3、自学,除了知识,你还能学到什么? 自学的缺点很明显: 第一:速度慢,所有进度完全靠自己把控,没有氛围 第二:遇到问题需要自己解决,无人请教 那优点恰恰是从这些缺点中磨练出来的,进度靠自己把握,完全磨练了你的意志力。而所有问题靠自己解决,恰恰培养了你的解决问题的能力。 而这些能力都是培训班教不出来的、无法速成的。而这些能力却是真正的开发高手所必备的 问题定义、分析与设计阶段,这是最需要智商、创造力和经验的阶段,真正的开发高手,就是在这一阶段体现出远超普通人的水平,而在这一阶段所需要的能力,对不起,培训班教不出来,也无法速成,只能靠人自己的努力,慢慢地培养和增强。 4、自学建议 (1)、多做笔记、多复习 刚开始学习时,很难,真的很难。很多东西听不懂,很多东西需要自己搜,自己定的进度很可能完不成。 没关系,坚持下去,都是这么过来的。我刚开始自学的时候,也是无数次想死的冲动…… 学会做笔记,把自己学到的东西及时记下来,形成目录,在后面用到的时候,根据笔记再去看一遍,刚开始经常会出现,听得懂,跟着学会,自己弄就不会的现象。这都是正常的,技术本就是个熟能生巧的过程。 多动手,多总结,就慢慢熟练了。 (2)、多写代码!听得懂、看得懂,并没什么用 入门级知识,本就是语法和框架的熟悉过程,说到底就是工具的使用方法熟悉的过程。既然是工具,那就必然要多用。熟能生巧,指的是用的熟。很多同学看的懂,听的会,自己一下手就问题百出,就是练的少! (3)、听不懂,搜一下,再不懂就放过 刚学的时候很多概念听不懂,没关系,自己搜一下,能理解了就理解,理解不了就算。听一遍就行,学到后面的时候,你就懂些了回头,再看看那些知识,基本上你都懂了。 (4)、多写注释 刚开始的时候,很多逻辑弄不懂,没关系,自己把代码拆解,并对其加以注释,这样,你在反过来再看这些代码时,能很快弄懂它的逻辑。你要知道,你后面学习时还是会碰到这些知识的,而在只看一遍的情况下是不可能记得住的,到时候,你还是会返回来复习这些知识的。 增加注释,看起来浪费时间,其实是整理代码逻辑的过程。浑浑噩噩敲出来的代码,自己都不明白什么意思的话,其实相当于没有真正学会。 三、培训班到底在培训什么? 去培训的主要原因,说到底还是因为自己啥都不会。但不会与不会间是有区别的。 对于科班出身的,上学又好好学了的同学,虽然他们没有系统的编程知识,没有项目经验,但他们有计算机基础,他懂得操作系统原理、数据结构与算法等原理性知识。 而对于跨专业和在玩了四年的同学而言,那才是真正的零基础。 而对于培训机构而言,它的责任就是让你实现从0到1的入门过程,而有经验的老鸟都知道,编程入门仅仅是知识的堆积,并没有什么技巧性可言。所有的语法和框架运用,简单来说,就是学会编程套路,学习工具使用。 而培训机构的责任,就是把这些套路教给你。只要你不太笨,经过几个月的强化训练,大部分人都能学得会。 所以,培训班教你的就是工具的使用,目的,就是以最快的速度塞给你,助你找到工作。 四、有些企业歧视培训班学员,培训班的问题到底出在哪? 培训机构有着熟练的授课体系,老师手把手答疑,让你在学习路上没有一丁点的思考时间,为的就是以最快的速度让你达标,好结课,开始下一波培训。 1、问题就出在速度上。 认知科学的研究成果表明,知识的消化与吸收,职业技能的学习与精通,本质上是在大脑神经元之间建立连接,重塑大脑结构的过程,这个过程的时间可以缩短,但不能无限地缩短。另外,不同的人,拥有不同的背景和基础,在学习与掌握相同的知识与职业技能时,所花的时间是不一样的。 而培训机构才不管这些,他的目的就是挣钱,以最快的速度挣钱,能在三天内把所有内容塞给你绝不用四天,只要最终能糊弄住面试官,让学员找到一份工作就可以了。 所以,必然会出现下面的现象: 对于原来有一些基础的,学习能力较强的同学,在学习之前已经有较扎实的基础,所以在培训期间能够自己构建成技术体系,知识吸收相对较好: 而另一些学员,则会出现消化不良的情况: 2、培训后遗症 对于软件开发而言,所有的软件开发都大致分为两个阶段: 1、分析、定义、设计阶段。这个阶段是需要有解决问题、分析问题的能力。而这个能力培训班培训不出来,只能是慢慢增强。 2、语法、工具的使用,将设计的内容实现出来。这一块就比较机械了,工具嘛,学一学都能会,培训班在这一块的效率是很高效的,它们多半能在较短的时间内,教会学员特定编程语言(比如Python)特定工具(比如Git)与特定技术的使用(比如Spring MVC),并且传授给他们一些开发的“套路”(比如分层架构与设计模式),从而将学员成功地培养成为一个能够“搬砖”的软件工人,即初级程序员。 培训班一般都会选择门槛低、就业岗位多的方向进行培训,对于这类岗位,人才缺口大,只要能直接上手写代码的初级程序员,都很容易找到一份工作。这也就是为什么培训班多半会收学生五位数的学费,而学生也愿意支付的根本原因。 (1)、解决问题能力差,动不动就得人教 经过几个月饭来张口、衣来伸手的填鸭式集训,有些人在工作后,却依然认为,当他遇到问题时,从来不想着自己搜搜资料解决,而是依赖同事帮他答疑! 自学能力差、解决问题能力差,是很多人找到了工作,过不了试用期的根本原因。 (2)、培训效果立竿见影,却又很快遗忘 任何的知识都是一样,短时间内填鸭式学到的知识,在一段时间不用后,就会遗忘。这就是有些同学刚从培训班出来时,能找到份工作,当学到的东西在工作中几个月用不到时,就很快忘记,总觉得自己还是啥都不会的原因。 永远要记住:学历不行靠实力,实力不行靠态度!!! 当我们初入职场,尽心尽责地把自己的工作做完做好的同时,千万不要忘记像海绵一样,以最快的速度给自己充水。 像培训完的同学,在校期间已经做了很多的笔记,工作之余,多复习,重新练,利用时间将它理解,真正内化为自己的本领。 对于自学的同学,多找进阶性书籍和视频去看,以最快的速度提升自己。 文末我整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!! 五、一些建议 1、非科班同学建议 对于非科班转行计算机的同学,有太多的知识需要补足,如果你靠的是自学,需要强有力的自律能力,只要时间还够,是可以靠自学的,在跟着视频学的时候,哪里听不懂及时去搜相关的资料去补足。 刚开始自学时,即便是科班出身也是有想死的冲动的,大家都一样。我也是靠自学过来的,很多的东西不会,很多的东西听不懂。没关系,多做笔试,多搜资料,把不会的弄会,你会发现,学习起来越来越容易。 所有的困难只不过是纸老虎,坚持过去就成功了。 如果你是通过培训找到了一份工作,你需要比别人更努力补充计算机知识,基础知识的缺乏,会使你很难在这条路上走很远,所有的大神,都是自学能力很强的人,你想,你也可以。 2、所有开发方向都必须从C++开始? 经常会有要校生问我:我要做H5开发,是不是要先学C++? 其实,各个语言之间是没有任何关联的,完全都是有各自的语法体系和开发工具的,简单来讲,他们都是不同类型的工具。 你学会一种工具,只会对另一种类似的工具更容易上手,而不是完全不用学。所以,想学哪个方向,直接去学就行了,没必须先从C++入手迂回一下,纯属浪费时间。 但,如果你还在上学,现在正在学C++,那我还是建议你好好学,必须C语言语法更接近低层编译器原理,学会了它,对理解低层分配、释放、编译机制都是很有用的,但就以工作为导向而言,如果你不从事C++相关工作,是没必要学的。 3、培训出来人人工资过万? 有个男生非常沮丧的找我,自己是专科毕业,培训完,小公司不想进,大点的公司进不去,给的工资也不高,问我怎么办? 上面我们已经讲到,对于不同程度的同学,在培训出来的结果是不一样的,你要分清,你培训完的情况是属于这种: 还是这种? 对于没有名校光环的同学,建议以先就业为主。 别看培训班招你的时候给你洗脑,培训完人人过万,但能不能过万,最终靠的是自己,而不是培训班。 认请自己的情况,可以先就业,再优化自己履历,而进步步高升。 4、建议不要暴露自己的培训经历 你百度、知乎搜一下,遍地的培训歧视,很多公司根本不要培训出来的同学. 业界对培训有偏见,因为写代码是一个逐渐学习、熟练的过程,经过几个月集中的培训,虽然看起来什么都接触到了,但真正能内化为自己知识的部分其实不多。在工作中并不能熟练运用,仅是入门水平而已。 而且大家普遍认为参加培训的主要原因是因为,大学中没好好学,临近毕业了,催熟一把。不然,谁会花这几万块钱呢?对普通家庭而言,其实也并不是个小数目了。 有一个外包公司的朋友,技术总监,招人时培训公司出来都不要,原因就是干活能力不行。当然这仅代表个例,但大家需要注意的是,业界并不认为培训是一件光彩的事,千万不要搞错了!!! 5、培训班防骗三十六计 现在太多的培训机构,一个个把自己吹的天花乱坠,我也建议过小伙伴去培训,但小孩子交完钱培训一个月就退费了,深感自己好心做了坏事,这里建议大家培训市场,鱼龙混杂,一定要提前做好防骗准备。 谎言之所以真实是因为年青的心太不甘寂寞,太急于求成! 从网上找了,培训班防骗三十六计,供大家参考: “借刀杀人”:培训班间竞争激烈,彼此勾心斗角,正好为我所用。去培训班甲问乙如何,到培训班乙打听甲。Ha.Ha..,狗咬狗开始了,一时间内幕迭报:乙设备不全,很多实验不能做;甲的那个号称CCIE的老师只过了笔试,没过实验室,假的! “声东击西”:与甲约好星期六考察学校,结果星期X跑去(1=< X <= 5)。   “你怎么来了?”   “我星期六有事,所以提前来看看……” “抛砖引玉”:有时候,拿不定注意或者培训班在外地,实地考察有难度,何不到论坛发个帖子征求意见,要是能得到已经培训过的前辈的释疑,那你绝对是不虚此帖了! “假痴不癫”:有时候你可能偶然拥有一些内幕消息,不如试试他们的诚实度。   “听说你们的教师是CCIE!”   “那当然,技术首屈一指,……”   此时此刻,看着乙那得意样样的小样,不知是好笑,还是可气。不过记住:一个没有诚信的公司是什么都干的出来的! “反间计”:一个卑鄙的培训班后面一般都有一个卑鄙的流氓大亨,他不仅千方百计的从学员那里榨取钱财,对自己的手下也不会心慈手软,本着人们内部矛盾的原则发展一个或多个间谍。 “走为上计”:经过一番打探,知道他们都不是东西,还犹豫什么?宁缺毋滥,走人! 最后,如论怎么选,自终也只是入门阶段,为了找到一份工作。对于初入职场的你们,给一条最终建议:学校不行靠实力,实力不行靠态度。记得帮我点赞哦。 ———————————————— 版权声明:本文为CSDN博主「启舰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/harvic880925/article/details/103413853

问问小秘 2020-01-07 10:55:15 0 浏览量 回答数 0

回答

你的难点在于Discuz是否可以向外开放用户认证接口,以及接口规范是啥。 这两个基础都没有,也就谈不到Gitlab接入的问题。 ######回复 @DuLerWeil : 现在一个网站用的是PHP,一个是Ruby,虽然都是用Nginx,能共存吗?######回复 @maya8maya85 : 程序咋部署无所谓,哪怕你把所有东西都装一台笔记本上。######回复 @DuLerWeil : 如果GitLab开放注册,那GitLab注册的帐号又要同步到Dz上,也是一大难题,现在简单点,单向同步,只把Dz的帐号同步过去,先搞定这个吧。你说这个oauth2服务器是又要开一个新的CentOS,还是放在旧的服务器上?######回复 @maya8maya85 : Gitlab可以开放注册啊。 关于Dz和Gitlab对接的问题,估计你是找不到现成的解决方案了。 鉴于OAuth2协议本身很简单,你可以研究Dz的用户表结构(特别是密码加盐算法之类的),然后基于表结构单独写个OAuth2服务器供Gitlab对接用。######GitLab不接受注册,只能在Dz注册再使用GitLab。我觉得这个好难,而且它们不在同一个服务器上,语言什么都不一样。有什么方法或者方向让我知道,我一步该怎么处理呢?###### Discuz应该是有个UCenter类似单点登录的,但很明显gitlab不会支持UCenter的协议。 楼主需要研究两个东西 UCenter的协议 ruby rails 然后参考我这篇文章:http://leo108.com/pid-2138.asp ######回复 @leo108 : 还有clone下来的omniauth如何安装?######回复 @leo108 : 这是通过套装安装的Gitlab######回复 @leo108 : 3,omniauth_allow_single_sign_on = true?默认是这”['saml']“,是bool值吗?######回复 @leo108 : 2,gitlab的config/initializers/devise.rb同样没有找到,/var,/opt都没有找到。######回复 @leo108 : 1,写好的mystrategy.rb放在哪里?根据你的指引一篇老外文章是放在"lib/strategies/mystrategy.rb",但根本没有"lib/strategies"这个目录。请问具体放在哪里?######这个要自己搞吧 没搞过 帮不上忙###### @maya8maya85  strategy.rb放/opt/gitlab/embedded/service/gitlab-rails/lib/omni_auth/strategies/ config/initializers/devise.rb在/opt/gitlab/embedded/service/gitlab-rails/config/initializers/devise.rb 至于omniauth_allow_single_sign_on,using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none. clone安装的我没试过,不清楚 ######回复 @leo108 : C,最后一个就是这个strategy.rb这文件的文件名,好像除了写文件的时候出现了一下,其它地方从来都没看到它的名字,名字没关系吗?成功引用了吗?######回复 @leo108 : B,你那文章中的指明加载路径那段代码,是加在文件config/initializers/devise.rb那里,我加在最后,现在我不知道对不对?反正现在是502,是有个地方错了。######回复 @leo108 : A,这lib/omni_auth目录是没有strategies文件夹的,你的意思是新建文件夹放rb进去吗?######回复 @leo108 : 还有三个地方想请你指导一下。######回复 @maya8maya85 : gitlab本身已经集成了omniauth了,不需要你再装啊###### @leo108 ###### A. 新建文件夹 B.是真正的最后,在原本最下面的end那行下面 C.其实就是B里面的最后一个,也就是uco.rb ######回复 @leo108 : 调了几天都没成功,一错就是502,也不提示说有什么错误,不好调。。你那文章是没有发布gem的处理,如果是发布的gem,你会装吗?像安装个douban或者weibo什么的,能帮我装一下吗?大神,我按gitlab的文档也没成功######回复 @leo108 : 我比你更生手呢######回复 @maya8maya85 : 我对ruby也不熟,502的话应该是有ror的报错,具体日志路径在哪忘记了,你可以看看问题出在哪里######如果方便的话,我提供服务器相关密码,请你帮助一下,只要能调试到能重定向百度就ok.######特意抽出时间写了一天,按照你的文章指示,由于对语法不了解,我逐行调试,重编译,发现新写的uco.rb文件只要出现module就会502,不解。我安装的是8.10. devise.rb更是一加就502。不解,你的gitlab是什么版本?

kun坤 2020-06-14 11:44:53 0 浏览量 回答数 0

回答

你的难点在于Discuz是否可以向外开放用户认证接口,以及接口规范是啥。 这两个基础都没有,也就谈不到Gitlab接入的问题。 ######回复 @DuLerWeil : 现在一个网站用的是PHP,一个是Ruby,虽然都是用Nginx,能共存吗?######回复 @maya8maya85 : 程序咋部署无所谓,哪怕你把所有东西都装一台笔记本上。######回复 @DuLerWeil : 如果GitLab开放注册,那GitLab注册的帐号又要同步到Dz上,也是一大难题,现在简单点,单向同步,只把Dz的帐号同步过去,先搞定这个吧。你说这个oauth2服务器是又要开一个新的CentOS,还是放在旧的服务器上?######回复 @maya8maya85 : Gitlab可以开放注册啊。 关于Dz和Gitlab对接的问题,估计你是找不到现成的解决方案了。 鉴于OAuth2协议本身很简单,你可以研究Dz的用户表结构(特别是密码加盐算法之类的),然后基于表结构单独写个OAuth2服务器供Gitlab对接用。######GitLab不接受注册,只能在Dz注册再使用GitLab。我觉得这个好难,而且它们不在同一个服务器上,语言什么都不一样。有什么方法或者方向让我知道,我一步该怎么处理呢?###### Discuz应该是有个UCenter类似单点登录的,但很明显gitlab不会支持UCenter的协议。 楼主需要研究两个东西 UCenter的协议 ruby rails 然后参考我这篇文章:http://leo108.com/pid-2138.asp ######回复 @leo108 : 还有clone下来的omniauth如何安装?######回复 @leo108 : 这是通过套装安装的Gitlab######回复 @leo108 : 3,omniauth_allow_single_sign_on = true?默认是这”['saml']“,是bool值吗?######回复 @leo108 : 2,gitlab的config/initializers/devise.rb同样没有找到,/var,/opt都没有找到。######回复 @leo108 : 1,写好的mystrategy.rb放在哪里?根据你的指引一篇老外文章是放在"lib/strategies/mystrategy.rb",但根本没有"lib/strategies"这个目录。请问具体放在哪里?######这个要自己搞吧 没搞过 帮不上忙###### @maya8maya85  strategy.rb放/opt/gitlab/embedded/service/gitlab-rails/lib/omni_auth/strategies/ config/initializers/devise.rb在/opt/gitlab/embedded/service/gitlab-rails/config/initializers/devise.rb 至于omniauth_allow_single_sign_on,using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none. clone安装的我没试过,不清楚 ######回复 @leo108 : C,最后一个就是这个strategy.rb这文件的文件名,好像除了写文件的时候出现了一下,其它地方从来都没看到它的名字,名字没关系吗?成功引用了吗?######回复 @leo108 : B,你那文章中的指明加载路径那段代码,是加在文件config/initializers/devise.rb那里,我加在最后,现在我不知道对不对?反正现在是502,是有个地方错了。######回复 @leo108 : A,这lib/omni_auth目录是没有strategies文件夹的,你的意思是新建文件夹放rb进去吗?######回复 @leo108 : 还有三个地方想请你指导一下。######回复 @maya8maya85 : gitlab本身已经集成了omniauth了,不需要你再装啊###### @leo108 ###### A. 新建文件夹 B.是真正的最后,在原本最下面的end那行下面 C.其实就是B里面的最后一个,也就是uco.rb ######回复 @leo108 : 调了几天都没成功,一错就是502,也不提示说有什么错误,不好调。。你那文章是没有发布gem的处理,如果是发布的gem,你会装吗?像安装个douban或者weibo什么的,能帮我装一下吗?大神,我按gitlab的文档也没成功######回复 @leo108 : 我比你更生手呢######回复 @maya8maya85 : 我对ruby也不熟,502的话应该是有ror的报错,具体日志路径在哪忘记了,你可以看看问题出在哪里######如果方便的话,我提供服务器相关密码,请你帮助一下,只要能调试到能重定向百度就ok.######特意抽出时间写了一天,按照你的文章指示,由于对语法不了解,我逐行调试,重编译,发现新写的uco.rb文件只要出现module就会502,不解。我安装的是8.10. devise.rb更是一加就502。不解,你的gitlab是什么版本?

kun坤 2020-06-01 11:10:31 0 浏览量 回答数 0

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

回答

" 你的难点在于<span style=""font-family:"font-size:14px;line-height:22px;background-color:#FFFFFF;"">Discuz是否可以向外开放用户认证接口,以及接口规范是啥。 这两个基础都没有,也就谈不到Gitlab接入的问题。 ######回复 @DuLerWeil : 现在一个网站用的是PHP,一个是Ruby,虽然都是用Nginx,能共存吗?######回复 @maya8maya85 : 程序咋部署无所谓,哪怕你把所有东西都装一台笔记本上。######回复 @DuLerWeil : 如果GitLab开放注册,那GitLab注册的帐号又要同步到Dz上,也是一大难题,现在简单点,单向同步,只把Dz的帐号同步过去,先搞定这个吧。你说这个oauth2服务器是又要开一个新的CentOS,还是放在旧的服务器上?######回复 @maya8maya85 : Gitlab可以开放注册啊。 关于Dz和Gitlab对接的问题,估计你是找不到现成的解决方案了。 鉴于OAuth2协议本身很简单,你可以研究Dz的用户表结构(特别是密码加盐算法之类的),然后基于表结构单独写个OAuth2服务器供Gitlab对接用。######GitLab不接受注册,只能在Dz注册再使用GitLab。我觉得这个好难,而且它们不在同一个服务器上,语言什么都不一样。有什么方法或者方向让我知道,我一步该怎么处理呢?###### Discuz应该是有个UCenter类似单点登录的,但很明显gitlab不会支持UCenter的协议。 楼主需要研究两个东西 UCenter的协议 ruby rails 然后参考我这篇文章:http://leo108.com/pid-2138.asp ######回复 @leo108 : 还有clone下来的omniauth如何安装?######回复 @leo108 : 这是通过套装安装的Gitlab######回复 @leo108 : 3,omniauth_allow_single_sign_on = true?默认是这”['saml']“,是bool值吗?######回复 @leo108 : 2,gitlab的config/initializers/devise.rb同样没有找到,/var,/opt都没有找到。######回复 @leo108 : 1,写好的mystrategy.rb放在哪里?根据你的指引一篇老外文章是放在"lib/strategies/mystrategy.rb",但根本没有"lib/strategies"这个目录。请问具体放在哪里?######这个要自己搞吧 没搞过 帮不上忙###### @maya8maya85  strategy.rb放/opt/gitlab/embedded/service/gitlab-rails/lib/omni_auth/strategies/ config/initializers/devise.rb在/opt/gitlab/embedded/service/gitlab-rails/config/initializers/devise.rb 至于omniauth_allow_single_sign_on,using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none. clone安装的我没试过,不清楚 ######回复 @leo108 : C,最后一个就是这个strategy.rb这文件的文件名,好像除了写文件的时候出现了一下,其它地方从来都没看到它的名字,名字没关系吗?成功引用了吗?######回复 @leo108 : B,你那文章中的指明加载路径那段代码,是加在文件config/initializers/devise.rb那里,我加在最后,现在我不知道对不对?反正现在是502,是有个地方错了。######回复 @leo108 : A,这lib/omni_auth目录是没有strategies文件夹的,你的意思是新建文件夹放rb进去吗?######回复 @leo108 : 还有三个地方想请你指导一下。######回复 @maya8maya85 : gitlab本身已经集成了omniauth了,不需要你再装啊###### @leo108 ###### A. 新建文件夹 B.是真正的最后,在原本最下面的end那行下面 C.其实就是B里面的最后一个,也就是uco.rb ######回复 @leo108 : 调了几天都没成功,一错就是502,也不提示说有什么错误,不好调。。你那文章是没有发布gem的处理,如果是发布的gem,你会装吗?像安装个douban或者weibo什么的,能帮我装一下吗?大神,我按gitlab的文档也没成功######回复 @leo108 : 我比你更生手呢######回复 @maya8maya85 : 我对ruby也不熟,502的话应该是有ror的报错,具体日志路径在哪忘记了,你可以看看问题出在哪里######如果方便的话,我提供服务器相关密码,请你帮助一下,只要能调试到能重定向百度就ok.######特意抽出时间写了一天,按照你的文章指示,由于对语法不了解,我逐行调试,重编译,发现新写的uco.rb文件只要出现module就会502,不解。我安装的是8.10. devise.rb更是一加就502。不解,你的gitlab是什么版本?"

montos 2020-05-31 21:56:24 0 浏览量 回答数 0

回答

" 你的难点在于<span style=""font-family:"font-size:14px;line-height:22px;background-color:#FFFFFF;"">Discuz是否可以向外开放用户认证接口,以及接口规范是啥。 这两个基础都没有,也就谈不到Gitlab接入的问题。 ######回复 @DuLerWeil : 现在一个网站用的是PHP,一个是Ruby,虽然都是用Nginx,能共存吗?######回复 @maya8maya85 : 程序咋部署无所谓,哪怕你把所有东西都装一台笔记本上。######回复 @DuLerWeil : 如果GitLab开放注册,那GitLab注册的帐号又要同步到Dz上,也是一大难题,现在简单点,单向同步,只把Dz的帐号同步过去,先搞定这个吧。你说这个oauth2服务器是又要开一个新的CentOS,还是放在旧的服务器上?######回复 @maya8maya85 : Gitlab可以开放注册啊。 关于Dz和Gitlab对接的问题,估计你是找不到现成的解决方案了。 鉴于OAuth2协议本身很简单,你可以研究Dz的用户表结构(特别是密码加盐算法之类的),然后基于表结构单独写个OAuth2服务器供Gitlab对接用。######GitLab不接受注册,只能在Dz注册再使用GitLab。我觉得这个好难,而且它们不在同一个服务器上,语言什么都不一样。有什么方法或者方向让我知道,我一步该怎么处理呢?###### Discuz应该是有个UCenter类似单点登录的,但很明显gitlab不会支持UCenter的协议。 楼主需要研究两个东西 UCenter的协议 ruby rails 然后参考我这篇文章:http://leo108.com/pid-2138.asp ######回复 @leo108 : 还有clone下来的omniauth如何安装?######回复 @leo108 : 这是通过套装安装的Gitlab######回复 @leo108 : 3,omniauth_allow_single_sign_on = true?默认是这”['saml']“,是bool值吗?######回复 @leo108 : 2,gitlab的config/initializers/devise.rb同样没有找到,/var,/opt都没有找到。######回复 @leo108 : 1,写好的mystrategy.rb放在哪里?根据你的指引一篇老外文章是放在"lib/strategies/mystrategy.rb",但根本没有"lib/strategies"这个目录。请问具体放在哪里?######这个要自己搞吧 没搞过 帮不上忙###### @maya8maya85  strategy.rb放/opt/gitlab/embedded/service/gitlab-rails/lib/omni_auth/strategies/ config/initializers/devise.rb在/opt/gitlab/embedded/service/gitlab-rails/config/initializers/devise.rb 至于omniauth_allow_single_sign_on,using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none. clone安装的我没试过,不清楚 ######回复 @leo108 : C,最后一个就是这个strategy.rb这文件的文件名,好像除了写文件的时候出现了一下,其它地方从来都没看到它的名字,名字没关系吗?成功引用了吗?######回复 @leo108 : B,你那文章中的指明加载路径那段代码,是加在文件config/initializers/devise.rb那里,我加在最后,现在我不知道对不对?反正现在是502,是有个地方错了。######回复 @leo108 : A,这lib/omni_auth目录是没有strategies文件夹的,你的意思是新建文件夹放rb进去吗?######回复 @leo108 : 还有三个地方想请你指导一下。######回复 @maya8maya85 : gitlab本身已经集成了omniauth了,不需要你再装啊###### @leo108 ###### A. 新建文件夹 B.是真正的最后,在原本最下面的end那行下面 C.其实就是B里面的最后一个,也就是uco.rb ######回复 @leo108 : 调了几天都没成功,一错就是502,也不提示说有什么错误,不好调。。你那文章是没有发布gem的处理,如果是发布的gem,你会装吗?像安装个douban或者weibo什么的,能帮我装一下吗?大神,我按gitlab的文档也没成功######回复 @leo108 : 我比你更生手呢######回复 @maya8maya85 : 我对ruby也不熟,502的话应该是有ror的报错,具体日志路径在哪忘记了,你可以看看问题出在哪里######如果方便的话,我提供服务器相关密码,请你帮助一下,只要能调试到能重定向百度就ok.######特意抽出时间写了一天,按照你的文章指示,由于对语法不了解,我逐行调试,重编译,发现新写的uco.rb文件只要出现module就会502,不解。我安装的是8.10. devise.rb更是一加就502。不解,你的gitlab是什么版本?"

montos 2020-06-03 15:13:03 0 浏览量 回答数 0

回答

一般都是调用现成的命令,解析命令输出######回复 @Hyacinthus_M : 几乎所有编程语言都有执行命令获取输出的方法的,获取完之后,按行正则表达式匹配提取信息即可######回复 @Mallon : 那你能给点这方面解析的资料吗?我的GREP等用得不好,首先得有思路了,不然我会觉得还没有改代码来得可行。######回复 @Mallon : 意思是先iwlist eth0 scan | grep "Target"吗,那怎么样设置密码呢?在这方面我很迷惑######回复 @Hyacinthus_M : 你在程序里调用命令行,Linux下基本就是这个套路######可是要求是写程序。 这个程序是面对客户的,我总不能要求客户还能用命令行吧。我只想知道有没有代码量小点的方法。###### 是这样的。我开始的时候也想过通过用system调用通过shell的工具来完成任务,可是shell功底有些不足。 我所需要的只是iwlist eth0 scan 结果中的ESSID, TXPOWER,还有就是加密相关的内容。 而又要求将这些内容以每个网络块的方式输出,而通过grep 后,所有的相同的项都在一起了。 那么要通过样才能实现我的需求呢,shell我真的很基本。 ###### 引用来自“Hyacinthus_M”的答案 是这样的。我开始的时候也想过通过用system调用通过shell的工具来完成任务,可是shell功底有些不足。 我所需要的只是iwlist eth0 scan 结果中的ESSID, TXPOWER,还有就是加密相关的内容。 而又要求将这些内容以每个网络块的方式输出,而通过grep 后,所有的相同的项都在一起了。 那么要通过样才能实现我的需求呢,shell我真的很基本。 shell作为程序设计语言功能太弱了,上perl python吧,推荐后者,呵呵 ######回复 @Hyacinthus_M : 纯C麻烦,我没研究过...######这个程序只能C做,纯的。python,呵呵。说重点好吗,######grep是shell用的,其它语言都内置正则模块的###### http://stackoverflow.com/questions/646241/c-run-a-system-command-and-get-output######大哥,你没有把握我的意思啊。###### 正则就用PCRE吧 http://www.pcre.org/ ###### 按照楼主的描述,我猜公司是让你在一个嵌入式设备上实现该功能吧。 wireless-tools需要跟底层的硬件配合使用,它本身无非就是通过socket从内核获取到信息。设备的wifi驱动也是你们自己搞的?如果从驱动着手的话,可能还更简单点。方便的话,可以说一下你们所使用的平台。 ######我也是刚去上班不久的,对硬件了解也少,驱动好像不是他们写的。 我已经改了不少了,这个星期应该能完成吧。 iw_get_ext()这个接口?######是用的baspberrypi的。系统基本和debian的一样。只是只有基本的一些功能。######回复 @txgcwm : 大哥。真是谢谢你啊。 我真的很需要这样的交流。 你也早点睡啊。我先睡了。######回复 @Hyacinthus_M : 大哥。真是谢谢你啊。 我真的很需要这样的交流。 你也早点睡啊。我先睡了。######回复 @txgcwm : 你好。我对你说的“楼主可以使用fopen来执行“iwlist eth0 scan”指令,将获取到的结果逐个解析出来”的意思不是太理解? 是先将结果定向到一个文件中,然后再解析? 好像你不是这个意思啊,有些地方我不是很懂,可以请你说具体点吗######回复 @txgcwm : 是啊,我也想通过调用system()来运行iwlist eth0 scan来做,然后解析输出,包括无线网络的配置,同样也可以用同样的方法来做,但是我的问题出在解析部分。 希望你给点具体点的建议。######如果是那样的话,预计你执行那些指令是没有多少问题的。 楼主可以使用fopen来执行“iwlist eth0 scan”指令,将获取到的结果逐个解析出来(这样比你修改代码好多了,字符串解析应该相对简单一些嘛)。###### 引用来自“txgcwm”的答案 按照楼主的描述,我猜公司是让你在一个嵌入式设备上实现该功能吧。 wireless-tools需要跟底层的硬件配合使用,它本身无非就是通过socket从内核获取到信息。设备的wifi驱动也是你们自己搞的?如果从驱动着手的话,可能还更简单点。方便的话,可以说一下你们所使用的平台。 是的呢。我不是科班出身的,一直在自己摸索,有很多东西都不太懂,很多时候都是在用笨方法来解决。      开始的时候,我的确是想用SHELL来实现的,然后解析。但是我的头说要用程序写, 开始真是一点头绪都没有,我只能想到去修改wireless-tools的源程序了。 我觉得自己可以解决的。 不过,还是希望你能给点建议。 ######楼主,现在这个问题肯定解决了吧!能不能分享一下最后的结果啊?我现在也遇到了和你同样的问题,可是我没有楼主那么厉害,可以直接更改源代码。能不能帮一下小弟,谢谢先!!!######回复 @txgcwm : 你好,我已经使用解析的方法完成了基本功能。最近在使用基于wireless.h,iwlib.h iwlib.c三个文件(丢弃iwlist.c iwconfig.c)来重写该程序,在main.c中,包括了#include "iwlib.h", 并且在iwlib.h声明了所有的函数原型,所有的函数实现均在iwlib.c中,######回复 @txgcwm : 恩。我已经在baspberrypi的板子上运行过wireless-tools的工具了,iwlist scan结果正常。######回复 @txgcwm : 比如,把scan的结果定向到一个文件中,然后再通过字符串的操作来实现,还是scan | grep 的方法来实现呢? 后者我不太熟悉,我的功底还没能满足需求,但是前者,对多个关健字的解析方面的算法实现,思路不是很明确。######回复 @Hyacinthus_M : 而且我建议你将这个工具在没有修改前先编译进去,看看是否能够输出你想要的数据(没有的话可能底层不支持,那样的话你上层改了也没有用)。###### #include <sys/wait.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <stdio.h> #define MAXLINE 1024 int main(int argc, char **argv) { char buf[MAXLINE]; int rc = 0; FILE *fp = NULL; fp = popen("iwlist wlan0 scan", "r"); if(fp == NULL) { perror("popen error!"); return -1; } while(fgets(buf, MAXLINE, fp) != NULL) { int len = strlen(buf); if(buf[len-1] == '\n') buf[len-1] = '\0'; printf("%s\r\n", buf); } if((rc = pclose(fp)) < 0) { perror("pclose error!"); return -1; } return 0; }######回复 @txgcwm : 但是在主函数中,调用相关函数经常出现“undefined reference to”的错误,这些错误我有些不能理解。我在网上也看了一些相关的资料,但是是没能解决,希望你给点建议。######回复 @Hyacinthus_M : 给你一个大概的思路: 1、从数据上看,每个wifi信息都是以cell开头的,以此为标记; 2、使用isspace函数将前面的所有空格清除; 3、通过strcmp对比你要获取的数据项,然后将其后的数据保存。 你自己尝试解析,后续有问题,下班了再说。######回复 @txgcwm : 就是。我觉得他个人有点偏执。同样是用上层。他是把这个任务交给我的。我的公司小,只有十个人,其中几个还是实习的。我先用解析的方法做出来,如果有什么不懂的,还要请教你啊。 对了,设置关键字字符串数组,每一行一行的解析,是不是用strstr()简单来对每一行的内容与关键字进行配对来过滤内容就可以了?######回复 @Hyacinthus_M : 这个我也不太清楚哪里有这些资料,你自己去找找吧。无论你是去修改wireless tools还是按照解析输出数据的方法,也只是上层应用。如果要从内核的层次去了解这些东西,预计你一周的时间根本不够。 不太清楚你的主管需要你用什么样的方法实现?他固执的要用自己的方法(他自身是否对这些可能用到的方法作过分析?),他自己为什么不去实现。######回复 @txgcwm : 我把自己的想法和他说了,他还是让我熟悉底层的API(意思还是让我去修改wireless-tools)。先把用这个实现方法做出来吧。用wireless-tools修改程序的方法,和解析输出的方法没有本质区别吧。 对了,基于无线网络开发的API在哪能找到资料?难道要去看kernel?

kun坤 2020-06-06 13:38:52 0 浏览量 回答数 0

问题

使用 ASM 实现 Java 语言的“多重继承”:报错

kun坤 2020-06-06 15:29:41 0 浏览量 回答数 1

问题

Java技术1000问(3)【精品问答】

问问小秘 2020-06-02 14:27:10 42 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SSL证书 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 2020中国云原生 阿里云云栖号