关于编程:2024年2月文章一览

2024年2月编程人总共更新了5篇文章: 1.2024年1月文章一览 2.Programming Abstractions in C浏览笔记:p283-p292 3.Programming Abstractions in C浏览笔记:p293-p302 4.Programming Abstractions in C浏览笔记:p303-p305 5.Programming Abstractions in C浏览笔记:p306-p307 欢送搜寻及关注:编程人(a_codists)

March 2, 2024 · 1 min · jiezi

关于编程:什么是编程语言分类中的强类型语言

在深入探讨强类型语言之前,咱们须要明确计算机编程语言是如何依据它们解决类型信息的形式来分类的。编程语言依照类型零碎的严格性分为 强类型语言 和 弱类型语言。类型零碎是指编程语言中变量、表达式和函数等元素的数据类型治理规定。类型零碎的设计影响了代码的安全性、可维护性和执行效率。 强类型语言 指的是那些在编译时或运行时强制进行类型查看的语言,不容许隐式地在不同数据类型之间进行转换。这意味着如果试图将一种类型的值赋给另一种类型的变量,编译器或解释器将抛出谬误,除非进行了明确的类型转换。强类型语言的这一特点有助于避免类型谬误,使得代码更加平安和稳固。 强类型语言是一种强制数据类型定义的语言,要求变量的应用要严格合乎定义,所有变量都必须先定义后应用。 强类型语言不容许任意的隐式数据类型转换。也就是说,一旦一个变量被指定了某个数据类型,如果不通过强制转换,那么它就永远是这个数据类型了。 为了更好地了解,咱们能够通过一些典型的 强类型语言 例子来开展阐明: PythonPython 被宽泛认为是一种强类型语言,因为它不容许隐式类型转换。例如,尝试将字符串和整数相加时,Python 会抛出类型谬误,要求开发者明确转换类型。 number = 10text = "年龄:"# 上面这行会抛出 TypeError,因为 Python 不容许隐式地将整数转换为字符串age = text + numberJavaJava 也是一种典型的强类型语言。它在编译阶段进行类型查看,任何类型不匹配的操作都会导致编译谬误。Java 要求变量在应用前必须申明其类型,且类型一旦申明,不容许扭转。 String text = "Hello, world!";int number = 5;// 上面这行会导致编译谬误,因为 Java 不容许隐式类型转换text = number;HaskellHaskell 是一种纯函数式编程语言,领有十分弱小的类型零碎。它不仅反对强类型查看,还反对类型推导。在 Haskell 中,所有类型谬误都会在编译时被捕捉,极大地缩小了运行时谬误的可能性。 addNumbers :: Int -> Int -> IntaddNumbers x y = x + y-- 上面这行会导致编译谬误,因为 "hello" 不是 Int 类型result = addNumbers "hello" 5ScalaScala 是一种多范式编程语言,既反对面向对象编程,也反对函数式编程。它的类型零碎既弱小又灵便,反对强类型查看。Scala 容许隐式类型转换,但这须要通过明确的规定来定义,防止了不平安的类型转换。 ...

March 1, 2024 · 1 min · jiezi

关于编程:什么是编程语言里的-pseudo-comments

在探讨软件开发畛域的 pseudo comments (伪正文)之前,咱们须要明确软件开发过程中正文的作用。正文在代码中扮演着至关重要的角色,它们为开发者提供了一种形式,用以在不烦扰程序失常运行的状况下,增加阐明和备注。这些阐明有助于解释代码的性能、目标、算法逻辑等,从而使得代码更易于了解和保护。然而,pseudo comments 与传统意义上的正文不同,它们在软件开发中用于特定的目标,包含但不限于编译器指令、代码生成工具的标记以及其余非传统的用处。 pseudo comments 实际上是一种非凡的代码正文,它们被设计用来在编译期或其余解决阶段被特定工具读取和解释,而不仅仅是为了给人浏览。这些伪正文能够管制编译器行为,领导代码剖析工具,或者被用于主动生成文档。因为它们可能被工具辨认和解决,pseudo comments 因而成为了连贯代码编写和自动化工具之间桥梁的一部分。 以 Java 语言为例,@Deprecated 注解就能够视为一种 pseudo comment。当一个办法或类被标记为 @Deprecated 时,这意味着它曾经被废除,不举荐应用。尽管它呈现在源代码中,但 @Deprecated 注解可能被 Java 编译器辨认,并可能在编译时收回正告,告知开发者有更好的代替办法。例如: /** * @deprecated 因为平安起因,此办法已被废除。应用 `newMethod()` 代替。 */@Deprecatedpublic void oldMethod() { // ...}在 C++ 中,#pragma once 指令是另一个 pseudo comment 的例子。它用来避免同一头文件的多重蕴含,是一种非标准但广泛支持的预处理器指令。只管 #pragma once 间接影响编译过程,但它以正文的模式呈现,阐明了其目标和应用场景,从而使代码更加清晰。例如: #pragma onceclass MyClass { // ...};在 Python 中,类型提醒(Type Hints)也能够被看作是一种 pseudo comment。自从 Python 3.5 引入类型提醒以来,开发者能够应用它们来批示变量、函数参数和返回值的冀望类型。这些类型信息既服务于代码阅读者,帮忙他们了解冀望的数据类型,也能被诸如 mypy 这样的动态类型查看器读取,从而在代码运行前发现潜在的类型谬误。尽管类型提醒对 Python 解释器的运行没有间接影响,它们在某种程度上像正文,但能被工具用于剖析和验证代码。例如: def greet(name: str) -> str: return f'Hello, {name}'在 JavaScript 中,JSDoc 正文也是一种重要的 pseudo comment。通过 JSDoc,开发者能够为函数、参数、返回值以及其余JavaScript实体增加具体的形容信息。这些信息不仅使得代码更易于了解,还能够被文档生成工具如 jsdoc 主动读取,用于生成具体的 API 文档。JSDoc 正文尽管为人类阅读者设计,但其格式化的构造使得它们能够被工具解析,进而主动生成文档或辅助代码编辑器提供智能提醒。例如: ...

March 1, 2024 · 1 min · jiezi

关于编程:我为什么选择这样一份经常出差的工作

这几个月进入出差模式,在酒店与工厂两点一线之间往返。周五,在返回酒店途中,一名共事问我:“你工作了那么多年,为什么抉择这样一份出差的工作?”,话中有话就是出差不不便,与家人、敌人聚少离多。 刚研究生毕业不久,算法岗的共事,绝对于毕业好几年,从事后端开发的我而言,的确抉择要多得多,有这样的疑难也了解。于我,当初为什么要抉择这样一份常常出差的工作呢?周末两天我始终思考这个问题,有以下几点起因:一、在收到的offer当中,这份工作给的薪资最高。二、面试时HR与将来的领导谨严而又不失随和,给我感觉很好。三、想趁着出差的机会到其它城市走一走、看看。四、该岗位所须要的技术我能满足,同时有些技术也是我想去学的。 现在,入职已满一年,以上的三点应该说都实现了,但同时也产生了一些变动:工作了一年,薪资的增长并不大;已经面试时的直属领导到职了;趁着出差的机会只去了两个城市;技术上也只剩算法相干的内容对我比拟有吸引力。 之所以把这个问题拿进去写,是因为从这个问题中发觉本人想得到什么,能失去什么,如何去扭转。上图中,是工厂的一位母亲带着孩子下班,母亲进入产线,将孩子留在休息室。每当看着这张照片,我就在想,我当前的生存是否会这样,这样的生存是否是我想要的,我是否有其它的抉择。我想这样的问题会始终随同着我,也随同着每一个人。 欢送搜寻及关注:编程人(a_codists)

September 27, 2023 · 1 min · jiezi

关于编程:设计模式代理模式

代理模式这个设计模式对我来说有非凡的意义,因为这是我在工作中第一次分享学习的主题,过后我还是一个实习生,当初一眨眼曾经过来很多年了。 设计模式是什么过后分享的具体内容是什么我曾经不记得了,而且其实我过后也并不太了解设计模式是什么,起初浏览了一些文章,我模摸糊糊地了解设计模式就是代码的设计方案。 说到这,我想起之前看的《黑客与画家》,外面说优良的程序员更像画家,这么一来不就对上了吗,两者关注的都是如何设计,是创造者,画家留神的是如何去设计构图,程序员留神的是如何去设计数据结构、代码构造、零碎架构,一份设计良好的程序代码具备更好的可读性和可维护性,所以设计模式就是一些通过测验的、通用的、可复用的代码设计方案。 设计模式分类wiki中将设计模式分为四类,别离是: 创立模式(creational patterns)构造模式(structural patterns)行为模式(behavioral patterns)并发模式(concurrency patterns)代理模式属于其中的构造模式。 代理说到代理,咱们能够将其对应到一个很生活化的词汇——中介,比方房产中介、留学中介等等一些中介机构,就是本来要间接建设关系的单方a和b之间多了一个中间人c,这个c就是代理;甚至咱们能够就从字面上了解,代理作为动词是代为解决,作为名词就是代为解决的机构;代理能够为a解决事件,也能够为b解决事件。 当咱们的代码中减少了具备代理性能的角色,就能够认为其利用了代理模式。比方ES6中新增的Proxy。 // 假如存在一个对象alet a = { name: '鸡蛋'}// 然而我不心愿代码里的其余局部对a间接进行拜访// 此时咱们就能够创立一个a的代理,来解决其余内容对a的拜访let aProxy = new Proxy(a, { get: function (a, key) { return Reflect.get(a, key); } });生存情境那么什么状况下会应用到代理呢?以下列举我想到的一些生存情境: 第一个,a想要与b建设关系,然而没有渠道、分割不上,刚好c能够接触到b,c就能够替a去分割b 第二个,a想要与b分割,然而又不想b晓得本人,也能够应用代理c代替本人与b分割 第三个,a想要去b国留学,然而除了提交申请,对其余的流程不甚了解,就能够通过中介机构c提交申请并解决其余事宜 第四个,b作为一个重要资源,a不能轻易拜访,须要通过b的代理c来校验a的身份和权限,通过验证后c能够将资源b中合乎a权限范畴的内容展现给a 总结一下,代理在上述情境中起到的作用大抵是: 建设渠道爱护信息解决额定事项解决的问题当初咱们来看wiki中形容的代理模式所解决的问题: What problems can the Proxy design pattern solve?The access to an object should be controlled.Additional functionality should be provided when accessing an object.When accessing sensitive objects, for example, it should be possible to check that clients have the needed access rights. ...

August 31, 2023 · 2 min · jiezi

关于编程:什么是计算机编程领域的乐观锁和悲观锁

乐观锁和乐观锁是计算机编程畛域中用于解决并发拜访数据的两种不同策略。它们的次要指标是在多个线程或过程同时访问共享数据时,保证数据的一致性和完整性,避免出现竞态条件(Race Condition)。在不同的情景下,抉择适合的锁策略能够进步程序的性能和可靠性。 1. 乐观锁(Pessimistic Locking):乐观锁假设在操作数据时,会产生竞态条件,因而默认状况下将数据锁定,避免其余线程或过程同时批改数据。这种策略认为并发抵触是常态,因而在数据拜访时会加上锁,以确保每次只有一个线程能够拜访数据,从而防止并发问题。 示例:假如有一个银行账户,多个用户能够同时拜访并进行取款操作。应用乐观锁,当一个用户开始取款时,零碎会将账户数据加锁,直到该用户实现取款操作。其余用户必须期待锁开释,能力进行操作。 在数据库中,乐观锁能够应用SELECT ... FOR UPDATE语句来实现。当一个事务执行该语句时,它会锁定选定的行,直到事务实现。 2. 乐观锁(Optimistic Locking):乐观锁的思维是,大多数状况下,数据的并发抵触是很少产生的,因而不采取过多的锁定,而是在更新数据之前先进行一次查看,确认数据是否被其余线程批改过。如果没有被批改,就进行更新操作,否则,从新尝试或者进行抵触解决。 示例:思考一个在线购物网站,多个用户能够同时购买同一商品。应用乐观锁,每个商品记录会有一个版本号。当用户要购买商品时,零碎会读取商品的版本号,而后用户提交订单时,零碎会再次查看版本号,如果版本号统一,就执行购买操作,而后将版本号递增;如果版本号不统一,意味着在用户浏览商品和购买之间有其余用户批改了数据,那么零碎会提醒用户从新确认购买操作。 在数据库中,乐观锁能够通过增加一个版本号字段来实现。在更新数据时,查看以后版本号是否与预期版本号匹配,如果匹配则执行更新,否则示意数据已被批改。 抉择适合的锁策略:抉择乐观锁还是乐观锁取决于具体的利用场景和并发拜访模式。 乐观锁实用于:并发抵触十分频繁,数据批改操作简单,竞争较强烈的状况。然而,乐观锁可能导致系统性能降落,因为它会频繁地阻塞期待锁。乐观锁实用于:并发抵触绝对较少,大部分状况下数据是平安的,只有极少数状况下才会呈现竞态条件的状况。乐观锁不会引入太多的锁开销,但须要在抵触解决方面思考更多的逻辑。在理论利用中,能够依据业务需要和性能要求抉择适合的锁策略,甚至能够在同一个零碎中同时应用乐观锁和乐观锁,针对不同的数据进行不同的解决。 总结:乐观锁和乐观锁是解决并发拜访数据的两种次要策略。乐观锁假如并发抵触是常态,会在数据拜访时加锁,以防止竞态条件。乐观锁则假如并发抵触较少,先进行操作并在更新前检查数据是否被批改过。在理论利用中,依据并发拜访模式和性能需求,抉择适合的锁策略是确保数据一致性和程序可靠性的要害。

August 16, 2023 · 1 min · jiezi

关于编程:编程中最难的就是命名这几招教你快速上手

你可不能像给狗狗取名字那样给类、办法、变量命名。仅仅因为它很可恶或者听下来不错。 在写代码的时候,你要常常想着,那个最终保护你代码的人可能将是一个有暴力偏向的疯子,并且他还晓得你住在哪里。 01 为什么命名很重要?在我的项目中,从我的项目的创立到办法的实现,每一步都以命名为终点,咱们须要给变量、办法、参数、类命名,这些名字呈现在代码的每个角落,随处可见,凌乱或谬误的命名不仅让咱们对代码难以了解,更蹩脚的是,会误导咱们的思维,导致对代码的了解齐全谬误。如果整个我的项目始终贯通着好的命名,就能给阅读者一个神清气爽的开始,也能给阅读者一个好的指引。 要晓得,代码的浏览次数远远多于编写的次数。请确保你所取的名字更侧重于浏览不便而不是编写不便。 02 为什么很难正确命名?有人称编程中最难的事件就是命名。我同样深认为然,中国有句古话叫做万事开头难。抛开环境搭建,真正到了编码阶段第一件事就是命名,而最常见的一种状况,就是毫无目标、仅凭集体的爱好的去决定了一个名字。但因为没有想分明指标和具体实施步骤,所以进行过程中往往会面临无数次的小重构甚至是推倒重来。 1、不足志愿胆怯在抉择名字上花工夫,对做好命名的志愿有余,得心应手,甚至忽视团队对命名的根本标准,感觉编译器能编译通过,代码能失常运行就成。 其实对发现的命名问题进行重构和推倒重来并不可怕,最可怕的是当下程序员不具备发现问题后肯回过头来纠偏的志愿。这终将演变成为一场劫难。 2、不足思考没想分明被命名的事物是什么,事物应该承当什么职责,是否会对其他人造成误会。 老手程序员总会花很多工夫学习一门编程语言、代码语法、技术和工具。他们感觉如果把握了这些货色,就能成为一个好程序员。然而事实并不是这样,事实上,编程不仅仅关乎把握技能和工具,更重要的是在特定领域内解决问题的能力,还有和其余程序员单干的能力。因而,能在代码中精确的表白本人的想法就变得异样重要,代码中最直观的表达方式是命名,其次是正文。 3、不足技巧选一个好的名字真很难,你可能得有较高的形容能力和独特的文化背景。并且通晓一些常见且应该防止的命名问题。 如果最终还是没法找到适合的名字,还请增加精确的正文辅助别人了解,等想到适合的名字后再进行替换,不过往往可能通过正文(母语)形容分明的事物,命名应该问题不大,问题大的是连正文都无奈精确表白,那阐明可能以后类、函数、变量承当的职责太多太杂。 03 如何正确的命名?这里不探讨具体语言的命名规定,起因是不同编程语言命名规定各不相同,甚至不同团队间雷同语言的命名规定也有出入。这里次要从进步可读性登程,联合我所在的客户端团队日常开发状况,以Java作为演示语言,给一些对于命名的倡议。 1、货真价实无论是变量、办法、或者类,在看到他名称的时候应该以及回答了所有的大问题,它应该通知你,它为什么会存在,他做什么事,应该怎么做。如果在看到名称时,还须要去查找正文来确认本人的了解,那就不算货真价实。而且在发现有更好的命名时,记得果决替换。 Case1:到底怎么算End? 代码示例: public interface OnRequestListener {/** * 申请完结 只有胜利点才认为是真正的完结 * @param ... */void onRequestEnd(....);/** * 申请开始 * @param ... */void onRequestStart(...);}大脑流动: onRequestEnd是申请的什么阶段?申请胜利和失败任一状况都算 “end”吗?喔,原来正文有写:“只有胜利点才认为是真正的完结”。 批改倡议: // 省略正文public interface OnRequestListener { void onStart(....); void onSuccess(....); void onFailure(...);}2、防止误导在每种语言中都有内置的标识符,他们都有特定的含意,如果和他们没有关联就不要在命名中加上他们。 2.1 防止应用令人误会的名字Case1:命错名的汇合 代码示例: private List<SectionModel> dataSet;大脑流动: “dataSet” 在最后肯定是为了元素去重抉择了Set类型,必定起初某一个历史时刻发现有bug被偷偷改成了List类型,然而变量名没变。 代码跟读: 跟踪提交记录,呃,在18年被刚定义时就是 List<*> dataSet; 批改倡议: private List<SectionModel> dataList;或者private List<SectionModel> sections;Case2:不是View的View类 ...

May 5, 2023 · 3 min · jiezi

关于编程:面向状态机编程复杂业务逻辑应对之道

作者:京东批发 樊思国 一、背景在研发我的项目中,常常能遇到简单的状态流转类的业务场景,比方游戏编程中NPC的跳跃、后退、转向等状态变动,电商畛域订单的状态变动等。这类状况其实能够有一种优雅的实现办法:状态机。如下图,是操作系统对过程调度的状态机: 图 操作系统过程调度状态机 二、实现形式面对以上场景,通常状况下的实现有以下几种,上面别离比拟它们适用范围和优缺点: 2.1 if/else长处:实现简略、直观。 毛病:状态多了代码可读性,业务与状态判断深度耦合,保护和扩大艰难。 2.2 状态模式状态模式类图及应用形式如下: public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(); StartState startState = new StartState(); startState.doAction(context); System.out.println(context.getState().toString()); StopState stopState = new StopState(); stopState.doAction(context); System.out.println(context.getState().toString()); }}长处:状态独自实现,可读性比if/else好。 毛病:扩大状态需减少状态类,状态多了会呈现很多状态类;并没有齐全实现状态与业务解耦,不利于保护和理解整个零碎状态全貌。 2.3 无限状态机长处:谨严的数学模型,状态转移和业务逻辑基于事件齐全解耦,能看到整个零碎状态全貌便于保护和扩大。 毛病:需引入状态机实现形式,具备肯定了解老本。 三、无限状态机3.1 定义无限状态机(英语:finite-state machine,缩写:FSM)又称无限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是示意无限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。 3.2 要害概念状态State:个别在状态转移图中用圆圈示意。事件Event:示意从一种状态迁徙到另一种状态的触发机制。对应状态转换图中的箭头局部。动作Action: 示意状态转换后,执行的动作,但不是必须的,也能够状态转换后不执行任何动作。转移Transition:示意状态转换,从原始状态迁徙到目标状态的一个过程。条件Guard:示意产生状态转移需满足的条件。3.3 技术选型在Java我的项目中,比拟罕用的有Spring Statemachine和Squirrel-foundation。 框架长处毛病Spring Statemachine基于Spring生态,社区弱小。性能齐备,反对多种状态机配置和长久化形式。较为重量级,额定性能多。单例模式状态机不保障线程平安,只能通过工厂模式创立新的状态机实例实现,对性能有肯定影响。Squirrel-foundation轻量级实现,状态机的创立开销小。便于二次革新,实现定制业务。社区没有spring沉闷。非凡约定较多。综上,在上面的我的项目中,因为团队应用SpringBoot作为开发框架,并且我的项目不波及高并发场景,故抉择Spring Statemachine。 四、我的项目实战在事实我的项目中,碰到多种状态转换的简单业务流程,能够通过以下几个步骤进行分级,逐渐将产品需要清晰的实现进去: 4.1 需要背景批发采销在保护SKU物流属性(长、宽、高和分量)时,会因为和物流仓库侧理论属性存在不统一的状况,导致带来物流老本的偏差。为解决这个问题,需设计一个零碎供采销通过操作SKU的形式,将属性下发给物流侧审核,失去最终的精确物流属性。在对SKU进行审核操作的过程中,别离存在未操作、工作下发中、下发失败、已审核、自行分割供应商和挂起6种状态(状态转换详见4.2),思考到这些状态转换的条件散布在不同的场景下,处于对可维护性和扩展性的思考,采纳状态机实现该需要。 4.2 状态转换图通过梳理状态转换关系,画出状态转换图如下: SKU属性审核状态转换图 4.3 配置状态机4.3.1 定义状态枚举public enum SkuStateEnum { /** * 未操作 */ INIT(0, "未操作"), /** * 工作下发中 */ TASK_DELIVERY(1, "工作下发中"), /** * 下发失败 */ DELIVERY_FAIL(2, "下发失败"), /** * 复核中 */ RECHECKING(3, "复核中"), /** * 已复核 */ RECHECKED(4, "已复核"), /** * 自行分割供应商 */ CONCAT_SUPPLIER(5, "自行分割供应商"), /** * 挂起 */ SUSPEND(6, "挂起"); /** * 状态代码 */ private Integer state; /** * 形容信息 */ private String desc; SkuStateEnum(Integer state, String desc) { this.state = state; this.desc = desc; } public static SkuStateEnum getByState(Integer state) { for (SkuStateEnum skuStateEnum : SkuStateEnum.values()) { if (skuStateEnum.getState().equals(state)) { return skuStateEnum; } } return null; } public Integer getState() { return state; } public String getDesc() { return desc; }}4.3.2 定义事件枚举public enum SkuAttrEventEnum { /** * 调用OMC属性采集接口胜利 */ INVOKE_OMC_ATTR_COLLECT_API_SUCCESS, /** * 调用OMC属性采集接口失败 */ INVOKE_OMC_ATTR_COLLECT_API_FAIL, /** * 调用OMC下发查问接口并曾经生成采集单 */ INVOKE_OMC_SKU_DELIVERY_API_GATHER_FINISH, /** * 调用OMC下发查问接口失败 */ INVOKE_OMC_SKU_DELIVERY_API_FAIL, /** * OMC的MQ返回SKU属性已变更 */ MQ_OMC_SKU_ATTR_CHANGED, /** * 调用商品中台jsf接口,返回SKU属性已变更 */ INVOKE_SKU_ATTR_API_CHANGED, /** * 京东有库存 */ HAS_JD_STOCK, /** * 京东无库存,VMI有库存 */ NO_JD_STOCK_HAS_VMI_STOCK, /** * 京东和VMI均无库存 */ NO_JD_STOCK_NO_VMI_STOCK, /** * 上传并复核 */ UPLOAD_AND_RECHECK;}4.3.3 配置状态机@Configuration@EnableStateMachineFactory@Slf4jpublic class SkuAttrStateMachineConfig extends StateMachineConfigurerAdapter<SkuStateEnum, SkuAttrEventEnum> { /** * 配置状态 * * @param states * @throws Exception */ @Override public void configure(StateMachineStateConfigurer<SkuStateEnum, SkuAttrEventEnum> states) throws Exception { states.withStates().initial(SkuStateEnum.INIT) .states(EnumSet.allOf(SkuStateEnum.class)); } @Override public void configure(StateMachineConfigurationConfigurer<SkuStateEnum, SkuAttrEventEnum> config) throws Exception { config.withConfiguration().listener(listener()).autoStartup(false); } /** * 配置状态转换和事件的关系 * * @param transitions * @throws Exception */ @Override public void configure(StateMachineTransitionConfigurer<SkuStateEnum, SkuAttrEventEnum> transitions) throws Exception { transitions.withExternal().source(SkuStateEnum.INIT).target(SkuStateEnum.TASK_DELIVERY) .event(SkuAttrEventEnum.INVOKE_OMC_ATTR_COLLECT_API_SUCCESS) .action(ctx -> { log.info("[调用OMC属性采集接口胜利],状态变更:{} -> {}.", SkuStateEnum.INIT.getDesc(), SkuStateEnum.TASK_DELIVERY.getDesc()); }) .and() .withExternal().source(SkuStateEnum.INIT).target(SkuStateEnum.DELIVERY_FAIL) .event(SkuAttrEventEnum.INVOKE_OMC_ATTR_COLLECT_API_FAIL) .action(ctx -> { log.info("[调用OMC属性采集接口失败],状态变更:{} -> {}.", SkuStateEnum.INIT.getDesc(), SkuStateEnum.DELIVERY_FAIL.getDesc()); }) .and() .withExternal().source(SkuStateEnum.INIT).target(SkuStateEnum.CONCAT_SUPPLIER) .event(SkuAttrEventEnum.NO_JD_STOCK_HAS_VMI_STOCK) .action(ctx -> { log.info("[京东无库存,VMI有库存],状态变更:{} -> {}.", SkuStateEnum.INIT.getDesc(), SkuStateEnum.CONCAT_SUPPLIER.getDesc()); }) .and() .withExternal().source(SkuStateEnum.INIT).target(SkuStateEnum.SUSPEND) .event(SkuAttrEventEnum.NO_JD_STOCK_NO_VMI_STOCK) .action(ctx -> { log.info("[京东和VMI均无库存],状态变更:{} -> {}.", SkuStateEnum.INIT.getDesc(), SkuStateEnum.SUSPEND.getDesc()); }) .and() .withExternal().source(SkuStateEnum.SUSPEND).target(SkuStateEnum.TASK_DELIVERY) .event(SkuAttrEventEnum.HAS_JD_STOCK) .action(ctx -> { log.info("[京东有库存],状态变更:{} -> {}.", SkuStateEnum.SUSPEND.getDesc(), SkuStateEnum.TASK_DELIVERY.getDesc()); }) .and() .withExternal().source(SkuStateEnum.SUSPEND).target(SkuStateEnum.RECHECKING) .event(SkuAttrEventEnum.INVOKE_OMC_ATTR_COLLECT_API_SUCCESS) .action(ctx -> { log.info("[调用OMC属性采集接口胜利],状态变更:{} -> {}.", SkuStateEnum.SUSPEND.getDesc(), SkuStateEnum.RECHECKING.getDesc()); }) .and() .withExternal().source(SkuStateEnum.SUSPEND).target(SkuStateEnum.CONCAT_SUPPLIER) .event(SkuAttrEventEnum.NO_JD_STOCK_HAS_VMI_STOCK) .action(ctx -> { log.info("[京东无库存,VMI有库存]:{} -> {}.", SkuStateEnum.SUSPEND.getDesc(), SkuStateEnum.CONCAT_SUPPLIER.getDesc()); }) .and() .withExternal().source(SkuStateEnum.TASK_DELIVERY).target(SkuStateEnum.RECHECKING) .event(SkuAttrEventEnum.INVOKE_OMC_SKU_DELIVERY_API_GATHER_FINISH) .action(ctx -> { log.info("[调用OMC下发查问接口并曾经生成采集单]:{} -> {}.", SkuStateEnum.TASK_DELIVERY.getDesc(), SkuStateEnum.RECHECKING.getDesc()); }) .and() .withExternal().source(SkuStateEnum.TASK_DELIVERY).target(SkuStateEnum.RECHECKED) .event(SkuAttrEventEnum.MQ_OMC_SKU_ATTR_CHANGED) .action(ctx -> { log.info("[OMC的MQ返回SKU属性已变更]:{} -> {}.", SkuStateEnum.TASK_DELIVERY.getDesc(), SkuStateEnum.RECHECKED.getDesc()); }) .and() .withExternal().source(SkuStateEnum.DELIVERY_FAIL).target(SkuStateEnum.TASK_DELIVERY) .event(SkuAttrEventEnum.INVOKE_OMC_ATTR_COLLECT_API_SUCCESS) .action(ctx -> { log.info("[调用OMC属性采集接口胜利]:{} -> {}.", SkuStateEnum.DELIVERY_FAIL.getDesc(), SkuStateEnum.TASK_DELIVERY.getDesc()); }) .and() .withExternal().source(SkuStateEnum.CONCAT_SUPPLIER).target(SkuStateEnum.RECHECKED) .event(SkuAttrEventEnum.INVOKE_SKU_ATTR_API_CHANGED) .action(ctx -> { log.info("[调用商品中台jsf接口,返回SKU属性已变更]:{} -> {}.", SkuStateEnum.CONCAT_SUPPLIER.getDesc(), SkuStateEnum.RECHECKED.getDesc()); }); } /** * 全局监听器 * * @return */ private StateMachineListener<SkuStateEnum, SkuAttrEventEnum> listener() { return new StateMachineListenerAdapter<SkuStateEnum, SkuAttrEventEnum>() { @Override public void transition(Transition<SkuStateEnum, SkuAttrEventEnum> transition) { //当状态的转移在configure办法配置中时,会走到该办法。 log.info("[{}]状态变更:{} -> {}", transition.getKind().name(), transition.getSource() == null ? "NULL" : ofNullableState(transition.getSource().getId()), transition.getTarget() == null ? "NULL" : ofNullableState(transition.getTarget().getId())); } @Override public void eventNotAccepted(Message<SkuAttrEventEnum> event) { //当产生的状态转移不在configure办法配置中时,会走到该办法,此处打印error日志,不便排查状态转移问题 log.error("事件未收到: {}", event); } private Object ofNullableState(SkuStateEnum s) { return Optional.ofNullable(s) .map(SkuStateEnum::getDesc) .orElse(null); } }; }}4.4 业务逻辑解决4.4.1 构建状态机对每个sku的操作,通过状态机工厂stateMachineFactory.getStateMachine ...

March 10, 2023 · 4 min · jiezi

关于编程:Kitten-动态绘制-Y-轴方向立方体的实现方法

咱们之前的实际里,曾经探讨了在程度方向动静绘制立方体的积木搭建办法,如下图所示: 接下来咱们冀望在 Y 轴方向也绘制立方体,如下图所示。 其实只须要在程度方向顺次绘制两列立方体就能够了。这两列立方体的初始顶点,我曾经用彩色高亮了。 首先我有一个绘制立方体的函数,这个函数里绘制两个正方形,别离是正方体面对咱们那个面和背对咱们的面,而后绘制四个斜面。 这个函数的调用前提,是 x 方向动静立方体的 x 坐标曾经设定好。这个坐标每绘制一个立方体之后,就会在循环里递增,步长是正方体棱长。 x 方向动静立方体的 x 坐标,初始值为 X 方向立方体顶点 X 坐标,这个坐标是在循环体内部计算的,公式如下。 在 Y 方向绘制一排新的立方体,要害是要找到第一个立方体的起始顶点的 X 和 Y 坐标。 我每次动静绘制 X 方向的立方体时,都会将计算好的第一个立方体的顶点,存储到变量终点X 和终点 Y 里,以备后续应用。 [外链图片转存失败,源站可能有防盗链机制,倡议将图片保留下来间接上传(img-3Rx4NW59-1675827193236)(null)] 这样,在绘制 Y 方向立方体时,我从新回到终点 X 和 Y,而后调整旋转角度,挪动到斜边的另一个顶点,此时这个顶点的 X 和 Y 坐标,就是新的一排待绘制的立方体的初始X 和 Y 坐标。 换言之,调用从左到右绘制全副立方体函数之前,必须保障终点的 X 和 Y 坐标被胜利计算出来才行,后者又依赖变量终点 X 和 Y。

February 18, 2023 · 1 min · jiezi

关于编程:这个让全网眼红的红利行业还需要人才吗

随着挪动互联网时代的发疾速倒退,互联网各行业越来越宏大,倒退速度也越快,人才需求也越来越多,每年都在一直新增。在这个IT行业,许多人都能够精确地找到适宜本人的岗位,然而依然有人还是很迷茫,不晓得本人适不适宜这个行业,所以很胆怯,始终裹足不前。其实,还真不必放心。因为,互联网IT行业从业者薪资比你设想得高!大家可能不晓得的是,互联网IT行业薪资高,次要也是源于以下两个方面。1、程序员自带门槛较高光环人须要成就感来撑持本人后退,刚学的时候一头雾水很容易让人放弃,所以干这一行的人绝对其余行业少的起因多半来自-感觉门槛太高。2、市场需求存在微小的缺口每个行业的需要和薪资基本上都是由市场决定的,所以要去剖析需要与供应。1)供应:程序员并不多,据说中国也只有200万会写程序的人(占人口0.14%),相当少,想想咱们的街坊——印度,总共有270万程序员,也只占人口0.2%的样子,美国的Tech行业(包含IT在)工作人员达到700万,占人口的2%以上。不过拿整个行业来比照不失当,因为高科技行业其中只有一小部分人是搞程序的,美国业余从事软件程序的人口呢,如同只有102万(依据2010年的人口普查),占人口的0.3%。另外,在美国的职业排行中,程序员在所有职业当中人口数量排行第三十,还少于:律师职业,104万;金融资产治理,110万;大学老师,130万。如果感觉金融和律师工资高很正当,那程序员工资高也是正当的。话说,软件行业还具体分类,分各种语言各种平台各种特殊要求,编程语言的话;相熟Java到业余水平的程序员只有其中30%;Python预计20%;C不到10%;像Golang之类的小众语言,1%都没有。其它行业没这么麻烦,一个职位总是有很多人都能胜任的。抉择多了,公司就有条件把工资压低之类的。然而在程序招聘方面,谈工资的权力在程序员手里,因为对方没有抉择。程序员原本那么罕见,非常适合要求的程序员更是罕见之罕见,不能错过。2)需要:支出高的程序员个别要么波及互联网,要么波及一些大规模应用的软件。这是因为,软件和互联网服务的边际老本简直为零,边际老本,就是每多生产一单位产品所产生的老本,它包含生产所需的人工、物料等等。与之对应的老本,叫做固定成本,也就是无论你要生产多少单位的产品都得要领取的老本,这包含研发、营销等等。软件和互联网服务每多服务一个人,个别也就是多一点电费和网费,老本简直没有,扩张能够十分迅猛,这意味着简直所有收益都能够摊到研发(程序员)和管理人员身上,因而这些行业的薪水下限人造地要高于个别制造业。像whatsapp这样几十个人就服务几亿人,在传统行业是不可设想的。传统行业,比方格力,在生产中要领取大量的生产成本、物流老本、销售老本,即使销售收入远超互联网大多数企业,但也不可能让大多数员工的工资高起来。与此同时,程序员的数量绝对于需要,却也远远不够。之前就有“守业万事俱备只差一个程序员了”这种笑话,但其实也是反映了现实情况:程序员的供应显著小于需要。两个条件叠加在一起,就造成,程序员这个群体的工资绝对比拟高。互联网公司需要哪些人才?整个互联网行业是建设在计算机技术开发的根底之上,因而该行业对于技术类人才的需要占了45%左右。足以见得,技术人才需量占比多大。学一门需求量大的技术,在找工作的时候,机会多,并且这个行业的薪资程度也是高得引人注目的。哪一类职业更热门依据职位从凋谢到敞开时所经验的均匀天数来掂量各个职位的难易招水平,进行剖析哪类职业更热门。从下面这张图中的数据能够看出,IT行业目前曾经占据了35%的市场,能够说十分的宽泛,需要十分的大,每年的IT人才需求能够达到2000万人数。这个数字,听到了是不是很诧异,这么一个微小的群体,所以,不要胆怯本人学完之后找不到工作,要有自信,才会胜利。说完这个行业的占比之后,咱们再来看看行业内技术要求的占比需要。次要的高需要岗位包含前端/交互/美工,后盾开发,算法工程师,挪动端开发,产品经理,云计算/大数据等等。接下来咱们看看先这个图的数据再剖析。看到这里,就很显著了,后盾开发工程师占比在33%,而算法、前端、交互等设计岗位,目前来看,还是市场需求比拟大,需要比拟多的,当然其余的重要性,还有位置都是不可动摇的,都是必不可少的,各有劣势吧。而后最重要的就是薪资问题了,这必定也是你们最关怀、最在意的一个问题,本人致力工作都是为了一份高薪资的报酬,为了解决饥寒,生存所需和其余开销,这些都是必要的。这里,给大家分享一组待业数据,千锋深圳7月份学员待业榜(局部),从待业方面大家也能看出目前开发工程师这个行业整体来说不论是发展前景还是薪资待遇都是比拟不错的,值得大家尝试。在将来的趋势,程序员的薪资应该会更高,互联网行业的占比会越来越多。加油吧,敌人们,还在默默的拿着低工资的,你们该暴发你们的小宇宙去超过本人了!

August 23, 2022 · 1 min · jiezi

关于编程:Datenlord-垃圾回收机制与无锁化编程

垃圾回收机制(GC)对大部分开发者来说应该不生疏,特地是Java开发者或多或少都跟GC打过交道。 GC的长处是实现对堆上调配的内存动静回收,防止内存透露。然而GC的毛病是对性能有肯定影响,特地是stop the world问题, 而且GC什么时候回收内存是不确定的,开发者无奈通晓。 在无锁化编程场景下,用Java这种有GC的语言,肯定水平简化了对内存的治理,升高了无锁化编程的难度。 无锁化编程,顾名思义,就是不必锁。无锁化编程特指在多线程编程的时候,对线程间共享数据的并发批改不应用锁, 而采纳基于硬件提供的原子操作能力来批改共享数据,进而晋升性能,缩小应用锁带来的互斥开销。 最罕用的硬件提供的原子操作是Compare and Swap(简称CAS),编程语言基于硬件提供的原子操作能力封装出CAS库函数调用。 先看下C++里的CAS函数调用: bool __sync_bool_compare_and_swap( type *ptr, type oldval, type newval, ...);type __sync_val_compare_and_swap( type *ptr, type oldval, type newval, ...);这两个函数的性能一样,只是返回值不同。为了简化形容,略去了一些细节 (这个细节是对于内存程序,即程序指令在执行时的程序问题,这个问题是无锁化编程是否正确实现的关键问题之一,前面我再专门具体介绍)。 第一个CAS函数比拟指针ptr指向的变量,看是不是等于oldval,如果相等就把ptr指向的变量改为newval,并返回true,否则不做任何扭转并返回false。 第二个CAS函数也是比拟ptr指向的变量是否等于oldval,如果相等就把该变量改为newval,并返回oldval,如果不等就不做扭转,并返回ptr指向变量的以后值。 C++的CAS函数调用能够保障对ptr指向的变量的批改是原子的,要么更改实现,要么不做更改。 再看下硬件提供的原子操作。比方X86架构提供了一条CAS指令cmpxchg,这条指令在执行时是由硬件保障原子性,不会被打断。 其余硬件架构,比方ARM、PowerPC也提供相似的CAS原子操作,然而和X86的实现机制不一样,这里先不开展。 编程语言的编译器在X86架构下编译时,会负责把CAS库函数调用编译成基于cmpxchg的机器代码。 比方C++的编译器GCC在编译时如果碰到下面两个CAS函数调用,会生成蕴含cmpxchg指令的指标码。 无锁化编程示例:无锁化堆栈(Lock-Free Stack)的Java实现先来看个简略的无锁化编程的例子,一个无锁化堆栈的Java实现(从网上找了一段现成的代码,没通过编译验证,仅做示例): import java.util.concurrent.atomic.*;import net.jcip.annotations.*;/*** ConcurrentStack** @author Brian Goetz and Tim Peierls*/@ThreadSafepublic class ConcurrentStack <E> { AtomicReference<Node<E>> top = new AtomicReference<Node<E>>(); // 栈顶 public void push( E item ) { Node<E> newNode = new Node<E>( item ); Node<E> curTop; do { curTop = top.get(); newNode.next = curTop; // CAS调用批改栈顶 } while ( !top.compareAndSet( curTop, newNode ) ); } public E pop() { Node<E> curTop; Node<E> newTop; do { curTop = top.get(); if ( curTop == null ) { return null; // 堆栈为空 } newTop = curTop.next; // CAS调用批改栈顶 } while ( !top.compareAndSet( curTop, newTop ) ); return curTop.item; } private static class Node <E> { public final E item; public Node<E> next; public Node( E item ) { this.item = item; } }}从代码能够看出,这个栈的实现齐全没有用锁,栈顶top是以后堆栈顶端节点的原子援用AtomicReference, 每次出栈(pop)入栈(push)的时候,调用AtomicReference的compareAndSet办法来试图批改栈顶top。 因为有可能有多个线程竞争拜访这个无锁化堆栈,即有可能有多个线程同时对栈顶进行批改,或同时pop、或同时push,或同时pop和push, CAS的原子性保障了多个线程并发调用compareAndSet办法批改栈顶top时,仅有一个线程的调用能批改胜利,其余线程的调用不胜利, 所以pop和push操作里要用循环的形式反复调用compareAndSet办法试图批改栈顶top,直到胜利返回。 ...

July 21, 2022 · 2 min · jiezi

关于编程:如何更加有效的学习一门编程语言

学编程语言跟学习其余常识其实没有实质的区别,都须要把握根底,循序渐进,造成体系,学以致用,然而具体要联合本人的理论特点来总结。 学习编程,要边学边用计算机作为应用型学科,要把学习常识跟动手做我的项目联合起来,学以致用,不仅学得快还能够激发学习的趣味。比方, 学完数据结构和算法后,能够做一些算法编程题;学Java语言的时候,能够做个简略版的贪吃蛇小游戏;学python语言的时候,能够做一些有意思的爬虫或者数据统计;这样边学边用,在大量练习的根底上,可能加深对于原理的了解,实现从学过到学会。 学习编程,要有办法学习任何常识都要循序渐进,从简略到简单,程序颠倒了,会重大打击学习趣味。比方,体现在书籍的抉择上: 有些经典书籍,实际上是十分有难度的,可能须要很多基础知识的铺垫,上来就啃,效率必然很低;有些书籍适宜作为词典用,须要的时候翻出来,找到对应的知识点看一看就好,不必深刻;有些书籍适宜在后面看,有些书籍适宜在前面看,程序错了,就走火入魔了...有些人可能更喜爱看书,有些人可能觉着看视频更能看得懂,因人而异,要学会找到最适宜本人的学习形式。 学习编程,要有体系只学习一门编程语言的话,用途都很无限,都必须要配合相干的常识,能力在理论的利用中发挥作用。 每一部分的常识,存在于不同的书外面,很容易割裂开来,只有脑子外面造成了体系,有了这样的一张图,这些常识能力被你死记硬背,真正的把握。 示例 综上,学习一门编程语言跟咱们中学学习的学科一样,都是须要一些办法技巧,须要大量练习,须要学以致用。 对于飞援飞援是一个新兴的程序员接单平台。平台会居中主导匹配甲方需要和适合的开发者,不必本人在甲方背后和其余程序员竞标PK。所以如果工作品质比较稳定,并且工夫也比拟拮据,继续单干会源源不断的有单子。

April 28, 2022 · 1 min · jiezi

关于编程:领域驱动编程代码怎么写

简介:畛域驱动开发最重要的当然是正确地进行畛域拆解,这个拆解工作能够在实践的领导下,联合设计者对业务的深入分析和充沛了解进行。本文假设开发前曾经进行了畛域划分,侧重于钻研编码阶段具体如何实际能力体现畛域驱动的劣势。 作者 | 昌夜 前言相较于大家纯熟应用的 MVC 分层架构,畛域驱动设计更实用于简单业务零碎和须要继续迭代的软件系统的架构模型。对于畛域驱动设计的概念及劣势,能够参考的文献十分多,大多数的同学都看过相干的书籍,所以本文不探讨畛域驱动概念层面的货色,而是试图从编程实际的层面,对畛域驱动开发做一些简略的介绍。 退出阿里衰弱之后,我所在的团队也在踊跃推动畛域驱动设计的利用,相干同学也曾给出优良的脚手架代码,但目前看起来落地状况并不太现实,集体浅见,造成这种后果次要有四个起因。 大家更相熟 MVC 的编程模式,须要疾速实现某个性能的时候,往往偏向于应用较为稳当、相熟的形式。大家对畛域驱动编程应该怎么编写并没有一个对立的认知(Axon Framework[1] 对畛域驱动设计实现的十分好,但它太“重”了)。DDD 落地自身就比拟难,往往须要事件驱动和 Event Store 来完满实现,而这二者是咱们不罕用的。畛域驱动设计是面向简单零碎的,业务倒退初期看上去都比较简单,一上来就搞畛域驱动设计有适度设计之嫌。这也是畛域驱动设计经常在零碎不得不重构的是时候才被拿进去探讨的起因。笔者曾在研发过程中钻研、实际过畛域驱动编程,对畛域驱动框架 Axon Framework 也做了深刻的理解,(兴许是因为业务场景绝对简略)过后落地成果还不错。抛却架构师的视角,从一线研发同学的角度来看,基于畛域驱动编程的外围劣势在于: 施行面向对象的编程模式,进而实现高内聚、低耦合。在简单业务零碎的迭代过程中,保障代码构造不会无限度地变得凌乱,因而保证系统可继续保护。畛域驱动开发最重要的当然是正确地进行畛域拆解,这个拆解工作能够在实践的领导下,联合设计者对业务的深入分析和充沛了解进行。本文假设开发前曾经进行了畛域划分,侧重于钻研编码阶段具体如何实际能力体现畛域驱动的劣势。 保险畛域常识简介以保险业务为例来进行编程实际,一个高度形象的保险畛域划分如图所示。通过用例剖析,咱们把整个业务划分成产品域、承保、核保、理赔等多个畛域(Bounded-Context),每个畛域又能够依据业务倒退状况拆分子域。当然,齐备保险业务要比图中展示的简单太多,这里咱们不作为业务知识介绍的篇章,只是为了不便后续的代码实际。 畛域驱动开发的代码构造1、畛域驱动的代码分层能够应用不同的 Java 我的项目公布不同的微服务对畛域进行隔离,也能够在同一个 Java 我的项目中,应用不同 module 进行畛域隔离。这里咱们应用 module 进行畛域隔离的实现。然而无论采纳何种形式进行畛域隔离,畛域之间的交互只能应用对方的二方包或者 API 层提供的 HTTP 服务,而不能间接引入其余畛域的其余服务。 在每个畛域外部,绝对于 MVC 对利用三层架构的拆分,畛域驱动的设计将利用模块外部分为如图示的四层。 用户接口层 负责间接面向内部用户或者零碎,接管内部输出,并返回后果,例如二方包的实现类、Spring MVC 中的 Controller、特定的数据视图转换器等通常位于该层。在代码层面经常应用的包命名能够是 interface, api, facade 等。用户接口层的入参、出参类定义采纳 POJO 格调。 用户接口层是轻的一层,不含业务逻辑。平安认证,简略的入参校验(例如应用 @Valid 注解),拜访日志记录,对立的异样解决逻辑,对立返回值封装该当在这层实现。 用户接口层所须要的性能实现是由应用层实现,这里个别不须要进行依赖倒置。编码时,该层能够间接引入应用层中定义的接口,因此该层依赖应用层。须要留神的是,尽管实践上用户接口层能够间接应用畛域层和基础设施层的能力,但这里倡议大家在对这种用法熟练掌握前,最好采纳严格的分层架构,即以后层只依赖其下方相邻的一层。 应用层 应用层具体实现接口层中须要性能,但该层并不实现真正的业务规定,而是依据理论的 use case 来协调调用畛域层提供的能力。音讯发送、事件监听、事务管制等倡议在这一层实现。在代码层面经常应用的包命名能够是 application, service, manager 等。它用来取代 Spring MVC 中 service 层,并把业务逻辑转移到畛域层。 ...

April 20, 2022 · 3 min · jiezi

关于编程:小波从此逝江海寄余生不但是文坛巨擘还是不世出的编程奇才王小波离世25周年

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_211 二十五年前的明天,王小波学生因病于北京去世,享年四十四周岁。青睐他的人,都晓得他是一个特立独行的人,领有虚心与骄傲并存的弱小气质,并且留下有数传世作品,无可争议的文坛巨擘,他的力量、乏味,对媚众模式解放的镇压,以及一以贯之的,看待生存无比真挚的态度都让咱们为之倾倒。 然而,鲜为人知的是,他不仅仅在文学上造诣不凡,与此同时,他还是一位不世出的编程奇才。在整个九十年代,除了和文字跳舞,王小波还将他的才华通过键盘喷涌而出,蠢才的脑细胞幻化为一行一行的代码, 龙飞凤舞,回转如意。王小波在编程畛域的惊人艺业,咱们兴许能够通过他的书信以及著述中的内容略窥一二。 1988年12月,致好友刘晓阳: 回来之前我曾往人大一分校计算机站写过一封信,问他们可要带什么软件,主管的工程师回了封信,我没收到。回来之后人家还提到此事。当初国内软件一面凌乱,又逐步有造成市场之势。首先以年兄学统计这一事实来看,回来做事非有会用的软件不可。 Macintosh 基本就没打进中国市场,你非带几个可用的IBM微机软件回来不可。至于什么机器上能使倒不用太放心。我这个狗屁计算机室,IBMPS/2就有二台。AT机也不少。SAS SPSS Statistx都有,可代表国内上等个别统计微机房的程度,可就是少了一种宜于作统计的语言。 年兄如有 APL(A Programming Language)之IBM微机本,可给我寄copy来。我在美还有一个户头,连manual复印费一并写支票给你们。Glim我也没有,如年兄有便人可捎来。邮寄太贵,能省就省吧。 Macintosh就是苹果电脑,1998年后多被简称为Mac,可见在八十年代刘晓阳就曾经用上mac电脑了,然而国内还是以IBM计算机为支流。 信中提到的 SAS,SPSS,Statistx,Glim 都是统计学软件,其中 SAS 作为商业软件到当初仍然被广泛应用。 而值得一提的是,APL (A Programming Language)是一个对二十一世纪的程序员来说不太寻常的计算机语言,APL 最驰名的就是它应用一组非ASCII符号。这些符号比个别常见的代数和计算符号要多。有人开玩笑说,用两行这样的奇形怪状的符号就能够将所有航空管制的问题解决了。事实上,在一些APL版本中,用一行代码就能够将任何可计算的函数表达出来,再用一行代码就能够将这个函数的构造表达出来。因为它的精细的构造和非标准的符号,也有人将APL称为“只写语言”。除数学家外,其他人要读APL写的程序都感到十分艰难。有些数学家感觉其它语言比APL难懂。因为APL应用不寻常的符号,许多业余程序员在写APL程序时应用专门的APL键盘。而王小波在八十年代就开始应用APL进行编程了。 1990年1月,致好友刘晓阳: 我当初正给北大社会学所做统计,手上除SPSS没有可用的软件,国内这方面很差。我当初会用FORTRAN,编统计程序不不便。闻兄谈起你们用 S语言,不知是否好用。工具书也不知好找不。不论好歹,烦兄找个拷贝给我,要就算了。照我看只有能解决各种矩阵运算就够:当然也要有各种散布函数。反正也是瞎胡混,我就算努把力,少混点吧。整个八十年代,国内普通用户很难连上互联网,所以学习语言只能看书, 信中提到的S 语言 是 1976 年由贝尔实验室设计的统计学编程语言。不过王小波提到的 S 语言可能指的是 1988 年当前的新版 S 语言。二十一世纪,在统计学畛域中被宽泛应用的 R语言 是 S 语言的后继者。 R语言递归实现斐波那契: recurse_fibonacci <- function(n) { if(n <= 1) { return(n) } else { return(recurse_fibonacci(n-1) + recurse_fibonacci(n-2)) } }1991年3月,致好友刘晓阳: 你寄来的严氏2.0A我也收到,还没用。因为一者是3盘要倒,二者我本人写的WK也有重大进展。我也自做了词组性能,是棵B树,我感觉自写的软件自用,感觉是最好的。词组用途不是很大,次要用于定义人地名等专有名词,然而严氏软件对我还是有重大启发,拼音加四声是个极好的主见,写起货色来声韵铿锵,与其他软件大不一样。自写一遍,从分页到编辑键调配,都能合乎自家习惯,不是居心狗尾续貂也。如能见到严氏,可代为致意。信中提到的严氏 2.0 应该是过后某个中文输出和解决的软件。因为在其余函件中,王小波提到的 “WK” 是对严氏的仿造,而 WK 是王小波用 C 语言实现的,用来在电脑上写小说。 ...

April 11, 2022 · 1 min · jiezi

关于编程:领域驱动编程代码怎么写

简介:相较于大家纯熟应用的 MVC 分层架构,畛域驱动设计更实用于简单业务零碎和须要继续迭代的软件系统的架构模型。对于畛域驱动设计的概念及劣势,能够参考的文献十分多,大多数的同学都看过相干的书籍,所以本文不探讨畛域驱动概念层面的货色,而是试图从编程实际的层面,对畛域驱动开发做一些简略的介绍。 作者 | 昌夜起源 | 阿里技术公众号 一 前言相较于大家纯熟应用的 MVC 分层架构,畛域驱动设计更实用于简单业务零碎和须要继续迭代的软件系统的架构模型。对于畛域驱动设计的概念及劣势,能够参考的文献十分多,大多数的同学都看过相干的书籍,所以本文不探讨畛域驱动概念层面的货色,而是试图从编程实际的层面,对畛域驱动开发做一些简略的介绍。 退出阿里衰弱之后,我所在的团队也在踊跃推动畛域驱动设计的利用,相干同学也曾给出优良的脚手架代码,但目前看起来落地状况并不太现实,集体浅见,造成这种后果次要有四个起因。 大家更相熟 MVC 的编程模式,须要疾速实现某个性能的时候,往往偏向于应用较为稳当、相熟的形式。大家对畛域驱动编程应该怎么编写并没有一个对立的认知(Axon Framework[1] 对畛域驱动设计实现的十分好,但它太“重”了)。DDD 落地自身就比拟难,往往须要事件驱动和 Event Store 来完满实现,而这二者是咱们不罕用的。畛域驱动设计是面向简单零碎的,业务倒退初期看上去都比较简单,一上来就搞畛域驱动设计有适度设计之嫌。这也是畛域驱动设计经常在零碎不得不重构的是时候才被拿进去探讨的起因。笔者曾在研发过程中钻研、实际过畛域驱动编程,对畛域驱动框架 Axon Framework 也做了深刻的理解,(兴许是因为业务场景绝对简略)过后落地成果还不错。抛却架构师的视角,从一线研发同学的角度来看,基于畛域驱动编程的外围劣势在于: 施行面向对象的编程模式,进而实现高内聚、低耦合。在简单业务零碎的迭代过程中,保障代码构造不会无限度地变得凌乱,因而保证系统可继续保护。畛域驱动开发最重要的当然是正确地进行畛域拆解,这个拆解工作能够在实践的领导下,联合设计者对业务的深入分析和充沛了解进行。本文假设开发前曾经进行了畛域划分,侧重于钻研编码阶段具体如何实际能力体现畛域驱动的劣势。 二 保险畛域常识简介以保险业务为例来进行编程实际,一个高度形象的保险畛域划分如图所示。通过用例剖析,咱们把整个业务划分成产品域、承保、核保、理赔等多个畛域(Bounded-Context),每个畛域又能够依据业务倒退状况拆分子域。当然,齐备保险业务要比图中展示的简单太多,这里咱们不作为业务知识介绍的篇章,只是为了不便后续的代码实际。 三 畛域驱动开发的代码构造1 畛域驱动的代码分层能够应用不同的 Java 我的项目公布不同的微服务对畛域进行隔离,也能够在同一个 Java 我的项目中,应用不同 module 进行畛域隔离。这里咱们应用 module 进行畛域隔离的实现。然而无论采纳何种形式进行畛域隔离,畛域之间的交互只能应用对方的二方包或者 API 层提供的 HTTP 服务,而不能间接引入其余畛域的其余服务。 在每个畛域外部,绝对于 MVC 对利用三层架构的拆分,畛域驱动的设计将利用模块外部分为如图示的四层。 用户接口层 负责间接面向内部用户或者零碎,接管内部输出,并返回后果,例如二方包的实现类、Spring MVC 中的 Controller、特定的数据视图转换器等通常位于该层。在代码层面经常应用的包命名能够是 interface, api, facade 等。用户接口层的入参、出参类定义采纳 POJO 格调。 用户接口层是轻的一层,不含业务逻辑。平安认证,简略的入参校验(例如应用 @Valid 注解),拜访日志记录,对立的异样解决逻辑,对立返回值封装该当在这层实现。 用户接口层所须要的性能实现是由应用层实现,这里个别不须要进行依赖倒置。编码时,该层能够间接引入应用层中定义的接口,因此该层依赖应用层。须要留神的是,尽管实践上用户接口层能够间接应用畛域层和基础设施层的能力,但这里倡议大家在对这种用法熟练掌握前,最好采纳严格的分层架构,即以后层只依赖其下方相邻的一层。 应用层 应用层具体实现接口层中须要性能,但该层并不实现真正的业务规定,而是依据理论的 use case 来协调调用畛域层提供的能力。 ...

March 21, 2022 · 3 min · jiezi

关于编程:本着什么原则才能写出优秀的代码

原文链接:本着什么准则,能力写出优良的代码? 作为一名程序员,最不爱干的事件,除了散会之外,可能就是看他人的代码。 有的时候,新接手一个我的项目,关上代码一看,要不是身材好的话,可能间接气到晕厥。 风格各异,没有正文,甚至连最根本的格局缩进都做不到。这些代码存在的意义,可能就是为了证实一句话:又不是不能跑。 在这个时候,大部分程序员的想法是:这烂代码真是不想改,还不如间接重写。 但有的时候,咱们看一些驰名的开源我的项目时,又会感叹,代码写的真好,优雅。为什么好呢?又有点说不出来,总之就是好。 那么,这篇文章就试图剖析一下好代码都有哪些特点,以及本着什么准则,能力写出优良的代码。 初级阶段先说说比拟根本的准则,只有是程序员,不论是高级还是高级,都会思考到的。 这只是列举了一部分,还有很多,我筛选四项简略举例说明一下。 格局对立命名标准正文清晰防止反复代码以下用 Python 代码别离举例说明: 格局对立格局对立包含很多方面,比方 import 语句,须要依照如下程序编写: Python 规范库模块Python 第三方模块应用程序自定义模块而后每局部间用空行分隔。 import osimport sysimport msgpackimport zmqimport foo再比方,要增加适当的空格,像上面这段代码; i=i+1submitted +=1x = x*2 - 1hypot2 = x*x + y*yc = (a+b) * (a-b)代码都紧凑在一起了,很影响浏览。 i = i + 1submitted += 1x = x * 2 - 1hypot2 = x * x + y * yc = (a + b) * (a - b)增加空格之后,立即感觉清晰了很多。 还有就是像 Python 的缩进,其余语言的大括号地位,是放在行尾,还是另起新行,都须要保障对立的格调。 ...

February 23, 2022 · 4 min · jiezi

关于编程:Top-5-榜单最容易学习和最难掌握的编程语言

如果你想学习编程,你应该从哪种编程语言开始? 向一个程序员询问最容易学习的语言,就像向某人询问他们最喜爱吃什么口味的冰激凌,没有真正正确的的答案,每个人都会有本人的偏好。 正如开发者和教育家 Marek Zaluski 已经说的,“编程语言是由程序员为程序员发明的”。 这就像一个只有多数人晓得的底细机密,并可能会让那些刚进入软件工程畛域的人感到畏惧。 另一方面,不把握风行的编程语言,你就无奈成为一名杰出的软件工程师。 本文将比拟出最简略的编程语言和高级编程语言。 简略易上手的编程语言1. HTMLHTML 是用于编码大多数网页的语言。它应用标签和元素来定义文本、图像和交互式表单的显示方式。通常,HTML 会失去层叠样式表(CSS)的反对,以定义简单的款式;以及用于脚本程序的 JavaScript。HTML 的易用性使其成为入门者的现实语言。该语言的易学体现在以下几个方面: 构造简略,带有人类可读的开始和完结标签您能够应用 WYSIWYG 编辑器并在拆分视图中观看代码更改你能够轻松找到并修复 bug2. JavaScript与 HTML 和 CSS 一起,JavaScript 发明了互联网。而 JavaScript 的简略之处在于: 它是为非程序员设计的,适宜初学者;是现实的入门语言它很广泛,所以大多数浏览器都用作默认环境无需编译器来查看 JavaScript 的运行状况,并且能够立刻查看后果JavaScript 有一个宏大的社区,对入门者有帮忙3.CC 是一种通用语言,大多数程序员在学习更简单的语言之前都会学习它。从 Unix 和 Windows 到 Tic Tac Toe 和 Photoshop,当今最罕用的几个应用程序都是基于 C 构建的。它的简略之处在于: 语法简略,只有 32 个 keywords数据结构易于了解4. PythonPython 是 ABC 语言的继承者,是一种高级通用编程语言。Python 是 Web 开发人员、数据科学家、ML/AI 专业人士和嵌入式应用开发人员的最爱。它很容易学习,因为: 该语言执着于代码的可读性,常常应用英文单词它以大量应用 whitespace 而闻名,使其不那么令人生畏它有几个用于各种应用程序的库它失去了宏大的程序员社区的反对,你的所有问题可能都会被解答JavaJava 是一种基于类、面向对象的通用编程语言。它旨在跨环境运行 —— 一次编写,随处运行 (WORA)。它是后端开发人员和平安应用程序中最受欢迎的语言之一。它很容易学习,因为: 直观的语法,简洁且适宜初学者它是一种结构化语言,简直没有偏差如果您以前有过面向对象编程的教训,那就更容易了 难学的编程语言1.C++C++ 是 C 的扩大。据说谷歌 Chromium 浏览器、微软的几个应用程序、甚至摩根斯坦利的金融建模都是用 C++ 实现的。它的难点在于: 它具备简单的语法以反对多功能性它是一种包容性很强的语言 —— 你能够做所有技术上可行的事件,即便在逻辑上不正确最好由曾经有 C 语言编程根底的人学习2.PrologProlog 是最早的逻辑编程语言之一,当初在人工智能应用程序和自然语言解决中失去采纳。它很难学,因为: ...

December 29, 2021 · 1 min · jiezi

关于编程:Serverless-工程实践-自建-Apache-OpenWhisk-平台

OpenWhisk 简介OpenWhisk 是基于云的分布式事件驱动的编程服务。OpenWhisk 提供一种编程模型,将事件处理程序注册到云服务中,以解决各种不同的服务。其能够反对数千触发器和调用,能够对不同规模的事件进行响应。OpenWhisk 是由许多组件构建的,这些组件让 OpenWhisk 成为一款优良的开源 FaaS 平台。 Apache OpenWhisk 组件构造 OpenWhisk 部署试验机器操作系统为 Ubuntu 18.04 Desktop。应用 GitHub 上所提供的 incubator-openwhisk 进行装置,如果本机没有装置 Git,须要先装置 Git: apt install git接下来克隆 repo 到本地目录: git clone https://github.com/apache/inc... openwhisk克隆实现之后,显示如图所示。 Apache OpenWhisk 我的项目 Clone进入 OpenWhisk 目录,并且执行脚本。OpenWhisk 是由 Scala 开发的,运行须要装置 Java 环境。上面的脚本实现了 Java 环境的装置,以及其余的所须要的软件: cd openwhisk && cd tools/ubuntu-setup && ./all.shApache OpenWhisk 装置配置如图所示。Apache OpenWhisk 装置配置 OpenWhisk 应用 ansible 进行部署,环境变量定义在 ansible/environments/group_vars/all 下: limits:invocationsPerMinute: "{{ limit_invocations_per_minute | default(60) }}"concurrentInvocations: "{{ limit_invocations_concurrent | default(30) }}"concurrentInvocationsSystem: "{{ limit_invocations_concurrent_system | default (5000) }}"firesPerMinute: "{{ limit_fires_per_minute | default(60) }}"sequenceMaxLength: "{{ limit_sequence_max_length | default(50) }}"下面程序定义了 OpenWhisk 在零碎中的限度。 ...

October 28, 2021 · 2 min · jiezi

关于编程:为了减少代码复杂度我将ifelse升级为面向状态编程

摘要:面向过程设计和面向对象设计的次要区别是:是否在业务逻辑层应用简短的if else判断。本文分享自华为云社区《从面向if-else编程降级为面向状态编程,缩小代码复杂度》,作者:breakDraw。 面向过程设计和面向对象设计的次要区别是:是否在业务逻辑层应用简短的if else判断。如果你还在大量应用if else,当然,界面体现层除外,即便你应用Java/C#这样齐全面向对象的语言,也只能阐明你的思维停留在传统的面向过程语言上。 需要有一个十分经典的数字校验场景, 需要如下: 复杂度高的硬写代码这时候如果间接硬写,大概率写出容易复杂度巨高的代码,还容易脱漏而出错。 例子如下: class Solution { public boolean isNumber(String s) { int sign = 1; int pointSign = 1; int eSign = 1; int numSign = -1; int i = 0; int n = s.length(); while(i<n){ if(s.charAt(i)>='0'&&s.charAt(i)<='9'){ numSign = 1; sign = -1; }else if(s.charAt(i)=='+'||s.charAt(i)=='-'){ if(sign>0){ sign = -sign; }else{ return false; } if(i>0&&s.charAt(i-1)=='.'){ return false; } }else if(s.charAt(i)=='.'){ //numSign = -1; if(pointSign>0){ pointSign = -pointSign; }else{ return false; } if(i>0&&(s.charAt(i-1)=='e'||s.charAt(i-1)=='E')){ return false; } }else if(s.charAt(i)=='e'||s.charAt(i)=='E'){ if(eSign<0||numSign<0){ return false; } eSign = -1; sign = 1; numSign = -1; pointSign = -1; }else{ return false; } i++; } return numSign>0; }}这段代码的复杂度为 21, 放在科目一考试间接不及格了,而且非常容易出错,改着改着把本人改晕了,或者改漏了。 ...

October 8, 2021 · 2 min · jiezi

关于编程:关于编程-关于工作学习编程的你在从事什么工作呢

说了这么多都是始终在谈如何学习编程,学习java,c/c++等一些根底的货色。可能有些人会问,学了能干什么?学泥瓦工,能够码砖头、学裁缝能做衣服。这个都有明确的方向。那咱们学编程能从事那些工作呢? 一、互联网最间接的工作就是到一个科技企业做程序员,人家码砖头,咱们码代码。目前的互联网行业,那是须要少量的编程人员,把事实中的数据进行转换存储剖析。BAT是目前国内比拟好的互联网企业,他们的业务都须要大量的编程人员来实习。工资高,福利好,还有自卑感。 二、传统软件企业 何为软件企业首要的是微软,为他人提供软件产品或服务的公司。这些企业最次要的产品就是程序,实现特定的工作。他们大部分都是编程人员,要不然代码谁写,性能谁实现。三、硬件产品行业这个当让也是须要编程人员的,如inter生产进去的cpu等也是须要驱动来实现工作的,他们也须要程序员来实现编码工作。 四、手机国内典型的魅族、小米这些开发手机的企业,他们要硬件都是买他人的,零碎用的是Android,然而他们生产本人的手机当然也是须要编码人员进行工作的。(小米严格意义上是互联网公司) 五、游戏尽管说国内的一些游戏厂商无德专门毒害青少年,然而还是不能一棒子打死。一款好的游戏如cs还是能让咱们在工作之余轻松一些的,游戏那也是编码实现的,是一件如许乏味的事件。 等等能够说无处不在,当初自动化,电子化越来越高,都须要编程去实现大部分工作,所以学编程不愁找不到工作的。 你能纯熟应用c/c++编程,相熟操作系统,你能够成为专职程序员,相熟底层软件你还能够成为零碎工程师。累必定的,干什么工作不累,干公务员还得想着实现政绩。你能纯熟应用JAVA,能够解决面向对象的企业型的利用开发,公司企业WEB页面设计、INTERNET可视化软件开发及动画等,Web服务器手机上的JAVA游戏开发等等。这个风行度高,搞个大家都在玩的app游戏多有成就感。 你若相熟linux,你只须要一台电脑,连上internet以及一个好的头脑就足够了。用你的代码来感动人,不愁找不到工作,工作会来找你拉!太多了,只有你吃得了苦耐得住寂寞,加得了班熬得了夜,来吧。

September 16, 2021 · 1 min · jiezi

关于编程:写出整洁的代码是每个程序员的追求

本文作者:xybaby 起源:https://www.cnblogs.com/xybab...写出整洁的代码,是每个程序员的谋求。《clean code》指出,要想写出好的代码,首先得晓得什么是恶浊代码、什么是整洁代码;而后通过大量的刻意练习,能力真正写出整洁的代码。 WTF/min是掂量代码品质的唯一标准,Uncle Bob在书中称蹩脚的代码为沼泽(wading),这只突出了咱们是蹩脚代码的受害者。国内有一个更适宜的词汇:屎山,尽管不是很斯文然而更加主观,程序员既是受害者也是加害者。 对于什么是整洁的代码,书中给出了巨匠们的总结: Bjarne Stroustrup:优雅且高效;含糊其辞;缩小依赖;只做好一件事Grady booch:简略间接Dave thomas:可读,可保护,单元测试Ron Jeffries:不要反复、繁多职责,表达力(Expressiveness)其中,我最喜爱的是表达力(Expressiveness)这个形容,这个词仿佛道出了好代码的真谛:用简略间接的形式描绘出代码的性能,不多也不少。 命名的艺术坦率的说,命名是一件艰难的事件,要想出一个恰到好处的命名须要一番功夫,尤其咱们的母语还不是编程语言所通用的英语。不过这一切都是值得了,好的命名让你的代码更直观,更有表达力。 好的命名应该有上面的特色: 货真价实好的变量名通知你:是什么货色,为什么存在,该怎么应用 如果须要通过正文来解释变量,那么就先得不那么货真价实了。 上面是书中的一个示例代码,展现了命名对代码品质的晋升 防止误导不要挂羊头卖狗肉不要笼罩习用缩略语这里不得不吐槽前两天才看到的一份代码,竟然应用了 l 作为变量名;而且,user竟然是一个list(单复数都没学好!!) 有意义的辨别代码是写给机器执行,也是给人浏览的,所以概念肯定要有区分度 应用读的进去的单词 如果名称读不进去,那么探讨的时候就会像个傻鸟使用方便搜寻的命名名字长短应与其作用域大小绝对应防止思维映射比方在代码中写一个temp,那么读者就得每次看到这个单词的时候翻译成其真正的意义 正文有表达力的代码是无需正文的。 The proper use of comments is to compensate for our failure to express ourself in code.正文的适当作用在于补救咱们用代码表白用意时遇到的失败,这听起来让人丧气,但事实的确如此。The truth is in the code, 正文只是二手信息,二者的不同步或者不等价是正文的最大问题。 书中给出了一个十分形象的例子来展现:用代码来论述,而非正文 因而,当想要增加正文的时候,能够想想是否能够通过批改命名,或者批改函数(代码)的形象层级来展现代码的用意。 当然,也不能因噎废食,书中指出了以下一些状况属于好的正文 法务信息对用意的正文,为什么要这么做警示TODO正文放大看似不合理之物的重要性其中集体最同意的是第2点和第5点,做什么很容易通过命名表白,但为什么要这么做则并不直观,特地波及到专业知识、算法的时候。另外,有些第一感觉“不那么优雅”的代码,兴许有其非凡违心,那么这样的代码就应该加上正文,阐明为什么要这样,比方为了晋升要害门路的性能,可能会就义局部代码的可读性。 最坏的正文就是过期或者谬误的正文,这对于代码的维护者(兴许就是几个月后的本人)是微小的挫伤,惋惜除了code review,并没有简单易行的办法来保障代码与正文的同步。 函数函数的繁多职责一个函数应该只做一件事,这件事应该能通过函数名就能清晰的展现。判断办法很简略:看看函数是否还能再拆出一个函数。 函数要么做什么do_sth, 要么查问什么query_sth。最恶心的就是函数名示意只会query_sth, 但事实上却会do_sth, 这使得函数产生了副作用。比方书中的例子 函数的形象层级每个函数一个抽象层次,函数中的语句都要在同一个形象层级,不同的形象层级不能放在一起。比方咱们想把大象放进冰箱,应该是这个样子的: def pushElephantIntoRefrige(): openRefrige() pushElephant() closeRefrige()函数外面的三句代码在同一个层级(高度)形容了要实现把大象放进冰箱这件事程序相干的三个步骤。显然,pushElephant这个步骤又可能蕴含很多子步骤,然而在pushElephantIntoRefrige这个层级,是无需晓得太多细节的。 当咱们想通过浏览代码的形式来理解一个新的我的项目时,个别都是采取广度优先的策略,自上而下的浏览代码,先理解整体构造,而后再深刻感兴趣的细节。如果没有对实现细节进行良好的形象(并凝练出一个货真价实的函数),那么阅读者就容易迷失在细节的汪洋里。 某种程度看来,这个跟金字塔原理也很像 ...

July 28, 2021 · 1 min · jiezi

关于编程:Golang-面向对象编程

Golang 是面向对象的么?是,也不是。只管 Go 有类型和办法,并且容许面向对象格调的编程,但没有类型层次结构。Go 的『接口』概念提供了一种不同的实现形式,在某些方面更通用。同时,短少类型层次结构使 Go 的『对象』感觉上比 C++ 或 Java 等语言中的『对象』轻很多。本文的目标就是通过示例来阐明,如何应用 Golang 进行面向对象编程 过程化以下是一个对于身份证ID的示例,用于从身份证中提取生日。通常的实现版本如下: func Birthday(id string) string { return id[6:14]}const ( id = "412717199109031697")func Test_Birthday(t *testing.T) { found := Birthday(id) wanted := "19910903" if found != wanted { t.Errorf("unexpected birthday, wanted:%v, found:%v", wanted, found) }}简略的数据,如此实现倒也问题不大。但生产环境中往往遇到的都是简单的多的数据和操作。此时就须要将数据和操作封装在一起 封装Golang 中能够通过 type 关键字创立新的类型,同时应用 NewXXX 的格调创建对象。 type ID stringfunc NewID(id string) (ID, error) { if len(id) != 18 { return "", errors.New(fmt.Sprintf("error id length:%v", len(id))) } return ID(id), nil}func (i ID) Birthday() string { return string(i[6:14])}func TestID_Birthday(t *testing.T) { found := ID(id).Birthday() wanted := "19910903" if found != wanted { t.Errorf("unexpected birthday, wanted:%v, found:%v", wanted, found) }}当业务变得更加简单,同一种性能,存在多种实现形式,比方领取形式,微信领取、京东领取、支付宝、银联等不同渠道的大略流程大抵类似,但实现细节有所区别。此时就须要借助多态的动静绑定来进行业务形象。 ...

March 17, 2021 · 2 min · jiezi

关于编程:编程字体推荐

编程字体举荐每一款都用过,隔段时间换一个 ????,又能发现新的 bug。Sarasa Gothic / 更纱黑体 / 更紗黑體 / 更紗ゴシック / 사라사 고딕更纱黑体(Sarasa Gothic),一款在 100%缩放比例下有着优良渲染成果的字体,更纱黑体由 Noto Sans / Iosevka 和思源黑体的汉字局部合并而来,因而简体中文根本不缺字,也有日系汉字的格调,并且是开源收费字体。Github: https://github.com/be5invis/Sarasa-Gothic 预览 MonacoMonaco 字体是 OS X 零碎默认的字体,与 Consolas 一样都非常适合程序开发人员,很显著一股浓浓的苹果风味。Github: https://github.com/microsoft/monaco-editor 预览 ConsolasConsolas 是一套等宽字体的字型,属无衬线字体,由 Lucas de Groot 设计,这套字型应用了微软的 ClearType 字型平滑技术,十分难看。Github https://github.com/pensnarik/consolas-font 预览 Fira CodeFira 是 Mozilla 公司 主推的字体系列。Fira Code 是其中的一员,专为写程序而生。进去具备等宽等根本属性外,还退出了编程连字个性(ligatures)。Fira code 其实基于 Fira Mono 字体,而后对操作符做了非凡解决,这样更合乎通常的浏览习惯。 Github https://github.com/tonsky/FiraCode 预览 Droid Sans MonoDroid Sans 是一个人道主义者无衬线字体由 Steve Matteson 设计,Ascender 公司 Droid Sans 类型总监设计的设计包含一个垂直压力,凋谢的模式和中立,但敌对的外观。Droid Sans 对用户界面进行了优化,并以舒服的浏览与菜单,网页浏览器及其他屏幕上的文本挪动手机。Github ...

February 28, 2021 · 1 min · jiezi

关于编程:什么是低代码数据库

低代码数据库是应用简略的用户界面设计的工具,即便没有任何编程背景的人也能够胜利地应用它。因为低代码开发的凋敝,它们的需求量很大。越来越多的新产品通过精心设计和简化的界面为非程序员提供了机会。 “低代码”这个术语意味着不须要多少编程就能实现这项工作。有时候,只须要拖拽一些图标,而后进行一些只须要点击的工作或者填写一些表单。这个术语广泛应用于各种企业产品,而数据库只是其中之一。事实上,许多产品都提供围绕外围数据库的专门服务。 随着劳动力和工作流变得越来越自动化,这种状况正在越来越频繁地呈现,并驱使公司采纳低代码数据库。 “低代码”这个术语不仅实用于一线产品。它还在 IT 堆栈的各个角落找到了归宿,比方数据库。无休止的命令行调用已被设置向导和更丑陋的用户界面迟缓而牢靠地替换。 这些产品是否可能实现需求有很多争执,只管能够带来更好看的屏幕和图形用户界面,但仍有一些辣手的技术问题暗藏在外观之下。有时须要一个纯熟的编码人员来了解存储数据的最佳形式,以便可能无效地对数据进行排序和检索。 低代码数据库用例传统的开发人员和老手都可能创立连贯用户和数据库的根本应用程序。一些常见的用例包含: 记录保留ーー办公室工作人员能够创立新的数据库表来跟踪办公室性能,而无需依赖全面的开发人员。客户互动——须要收集申请或向客户发送更新的企业能够创立面向内部的应用程序,并填写大量数据表单。伙伴关系ーー它不仅仅是面向客户的应用程序; 低代码工具能够通过缩小反对新合同所需的迭代次数来减速新业务关系的倒退。试验ー低代码数据库用于构建原型和测试工作流程。他们不须要大型团队多月工作的投资。低代码数据库的次要提供者微软是最早推出低代码数据库的公司之一。最后版本的 Access 于 1992 年首次公布,指标客户是一般的计算机用户,并最终与 Office 产品捆绑在一起,比方文字处理器。人们能够创立和填写一个数据库简直像写备忘录一样容易。 最新的一套工具当初以“ Power App”的名义推出,它反对围绕数据库的简单应用程序。这些工具与根本的 Office 应用程序严密集成,并面向同一组用户销售。用户可能不会花太多工夫放心数据的去向,但许多人可能会应用与微软高端旗舰 SQL Server 的连贯。 甲骨文的数据库可能已经是最难装置的数据库之一,然而明天该公司推出了一些“主动”版本也就是说,这个工具包含自动化程序,解决许多本来由人类实现的杂务。据说它是“主动调整”、“主动调整”、“主动修理”和“主动供给”还有“主动备份”和“主动故障转移” 许多这些个性使得数据库管理员的工作更加容易,并且使得其余开发人员更容易兼职解决这些工作。尽管有创立数据库的网络界面,但对于普通用户来说,它们可能依然太简单。 SAP 将其过程称为“疾速利用程序开发”,并提供了几种工具来拜访云中的数据。例如,Ruum 将把图标串在一起,将数据导入 SAP 过程。它的机器人过程自动化工具包含人工智能的特点,如文本辨认,转换数据主动存储在数据库之前。 新呈现的提供商很难在低代码数据库和任何通用应用程序之间划清界限,许多应用程序只是包裹在数据库四周的薄前端,因而用户可能在没有意识到的状况下将本人的信息存储在传统数据库中。至多对于个别应用程序来说,自动化层能够简化流程。 一些开源工具包被设计用来简化这个过程。例如,Drupal 和 Joomla 是内容管理系统,用于创立充斥页面和文章的数据库。Drupal 的 Webform 模块减少了创立具体考察的能力,这样用户就能够输出本人的数据。其余的内容管理系统,比方 WordPress,也能够做同样的事件,然而他们通常更专一于建设博客和其余文本文档。 次要的云服务正在增加工具,并提供多种形式来创立一个应用程序,在云的数据服务中存储数据。谷歌的 AppSheet 提供了一个疾速的办法,将一个应用程序与 g Suite 中的办公产品严密集成在一起。它是 App Maker 的一个替代品,这个晚期的我的项目最近被敞开了。 套件还包含 Google Forms,这是将用户数据收集到电子表格中的最简略的办法之一。谷歌还反对 AppEngine 和 AppScript,这两个工具简化了应用程序的创立过程,但应用了足够多的编程语言,即便它们非常容易应用,也不会被认为是“低代码”。 亚马逊也在推出新的抉择。它的 Honeycode 作为前端提供了纯正的拖放操作。任何数据都能够应用 Lambda 函数路由到各种 AWS 存储服务和数据库。它还提供了 AppFlow,一个连贯不同 AWS 服务和内部服务(如 Salesforce)的工具。 其余云服务专门用于使计算靠近具备分布式端点的用户。的 Workers 在执行完传统语言的片段(比方 JavaScript)后,会从最近的 Cloudflare CDN 节点疾速响应。 ...

February 17, 2021 · 1 min · jiezi

关于编程:线程Ⅱ

线程池为什么要应用线程池?创立和销毁线程是一个低廉的操作,要消耗大量的工夫。太多的线程还会节约内存资源,因为操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还会影响性能,而线程池能够改善这些状况。 线程池是什么?能够将线程池设想成为能够由应用程序应用的一个线程汇合,每个CLR一个线程池,这个线程池由CLR管制的所有AppDomain共享。如果一个过程中加载了多个CLR,那么每个CLR都有本人的线程池。 线程池是如何工作的?CLR初始化时,线程池中是没有线程的。在外部,线程池保护了一个操作申请队列,在应用程序想执行一个异步操作时,就调用一个办法,将一个记录项追加到线程池的队列中。线程池的代码从这个队列中提取记录项,将这个记录项差遣给一个线程池线程。此时如果线程池中没有线程,会创立一个新的线程(产生肯定的性能开销)。当线程实现工作后,线程不会被销毁,而会回到线程池且进入闲暇状态,期待响应下一个申请。因为线程不再销毁所以不再产生额定的性能损失。 如果应用程序向线程收回许多申请,线程池会尝试只用已有一个线程解决这些申请。如果发送申请的速度超过了线程池线程解决的速度,就会创立额定的线程来解决。 当应用程序进行向线程池发送求情,此时线程池中的线程什么都不做,造成内存资源的节约。所以有一个机制:当线程池线程闲置一段时间后(不同版本的CLR对工夫有所差别),线程会主动唤醒并终止本人开释资源。 特点线程池能够包容大量线程防止资源节约,也能够创立大量线程充分利用多处理器、超线程处理器以及多核处理器。换句话说线程池是启发式的,如果应用程序要执行许多工作同时又有可用的CPU,那么线程池会创立更多的线程。 应用线程池异步编程private static void SomeMethod(object state){ //办法由线程池线程执行 Console.WriteLine("state = {0}", state); Thread.Sleep(10000); //办法返回后线程回到线程池期待下一个申请}static void Main(){ ThreadPool.QueueUserWorkItem(SomeMethod, 1); Console.ReadKey();}执行上下文每个线程都关联了一个执行上下文数据结构,蕴含有:平安设置、宿主设置以及逻辑调用上下文数据。失常状况下,每当一个线程(初始线程)应用另一个线程(辅助线程)执行工作时,前者的执行上下文应该复制到辅助线程,这样能够确保辅助线程的任何操作都是应用同样的平安设置和宿主设置,还能保障初始线程的逻辑调用上下文能够在辅助线程中应用。默认状况下初始线程的执行上下文能够流向任何辅助线程,但执行上下文中蕴含大量信息,这会对性能造成肯定的影响。 ExecutionContext管制执行上下文static void Main(string[] args){ //将数据放入Main线程的逻辑调用上下文 CallContext.LogicalSetData("Name", "DoubleJ"); //线程池线程能拜访逻辑调用上下文数据 ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("state = {0}, name = {1}", state, CallContext.LogicalGetData("Name")); }, 1); //阻止Main线程的执行上下文流动 ExecutionContext.SuppressFlow(); //线程池线程将无法访问逻辑调用上下文数据 ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("state = {0}, name = {1}", state, CallContext.LogicalGetData("Name")); }, 2); //复原Main线程的执行上下文流动 ExecutionContext.RestoreFlow(); //线程池线程又能够拜访逻辑调用上下文数据了 ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("state = {0}, name = {1}", state, CallContext.LogicalGetData("Name")); }, 3); Console.ReadKey();}运行后果 ...

February 6, 2021 · 3 min · jiezi

关于编程:低代码原生安全

在帮忙程序员早日辞别996这件事上,“低代码”被寄予厚望。最近,一则来自西门子数字化工业软件的音讯激发了不小水花:西门子旗下的企业级低代码平台Mendix正式发表登陆中国。简直同时,西门子数字化工业软件与腾讯云也独特公布了将Mendix落地部署于腾讯云上的单干音讯。“强强合作”之下,预示着一条商业应用程序的开发新赛道正减速布局。 尚处于低谷阶段的资本市场在数字化大潮下无疑是灵活且审慎的。马太效应愈演愈烈,资本也在搜查那些更合乎数字化降本增效和翻新倒退需要的优质标的。聚焦业务与IT无缝集成的低代码平台正是热点之一。 据海比研究院统计,2018-2020年,中国低/无代码畛域总体投融资事件共16起,融资总金额近15亿人民币,融资企业总估值近70亿元。这个仍具广大后劲的细分赛道,正在批量吸引中国顶尖公司和机构的减速进场或继续加注。 但这个宣称可能让程序员辞别“996”的“新物种”,到底是什么?风口造就的新赛道下,低代码暗藏着怎么的价值劣势?而又将是什么能撑持它走的更远? 01 低代码:正在大放异彩的开发界“新物种”如果将从需要调研、零碎设计到编码、测试、交付的开发流程归为传统开发模式,那么以可视化拖拽和配置(或大量编码)为特色的低代码的呈现,则是软件开发为适配数字化时代倒退需要而孵化出的“新物种”。 2018年6月,一家彼时已成立16年的低代码平台——OutSystems发表取得私募股权投资机构KKR和高盛的3.6亿美元投资,估值超过10亿美元,一举成为低代码开发畛域的“新晋独角兽”。同年,西门子以 6 亿欧元收买低代码利用开发畛域厂商Mendix。在资本激发之下,“Low-Code(低代码)”这一由Forrester于2014年首次提出的概念减速落地起势。 Forrester早前报告就曾预测,低代码开发平台市场将从2015年的17亿美元增长到2020年的155亿美元。同样地,Gartner报告则预测,到2024年,65%的利用开发将通过低代码平台实现。而海比研究院、中国软件网联结中国软件行业协会公布的《2021年中国低代码/无代码市场钻研报告》数据则很好地验证了这一预测:目前,我国低代码整体市场规模已达19亿,并将在将来五年放弃49.5%的复合增长率。低代码成为整个中国ICT产业当中最显著的增量市场。 无论是从国外还是国内来看,低代码这一可通过通用、可重复使用组件化模块,疾速生成应用程序的开发模式,都是一个正在大放异彩的将来之势。“起势飞奔”背地,更值得探索的是深层的驱动之力。 从技术自身上看,低代码利用开发体现出的全栈可视化编程、全生命周期治理、扩大能力、可重用性、跨平台可拜访性等能力特点,其实都在指向构建出降本增效、高场景贴合和弹性拓展的外围价值劣势,以匹配数字化时代“水涨船高”的利用开发需要。 具体而言,一方面,在低代码的开发环境中,小型部门到大型简单工作的利用程序开发都被简化减速。“图形化开发环境+大量代码编写”的“积木式”开发部署与治理,可能实现业务利用的疾速交付。一改传统开发短则耗时一个半月,长则耗时三个月之长的简短流程,破解合作不畅、管理效率低下等难点,高效响应数字化时代的需要节奏。Forrester 晚期调研数据显示,低代码平台能把开发效率晋升了 5-10 倍,且这一倍数仍在继续上涨中。 另一方面,借助低代码平台,企业仅需通过配置,就可实现OA、CRM、BPM等软件开发全生命周期流程的需要。同时,利用开发技术门槛的升高,让非专业开发者也经简略培训退出到业务利用开发中。洽购与人力老本“双降”之下,业务利用开发天然更“省”。 此外,低代码“快”、“省”还带来了高场景贴合及高弹性拓展的附加价值:一线业务人员的参加使得利用零碎更贴合业务理论需要,带来更好的客户体验;而灵便的用户界面,也使得业务利用零碎更具拓展性,以满足企业应用为适应市场环境疾速迭代的需要。 从寰球IT宏观格局上来讲,时代、企业和技术等的变革倒退为低代码的奔涌前行提供了“肥沃土壤”。Gartner数据预计,2021年市场对于利用开发的需要将五倍于IT公司的产能。当数字化转型已成寰球经济的必然之势,低代码平台的利用直击无奈疾速试错、信息孤岛、切换老本、不足IT人才等痛点,成为数字化减速转型周期的重要助力。 随着企业降本增效需要的攀升,低代码在产业设计研发和利用中体现出的双向疾速“共振”,对企业老本管制具备重要现实意义。换言之,对于想更加专一于倒退的数字化转型企业而言,直观易用、简略定制的低代码是一个很好的“助攻”。 在技术成熟度方面,国内低代码利用通过数年积攒后,开始进入“爬坡”阶段,并处于一个与市场需求正向同步的过程,倒退空间与前景都较为可观。 新基建和产业互联网减速纵深倒退的背景下,一场产业数字化信息系统建设格局的“巨变”正在酝酿。但作为曾经做好“腾飞”筹备的利用开发新物种,低代码要最大限度地施展价值劣势,以分享赛道红利,则有更深层的问题须要厘清。 02云原生:低代码升温的新平安“明码”家喻户晓,低代码与传统开发模式最大的不同在于因开发流程各异带来的周期长短。从数月到低至分钟级、秒级甚至是百毫秒级的开发周期缩减,让每一个身处数字化转型大潮下的企业都为之吸引。 然而,随同着数字化过程的深刻,云计算作为要害基础设施之一的大规模利用,使得云逐渐成为业务利用开发的新环境。而云时代面临的传统平安算法滞后、平安边界进攻体系生效、攻防节奏放慢、数据资产管理机制亟待优化等平安挑战的变动,让相干行业对剔除了重复测试之后的低代码利用开发之安全性开释出了一些担心。 只管业内专家称,低代码平台容许风险管理流程集中式管制的特色以及运维技能门槛的升高和流程的简化,可能升高危险数据量和晋升风险管理能力。也就是说,从肯定水平上看来说,安全性是低代码利用开发平台的“自带”属性。然而,云环境下传统平安威逼与新生平安问题杂糅的场面,加之云攻打规模的继续扩充,业内人士对低代码这一“自带”平安属性的效用,仍有较大疑虑。 这一背景下,包含奥哲CTO张华等在内的行业专家提出,云原生确是当下低代码开发利用的最好架构抉择。低代码与云原生的井水不犯河水,既是企业应答降本增效、疾速迭代的刚性需要,更是保障云生态下企业应用开发平安的新支撑力。云原生宛若低代码解锁新一轮升温倒退的“新密码”。 借助云原生平安开箱即用、弹性、自适应、全生命周期防护等的劣势,低代码平台上的利用开发将具备“人造”原生平安属性。基于云原生架构的低代码开发既能帮忙企业在晋升业务利用开发效率的同时,又能实现平安能力的弹性增长;同时,也能帮忙企业用户扛住高强度攻打,在安稳期开释多余的计算能力,缩小企业部署老本。此外,能够更高的标准化,构筑更为协同的平安生态,促使企业更加从容地破解前端底层破绽、系统升级带来的新危险挑战。毫无疑问,在安全性失去无效解决之后,搭载了云原生平安能力的低代码势必在数字化大潮下解锁出一条迅速升温的倒退新赛道。 截止目前,OutSystems已在全国25个国家领有400多家企业客户,笼罩包含丰田、罗技、德勤、施耐德电气和通用金融等。年度经常性支出已远超1亿美元,且仍以超70%的增长率逐年增长。对于产业数字化而言,以低代码为代表的新型利用开发模式终将成为常态。数字生态下,平安问题尚未有消除之势,云原生平安正在尝试用“人造”基因的力量,为低代码“精益求精”,将这种新的开发方式带到更多的业务畛域中。一场对于利用开发的平安变革正在悄悄升温。

February 3, 2021 · 1 min · jiezi

关于编程:编程中的惰性思想

前几天去东莞的路上看电子书《深刻了解Linux内核》,外面讲到Linux虚拟内存动态分配技术,联想到学习工作终波及到的一些经验,特写此文。(因我程度无限,不免有谬误之处,欢送大佬斧正~) 1.惰性思维我想大家在学习工作中,肯定或多或少有Deadline的经验吧,假期作业留到最初快开学了才写,衣服拖到最初没衣服换了才洗,这样做好不好呢?其实还行,个别Deadline期间写作业洗衣服效率挺高的,而换一个思路来说,在写作业洗衣服之前,你都是闲暇的,能够纵情做别的事件的,程序设计外面,我了解的惰性思维其实跟Deadline很像,资源分配推延到不能再推延为止 2. Linux内存动态分配里的惰性思维2.1 申请调页术语"申请调页"指的是把页框(虚拟内存调度单位)的调配推延到不能再推延为止,也就是说,始终推延到过程要拜访的页不在RAM中时为止,因而引起一个缺页异样。 申请调页技术背地的动机是:过程开始运行时并不拜访其地址空间中的全副地址;事实上,有一部分地址兴许永远不会被过程应用。此外,程序的局部性原理保障了在程序执行的每个阶段,真正援用的过程页只有一小部分,因而长期用不着的页所在的页框能够由其余过程来应用。这样减少了零碎中的闲暇页框的平均数,从而更好的利用闲暇内存。从另一个观点来看,在RAM总数放弃不变的状况下,申请调页从总体上使零碎有更大的吞吐量。 2.2 写时复制(也就是赫赫有名的Copy On Write)第一代Unix零碎实现了一种傻瓜式的过程创立:当fork()子过程时候,内核原样复制父过程的整个地址空间并把复制的那一份调配给子过程。而子过程有很多货色和父过程一样且不产生批改的,没必要齐全复制,这种做法既节约很多内存空间,又耗费许多CPU周期。 当初的Unix内核(包含Linux)采纳一种更为无效的办法,称为写时复制,也就是赫赫有名的Copy On Write。这种思维相当简略:父过程和子过程共享页框,只是不能批改,当批改的时候,就产生异样,这时内核再把这个页复制到一个新的页框中并标记为可写,原来的页框依然是写爱护的。当其余过程试图写入时,内核查看写过程是否是这个页框的惟一属主,如果是,就把这个页框标记为对这个过程可写。 其中,页描述符的_count字段用于跟踪共享当前页框的过程数目,为1时阐明跟其余1个过程共享,为0时阐明只有一个过程可写,为-1时阐明须要被开释。 3. 举几门语言的例子3.1 JS语言反面教材掘金上的前端开发同学比拟多,必然很理解JS的深浅拷贝问题,问烂了的面试题了 let a = {a:1};let b = a;let c = Object.assign({}, a)console.log(a,b,c,a===b,a===c);//{a:1} {a:1} {a:1} true falsea.a = 2;console.log(a,b,c,a===b,a===c);//{a:2} {a:2} {a:1} true false下面的代码很好了解,b是浅拷贝,故而值跟着变了,c是深拷贝,故而值没变而对应的变量内存地址的话,因为JS并不能像其余语言一样,显式的查看变量内存地址,但能够借助Chrome的Memory工具快照,来查看其相应的V8虚拟地址。 显著的,a和b有着雷同的内存地址,而c因为是深拷贝,领有新的内存地址;当咱们给a.a = 2从新写入后,察看Snapshot 12,a和b的内存地址仍然雷同,这是因为JS这门语言并没有实现写时复制。 3.2 Python写时复制讲完JS反面教材,咱们再来察看一个实现了写时复制的语言。 terence@k8s-master:/mydata$ python3Python 3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8.4.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> a = "qwer">>> print(a)qwer>>> id(a)140662197387536>>> b = a;>>> print(b)qwer>>> id(b)140662197387536//跟a的内存地址统一>>> b = "qwert">>> id(b)140662197387592//写时复制,内存地址产生了变动>>> 3.3 PHP写时复制PHP对数组实现了写时复制,一般变量是没有写时复制的,通过上面的例子可能分明的看到内存占用量的变动,只是批改了$b[0],而后整个都被复制了。(当然也能够装置xdebug拓展,进一步能够察看到数组refcount援用计数的变动) ...

February 2, 2021 · 1 min · jiezi

关于编程:我对-SRE-的理解

前言在技术工作中,对于产品/根底技术研发和 SRE 两种角色,通常会有基于「是否偏重编码」的了解。对于产品研发转做 SRE ,常常会产生是否要「脱离编码工作」的认识,或者认为是否要「偏离对产品/根底技术的推动」。 基于过往的技术研发和稳定性保障的教训,分享下集体对 SRE 的了解,探讨「面向产品/根底技术的研发」和「稳定性保障」两种角色之间的协作关系,更好地为业务服务。 SRE 概述最早探讨 SRE 来源于 Google 这本书《Site Reliability Engineering: How Google Runs Production Systems》(豆瓣链接)。由 Google SRE 要害成员分享他们是如何对软件进行生命周期的整体性关注,以及为什么这样做可能帮忙 Google 胜利地构建、部署、监控和运维世界上现存最大的软件系统。 从 wikipedia: Site reliability engineering中可理解到 SRE 的定义: Site reliability engineering (SRE) is a discipline that incorporates aspects of software engineering and applies them to infrastructure and operations problems. The main goals are to create scalable and highly reliable software systems.其中有句形象形容 SRE 工作的形容: SRE is "what happens when a software engineer is tasked with what used to be called operations."即 SRE 的指标是构建可扩大和高可用的软件系统,通过软件工程的办法解决基础设施和操作相干的问题。 ...

January 27, 2021 · 2 min · jiezi

关于编程:前端面试每日-31-第642天

明天的知识点 (2021.01.17) —— 第642天 (我也要出题)[html] 对于写一个页面布局,html/css/js这三者你是先写哪个后写哪个?[css] 在Less中什么是&combinator?[js] 写一个办法判断js的办法是内置的还是自定义的[软技能] 说说你对编程思维的了解《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

January 17, 2021 · 1 min · jiezi

关于编程:CLR寄宿

CLR寄宿.NET Framework在Windows平台的顶部运行,意味着.NET Framework必须用Windows能够了解的技术构建:所有托管模块和程序集文件都必须应用Windows PE文件格式,要么是一个Windows EXE文件,要么是一个DLL文件。 CLRCreateInstance函数定义在程序集MSCorEE.dll中,该程序集个别被成为垫片,该文件个别在C:\Windows\System32目录中。它的工作是负责决定创立哪个版本的CLR。 一台机器能够装置多个版本的CLR,然而只有一个版本的MSCorEE.dll文件。机器上装置的MSCorEE.dll版本是与装置的最新版的CLR一起公布的那个版本。 CLRCreateInstance函数能够返回一个ICLRMetaHost接口,能够调用该接口中的GetRuntime函数指定宿次要创立的CLR版本。而后垫片将所需版本的CLR加载到宿主的过程中。 GetRuntime函数返回一个指向非托管接口ICLRRuntimeInfo的指针,通过调用GetInterface办法取得ICLRRuntimeHost接口,可利用该接口做以下事件: 设置宿主管理器:通知CLR内存调配、线程调度/同步、程序集加载等决策。宿主还能够申明它想取得无关垃圾回收启动和进行以及特定操作超时的告诉获取CLR管理器:通知CLR阻止应用某些类/成员。宿主还能分辨哪些代码能够调式而哪些代码不能调试,以及一些特定事件(AppDomain卸载、堆栈溢出异样)产生时宿主应该调用哪些办法初始化并启动CLR加载一个程序集并执行其中的代码进行CLR,阻止任何更多的托管代码在Windows过程中运行*Windows过程齐全能够不加载CLR,只有须要在过程中执行托管代码时才须要加载它 CLR寄宿的益处能够用任何编程语言来编写代码在JIT编译后执行而不是一边解释一边执行,所以速度很快代码应用垃圾回收防止内存透露和损坏代码在一个平安的沙箱中运行宿主不用操心提供一个丰盛的开发环境。宿主能够利用现有的技术,包含语言、编译器、编辑器、调试器、profiler等

January 4, 2021 · 1 min · jiezi

关于编程:编程珠玑第二版-分享下载

书籍信息书名: 编程珠玑(第二版)原作名: Programming Pearls Second Edition豆瓣评分: 8.9分(977人评估)标签: 编程,算法,编程珠玑,计算机,程序设计,programming,编程基本功,经典,编程珠玑(第二版),收费,程序员书籍,编程,pdf,电子书内容简介《编程珠玑(第2版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列理论问题开展。作者Jon Bentley 以其独有的洞察力和创造力,疏导读者了解这些问题并学会解决办法,而这些正是程序员理论编程生涯中至关重要的。作者简介Jon Bentley,世界驰名计算机科学家,被誉为影响算法倒退的十位巨匠之一。他先后任职于卡内基—梅隆大学(1976—1982)、贝尔实验室(1982—2001)和Avaya实验室(2001年至今)。在卡内基—梅隆大学负责传授期间,他造就了包含Tcl语言设计者John Ousterhout、Java语言设计者James Gosling、《算法导论》作者之一Charles Leiserson在内的许多计算机科学大家。2004年荣获Dr.Dobbs程序设计卓越奖。下载地址https://590m.com/file/1876512...

December 30, 2020 · 1 min · jiezi

关于编程:编程教育纳入中小学课程家长不知改喜改忧你怎么看

近日,教育部官网公布的一份文件,让中小学编程教育再度引发社会关注。 针对有政协委员提出《对于稳步推动编程教育纳入我国根底教学体系,着力造就数字化人才的提案》,教育部回答称: “已制订相干专门文件推动和标准编程教育倒退,造就培训可能施行编程教育相干师资,将包含编程教育在内信息技术内容纳入到中小学相干课程,帮忙学生把握信息技术基础知识与技能、加强信息意识、倒退计算思维、进步数字化学习与创新能力、建立正确的信息社会价值观和责任感。” 相干新闻报道纷纷以《编程教育纳入中小学课程》为题,吸引家长们的关注和探讨: 难道说,中小学编程真的要来了吗? 01 编程教育,曾经来了! 事实上,教育部并非首次作出此番表述。 近年来,教育部始终在制订相干专门文件推动和标准编程教育倒退。 2018年 教育部公布《教育信息化2.0行动计划》,提出“增强学生信息素养培养”“欠缺课程计划和课程标准,空虚适应信息时代、智能时代倒退须要的人工智能和编程课程内容”“推动落实各级各类学校的信息技术课程,并将信息技术纳入初、高中学业程度考试”等要求。 2019年 教育部等八部门印发《对于疏导标准教育挪动互联网利用有序衰弱倒退的意见》,提出建设多部门协同联动的监管机制,组织对包含少儿编程教育在内的教育App进行备案,并逐步完善备案、举荐、选用、监督查看等制度,构建笼罩全生命周期的管理机制。 落实到教学中,编程教育等信息技术内容已纳入到小学、初中迷信课程和中小学综合实际流动课程,并有机融入到相干学科课程,高中阶段还专门开设信息技术课程。 2017年9月,教育部印发的《中小学综合实际流动课程领导大纲》含“信息技术”专栏,举荐主题包含“趣味编程入门”到“程序世界中的多彩花园”“走进程序世界”等。其中要求: 小学中高年级学生理解所学语言编程的基本思路,了解所学编程语言中程序设计的根本机构,把握编程的办法和步骤,编写出简略的程序,通过学习简略的编程语言,初步建立计算思维的信息素养,为中高年级程序语言的学习打好根底等; 初中年级学生理解程序设计的根本过程和办法,相熟程序设计语言的用法,把握常量、变量、函数等基本概念,了解程序的三种根本构造,晓得人与计算机解决问题办法的异同,尝试编写、调试程序,激发编程的趣味,造就逻辑思维能力,进一步了解计算思维的外延,进步数字化学习与翻新素养,加强信息意识和信息社会责任等。 教育部在回答中也示意,下一步将推动编程教育纳入信息科技课程标准。2019年初,已启动义务教育课程订正工作,实现了后期调研、顶层设计和整体规划,初步确定在小学、初中开设信息科技课程并组织研制义务教育信息科技课程标准,依据须要将编程教育无关内容纳入其中。 02 纳入学习范畴,为啥家长态度不一? 现在的孩子广泛具备极高的学习能力和常识程度,他们的体现有时远远超出小孩儿的设想,编程就是其中最有代表性的例子。 近日,有记者走进学校拍摄下这样的画面: 塔防游戏、动物大战僵尸、篮球比赛、动物世界…… 一所小学四年级的课堂上,大部分学生曾经能够应用Scratch图形化编程语言设计出肯定的情境故事或游戏并晦涩运行。 一所中学初一年级的课堂上,34名学生正开始学习Python编程语言的第一课。而他们当中,有人曾经有2年以上的学习教训。 父母们都期盼孩子可能多把握一门技能,但面对“编程教育纳入中小学课程”的现状时,家长的态度却截然不同: 局部家长对此示意反对。在他们看来,学习编程能够倒退孩子的逻辑思维能力,造就仔细专一的品质。而编程是新时代的语言与生存能力,即使是学校不减少这些教学内容,也会给孩子报相干的辅导班。 有些家长则持拥护态度。他们放心编程教育纳入课程后,会减少孩子的学习压力。另一方面,家长很难给孩子进行辅导,报辅导班无疑又会减少经济压力。 03 编程,到底该如何学? 尽管,编程教育已融入了中小学课堂,但它适宜每一个学生吗?专家们的认识或者能提供肯定的参考价值: 北京教育学院传授于晓雅:编程教育绝不是造就“码农”,而是造就学生的思维能力和形式,并最终解决生存中的理论问题。学生肯定有善于和不善于,但学习编程等于给孩子一个窗口,去测验本人是否善于。 北京师范大学传授吴晔:每个孩子都有本人的特长与趣味点,在中小学阶段,孩子能够依据趣味和能力学习编程,但没必要勉强,也不用焦虑。但编程教育进入基础教育是一个久远的过程,不能急功近利拔苗助长,须要做好顶层设计。 教育部教育信息化专家组秘书长、北京师范大学传授黄荣怀:编程可能无效造就学生的计算思维,然而也不能夸张这种作用。编程只是中小学信息科技课的一部分,随着技术的倒退,将来机器就能够编程,设计、提出并解决问题的创新能力才是咱们须要着力造就的。 中小学暑假邻近,课外兴趣班的宣传势头正猛,“少儿编程”类课程更是颇受热捧。培训机构在采购时习惯适度强调学习编程的价值,但作为家长,咱们务必要放弃沉着的态度: 在信息时代,咱们确实须要给孩子的学习提供一些条件,但这并不等于把编程学习作为竞技场,要求所有孩子都在编程上比拼。 作为父母,咱们要感性看待编程学习,不自觉跟风,不追时尚,不让“趣味”变质,成为教育的“桎梏”! 你的孩子接触编程教育了吗?对此,你有哪些认识?欢送留言探讨!

December 23, 2020 · 1 min · jiezi

关于编程:为什么现代系统需要一个新的编程模型

摘要:现在高要求的分布式系统的建造者遇到了不能齐全由传统的面向对象编程(OOP)模型解决的挑战,但这能够从Actor模型中获益。为什么古代零碎须要一个新的编程模型?Actor模型作为一种高性能网络中的并行处理形式由Carl Hewitt几十年前提出-高性能网络环境在过后还不可用。现在,硬件和基础设施的能力曾经赶上并超过了Hewitt的愿景。因而,高要求的分布式系统的建造者遇到了不能齐全由传统的面向对象编程(OOP)模型解决的挑战,但这能够从Actor模型中获益。明天,Actor模型不仅被认为是高效的解决方案——这曾经被世界上要求最高的利用所测验。为了突出Actor模型解决的问题,这个主题探讨以下传统编程的假如与古代多线程、多CPU体系架构之间的不匹配: 封装的挑战古代计算机体系结构中共享内存的错觉一个调用栈的错觉封装的挑战OOP的一个外围支柱是封装。封装表明一个对象的外部状态不能间接从内部拜访;它只能够通过调用一组辅助的办法批改。对象负责裸露爱护它所封装数据的不变性的平安操作。例如,在一个有序二叉树上的操作不容许违反树的有序性。调用者心愿放弃有序性,当查问树上一条特定的数据时,它们须要可能依赖这个束缚。当剖析OOP运行时的行为时,咱们有时候画出一个音讯序列图展现办法调用的交互过程。例如: 可怜的是,下面的图表没能准确示意执行过程中对象的生命线。实际上,一个线程执行所有的调用,所有对象的不变体束缚呈现在同一个办法被调用的线程中。更新线程执行图,它看起来是这样: 当试图对多线程行为建模时,下面论述的重要性变得显著了。忽然,咱们画出的简洁的图表变得不够充沛了。咱们能够尝试解释多线程拜访同一对象: 有一个执行局部,两个线程调用同一个办法。可怜的是,对象的封装模型不能保障执行这部分时会产生什么。两个线程之间没有某种协调的话,两个调用指令将以不能保障不变体性质的任意形式互相交织。当初,设想一下这个由多个线程存在而变得复杂的问题。 解决这个问题的常见办法是给这些办法加一个锁。只管这保障了在给定的工夫内最多一个线程将执行该办法,然而这是一个代价昂扬的策略: 锁重大限度了并发,锁在古代CPU体系结构中的代价很高,要求操作系统承当挂起线程并随后复原它的重负。调用者线程被阻塞,因而它不能做其余有意义的工作。在桌面利用中这是不能承受的,咱们心愿使应用程序的用户界面(UI)即便在一个很长的后台作业正在运行的时候也是可响应的。在后盾,阻塞是齐全节约的。或者有人想到这能够通过开启一个新线程补救,但线程也是一个代价昂扬的形象。锁引入了一个新的威逼:死锁这些事实导致一个无奈取胜的场面: 没有足够的锁,状态会被毁坏有足够的锁,性能受损并很容易导致死锁另外,锁只有在本地有用。当波及跨机器协调时,惟一可选的是分布式锁。可怜的是,分布式锁比本地锁低效几个数量级,并且限度了伸缩性。分布式锁协定须要在网络中跨机器的多轮通信,因而提早飞涨。 在面向对象语言中,咱们通常很少思考线路或线性执行门路。咱们常常把零碎设想成一个对象实例的网络,这些实例对象响应办法调用、批改本身外部状态、而后通过办法调用互相通信以驱动整个利用状态向前: 然而,在一个多线程的分布式环境中,理论产生的是线程沿着办法调用贯通这个对象实例网络。因而,线程是真正的运行驱动者: 【总结】 对象只能在单线程拜访时保障封装(不变体的爱护),多线程执行简直总会导致毁坏对象外部状态。每个不变体能够被处于同一代码段相互竞争的两个线程违反。尽管锁仿佛是对保护多线程时的封装很天然的补救,实际上,在任何事实利用中锁很低效并很容易导致死锁。锁在本地有用,但试图使锁成为分布式的,能够提供无限后劲的扩大。古代计算机体系结构中共享内存的错觉80-90年代的编程模型定义:写入一个变量意味着间接写到内存地位 (这在肯定程上混同了局部变量可能仅存在于寄存器)。在古代体系架构中,如果咱们简化一下,CPUs会写到cache行而不是间接写入内存。大多数caches是CPU部分公有的,也就是,一个核写入变量不会被其余核看到。为了使部分扭转对其余核可见,因而对于另一个线程,cache行须要被传送到其余核的cache。 在JVM中,咱们必须通过应用volatile或Atomic显式地批示线程间共享的内存地位。否则,咱们只能在锁定的局部拜访这些内存。为什么咱们不将所有变量标记为volatile?因为跨核传送cache行是一个代价十分昂扬的操作!这样做会隐式地进行波及做额定工作的核,并导致缓存一致性协定的瓶颈。(CPUs用于主存和其余CPUs之间传输cache行的协定)。后果便是升高数量级的运行速度。 即便对于理解这个状况的开发者,搞清楚哪个内存地位应该被标记为volatile或者应用哪一种原子结构是一门光明的艺术。【总结】 没有真正的共享内存了,CPU核就像网络中的计算机一样,将数据块(cache行)显式地传送给彼此。CPU之间的通信和网络中计算机之间通信的相同之处比许多人意识到的要多。传送音讯是现在跨CPUs或网络中计算机的规范。绝对于通过标记为共享或应用原子数据结构的变量来暗藏消息传递的层面,一个更标准和有准则的办法是保留状态到一个并发实体本地并通过音讯显式地在并发实体间传送数据或事件。一个调用栈的错觉明天,咱们经常将调用栈视为天经地义。然而,调用栈是在一个并发程序不那么重要的时代创造的,因为多CPU零碎那时不常见。调用栈没有逾越线程,因此没有对异步调用链建模。 当一个线程用意委派一个工作给后盾的时候会呈现问题。实际上,这意味着委托给另一个线程。这不是一个简略的办法、函数调用,因为调用严格上属于线程外部。通常,调用者(caller)线程将一个对象放入与一个工作线程(callee)共享的内存地位,反过来,这个工作线程(callee)在某个循环事件中获取这个对象。这使得调用者(caller)线程能够向前运行和执行其余工作。第一个问题是:调用者(caller)线程如何被告诉工作实现了?然而当一个工作失败且带有异样的时候一个更重大问题呈现了。异样应该流传到哪里?异样将被流传到工作者(worker)线程的异样处理器而齐全疏忽谁是真正的调用者(caller): 这是一个重大的问题。工作者(worker)线程如何解决这种状况?它可能无奈解决这个问题,因为它通常不晓得失败工作的目标。调用者(caller)线程须要以某种形式被告诉,然而没有调用栈去返回一个异样。失败告诉只能通过边信道实现,例如,将一个错误代码放在调用者(caller)线程本来期待后果筹备好的中央。如果这个告诉不到位,调用者(caller)线程不会被告诉工作失败和失落!这和网络系统的工作形式惊人地类似-网络系统中的音讯和申请能够失落或失败而没有任何告诉。在工作出错和一个工作者(worker)线程遇到一个bug并不可复原的时候,这个蹩脚的状况会变得更糟。例如,一个由bug引起的外部异样向上传递到工作者(worker)线程的根部并使该线程敞开。这立刻产生一个疑难,谁应该重启由该线程持有的这一服务的失常操作,以及怎么将它复原到一个已知的良好状态?乍一看,这仿佛很容易,然而咱们忽然遇到一个新的、意外的景象:线程正在执行的理论工作曾经不在工作被取走得共享内存地位了 (通常是一个队列)。事实上,因为异样达到顶部,开展所有的调用栈,工作状态齐全失落了!咱们曾经失落了一条音讯,只管这是本地的通信,没有波及到网络 (音讯失落是可冀望的)。【总结】 为了在当下零碎实现有意义的并发和性能,线程必须以一种高效的、无阻塞的形式互相委派工作。有了这种工作委派并发形式(网络/分布式计算更是如此),基于栈调用的error解决生效了,新的、显式的error信号机制须要被引入。失败成为畛域模型的一部分。工作委派的并发零碎须要解决服务故障并且有原则性的办法复原它们。这种服务的客户端须要晓得工作/音讯会在重启中失落。即便不失落,一个响应或者会因为队列 (一个很长的队列) 中先前的工作而产生任意的提早,由垃圾回收造成的提早等等。在这些状况下,并发零碎应该以超时的模式看待响应截止工夫,就像网络/分布式系统一样。本文翻译自https://doc.akka.io/docs/akka/current/guide/actors-motivation.html 本文分享自华为云社区《【Akka系列】之 为什么古代零碎须要一个新的编程模型? 》,原文作者:荔子 。点击关注,第一工夫理解华为云陈腐技术~

December 23, 2020 · 1 min · jiezi

关于编程:为什么你该学习编程了

有一家饭店的大厨,烧得一手好菜,通过口碑相传,客人从四面八方闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想方法留住这位大厨,否则他一旦被他人挖走,饭店的生意就会一泻千里了。然而即使老板不惜血本保障了大厨的忠诚度,危险也仍然存在: 大厨劳动或销假的时候,菜品的口味就无奈让顾客称心;大厨只有一个,如果想在多个中央开分店,那口味也就不能保障了; 大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输入总是供不应求; 大厨年纪大了总是要退休的,如果收徒的话,怎么持续保障师傅的忠诚度呢?      有一天,老板忽然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨自己。如果大厨违心把本人每个菜的菜谱都写进去,那不就能够请别的厨师来操作了吗?尽管他人依照菜谱烧出来可能达不到原味的100分,但90分总是能达到的,而这样的差距是个别的食客无奈分辨的。这样只有菜谱在,饭店菜品的品质就能失去保障,扩张店面、开分店什么的就都不成问题了。      于是老板和大厨谈了一个早晨,压服了他把菜谱写进去,而后用菜谱技术入股分成。于是大厨一边炒菜一边解说,让助手把菜谱记下来,交给了老板。老板于是请别的厨师拿着菜谱如法炮制,大厨验收并领导批改菜谱,如此这般数次之后,菜谱就定稿了。      几年后,饭店生意越来越好,开了有数家分店,老板赚了很多钱,大厨也失去丰富的分成,不必再天天靠手艺吃饭了。起初有一位厨师把菜谱偷传了进来,于是这道菜就红遍了大江南北……      故事讲完了,你有什么播种吗?      什么是编程?     在洗衣机呈现之前,人们只能用手来洗衣服,须要通过浸泡、揉搓、漂洗、拧干的一系列流程。而全自动洗衣机的创造使洗衣服的工作人人都能够轻松实现,从而能够将本来用来洗衣服的工夫解放出来去做其余事件。随着洗衣机的一直迭代降级,洗衣服的整个流程最终会被人们忘记,只有设计洗衣机的工程师们理解流程,因为他们负责对其进行优化和改良。      大厨炒菜的过程,和洗衣服的工序,都是流程。什么是流程呢?流程就是_为了_实现一个需要而设计的形式逻辑。而程序就是记录并承载流程的媒介。记录炒菜流程的菜谱,和洗衣机主控芯片里记录了洗衣工序的软件,都是程序。不同的是,菜谱由人来执行,而洗衣工序由机器来执行。      咱们能够再举几个例子: 打太极拳的套路是流程,而记录这些套路的拳谱是程序;用钢琴弹奏曲子的指法是流程,而记录这些指法的钢琴谱是程序;老师备课时设计的教学过程是流程,而记录这些过程的教案是程序;……     将炒菜的过程写成菜谱,就是在编写程序,也就是编程。如果你已经记录过相似流程的货色,没准可能是作息时间表(记录了每天必做事件的程序列表)或者交通路线图(记录了去某地的行程),那么其实你曾经在编程了。      所以,编程真的没有那么神秘,对吧?      通过编程,咱们更加透彻地了解并论述了事物的实质,让已经专属于某个人、某个个人、某个中央甚至某个时刻的货色,得以独立的存在和倒退。尽管程序的执行成果未必能让其设计者称心,但它曾经能够脱离设计者而存在,能够被其他人执行、验证和改良。从这个角度来讲,说编程是在发明生命也不为过。      编程能够说是一种标准化的写作。标准化保障了服务和产品的品质,也使大规模复制和扩张成为可能。KFC正是依赖其详尽到炸薯条的油温、秒数的食品加工手册,才将分店开满世界各地的。陶华碧如果不能将她的豆瓣酱配方和制作过程分明地形容进去,交由标准化生产线去制作的话,那么明天“老干妈”最多只是一个小农村里的作坊级产品,不可能走上咱们的餐桌。      咱们每天的生存,都在和各种技术产品和服务打交道,比方导航、搜索引擎、聊天软件……你可曾想过,这些产品和服务背地的原理是什么?置信除了程序员群体之外,绝大多数人不会去想这些问题,因为: 这跟我没有关系啊!我又不去干这行……应该只有专业人士能力搞懂吧,我可不行! 能用就行了,想那么多干啥,多累呀!      他们这么想并没有错,因为编程的实质就是:设计一个逻辑流程来实现指定的需要,使调用者无需理解实现细节即可达到目标。  因为程序和编程的狭义概念太过抽象,为不导致概念混同,下文中提到的“程序”和“编程”,特指应用计算机编程语言编写,由机器来运行的程序。     解放工夫和注意力     假如你曾经在某岗位工作了一段时间,依据经验总结进去每天上班前有上面三件事须要做: A、在公司内网零碎查问某业务当天的数据(约10分钟)B、整顿成日报表并存档(约15分钟) C、把几个外围数据用电子邮件发送给领导(约5分钟)      你能够在认真梳理过之后,将这个流程写下来,贴在办公桌前,或者记在脑子里。这天然比那些不晓得流程的人要强得多,你能够确保每个步骤都不被脱漏地执行到(然而这并不能齐全保障)。尽管你曾经花了工夫认真思考过,但每天这样枯燥乏味的流程都须要本人执行一遍……等等,这活我不能够找个秘书来干吗?      当然能够,雇佣别人是一种用金钱换工夫的解决方案。然而这同时又引入了许多新的问题: 你须要花钱(废话)你须要把要做的事解释给秘书听,并确保他能听懂(沟通老本) 秘书上班或休假时,这些事你还得本人做(有工夫限度) 你要为秘书犯的谬误承担责任(品质得不到保障) 每次秘书犯了谬误,你都须要进行教育(培训老本) 秘书会间接接触业务数据和信息,难保有泄密的可能(安全隐患) 换一个秘书,以上的事件都得再来一遍…… ...

December 21, 2020 · 1 min · jiezi

关于编程:2020年快过完了要学习的编程语言和框架还没有学完那还要学吗

话不多说,间接上正片,小编举荐的7种编程语言和框架: 举荐给充斥学习激情的程序员和准程序员们为你的应用程序抉择适合的编程语言或框架不仅会影响开发速度和开发周期,而且还会影响你将来职业倒退的广度。 在这里,我将分享 2021 年你还能持续学习理解的 —— 8 种编程语言,并且在将来几年与你非亲非故。如果你还在为前端或后端抉择哪一门编程语言而苦苦挣扎或激情于此,那么这篇文章非常适合你。 1. Java/Kotlin —— Spring 框架很多人可能会问为什么是 Java?Java 仍然存在?还在风行?答案是必定的。抉择学习任何一门编程语言都不仅仅是基于风行水平或者它诞生的工夫。无论你喜不喜欢,Java 依然是一门企业规范的编程语言,并且失去了宽泛的使用。工作机会也是咱们抉择学习编程语言时要思考的因素之一。 Kotlin 是一门具备类型推断的跨平台、动态类型和通用的编程语言。Kotlin 旨在与 Java 齐全互操作,并且它规范库的 JVM 版本依赖于 Java 类库,然而类型推断容许它的语法更简洁。Kotlin 由推出 IntelliJ IDEA 的 JetBrains 公司在 2010 年创建,并从 2012 年开始开放源码。 Spring 框架是最风行的 Java 开源框架之一。它面向开发人员,并且提供了一个全面、灵便的框架。Spring 5.0 之后的版本为 Kotlin 提供了专门的反对,人们总是将 Kotlin 与 Java 进行比拟。对于 Spring 框架来说,既然两种语言都有它的长处和毛病,为什么不把两者联合起来呢? 借助 Internet 上的扩大、资源和文档。使得开发人员能够更轻松的找到并增加与之不同类型的第三方应用程序集成所需的依赖项。 Spring 框架最受欢迎的产品:     ✿ Spring Boot 旨在以起码的后期配置实现尽快的运行     ✿ Spring Cloud 旨在简化分布式和微服务格调的架构     ✿ Spring Cloud Data Flow 是用于创立可组合数据微服务的对立服务 哪些地方可能须要用?当:     ✿ 构建企业级应用程序 ...

December 15, 2020 · 2 min · jiezi

关于编程:33-岁大叔靠发-Twitter-成为工程师自学编程从工厂走进写字楼

没有一技之长的 33 岁大叔如何抚养 6 个孩子? 为了改善妻子和孩子们的生活状况,Will Johnson 投了上万份简历,但都杳无音信。即便自学了编程,也没有一个公司违心聘用一个毫无教训的工程师。 可他却用 8 个月工夫,靠发 Twitter 失去了一份高薪的工程师工作。 简历每每被拒,求职无门在成为 egghead.io 社区的工程师之前,Will Johnson 只能在工厂和呼叫核心做着 12 小时轮班的机械工作。尽管这些工作的难度不高,但却占据了他全副的工夫,而且只能拿着微薄的薪水。 为了能让这个八口之家过上体面的生存,Will Johnson 利用轮班之外的闲暇工夫学习了编程。他本认为有了一技之长就能够改变命运,但事实是残暴的,他投出的简历都被以没有工作教训为由回绝了。 一次次的被拒让 Will Johnson 的心田感觉刺痛,但他不愿就此放弃,他本该有机会解脱目前生存的窘境。 传统的办法行不通,于是他开始另辟蹊径。被回绝是失常的 ,因为没有人违心冒险用一个毫无教训的人,所有求职者都能够说本人在软件开发方面非常怠惰,而且充斥了激情。但这相对是不够的,Will Johnson 抉择通过社交媒体展现本人的能力和激情。 发 Twitter 立人设,胜利找到工作第一步是创立一个 Twitter 账户,Will Johnson 开始在那里公开记录本人的学习过程。尽管关注者为零,而且他基本不意识任何一个从事技术工作的人。然而他仍不停的更新着本人正在浏览的书籍、所学的课程,他还把本人学习的常识做成图片上传,Twitter 就是他学习编程的动静档案。 为了让更多人看到本人的 Twitter,Will Johnson 会在公布本人浏览的书籍和所学的课程时创立与这些作者和老师相干的标签。这些创作者喜爱看到人们从他们的创作中取得价值,这实际上也为他们提供了帮忙。 从 2 月到 10 月,Will Johnson 始终在手不释卷的经营者本人的 Twitter。在这个过程中,他意识了很多技术从业者,通过一直的互相介绍,他在社区中开始越来越被熟知,甚至取得了在一个面向高级开发人员的国内会议上发言的机会。 终于,Will Johnson 的能力被须要他的人看到了,他进入了 egghead.io,成为了一名真正的工程师。 Will Johnson 说:“我不经意间所做的就是在社区中为本人建设了良好的名誉,对我而言,这笔任何简历都有用。” 社交媒体是开发人员展现本人的工具通过社交媒体找到工作的不止 Will Johnson 一个,Twitter 上的另一位开发人员 Kyle Shook 始终在公布一些十分酷的 CSS 动画,他投入了大量的工夫来制作这些精美的动画,最终也失去了回报,失去了一家公司的邀约。 ...

November 2, 2020 · 1 min · jiezi

关于编程:来喽来喽Python-39正式版发布了

摘要:2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式公布了。2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式公布了。咱们来一起来看看,这个版本有哪些好玩的新个性,以及对咱们部门目前的产品可能会带来哪些影响。 因为jupyter notebook/lab等工具还没有相应适配到python 3.9,所以咱们还无奈应用,因而本文就应用python 的交互行来演示。 Python 3.9 官网文档,What’s New in Python 3.9,其文字组织的很好,咱们接下来也依照这个程序来解说,顺次是,release highlights, new features, new modules, improve modules, optimizations, deprecated, removed.大家留神看下,这个文字组织程序,其实在咱们产品公布时,也是实用的。先讲这个版本有什么吸引人的highlights,而后介绍新版本的新内容,最初介绍deprecated / removed,揭示大家降级时须要留神什么,条理很清晰。 装置到2020年10月9日为止,anaconda上还没有任何channel反对对python 3.9的间接装置,所以想尝鲜,有2种办法: 1.到http://python.org上下载安装包 2.到anaconda的conda-forge channel下载安装文件 咱们应用第二种办法,安装文件下载链接见 References。 $ conda create -n py39 -c conda-forge -y $ conda activate py39 $ conda install python-3.9.0-h60c2a47_1_cpython.tar.bz2 $ which python /d/Anaconda3/envs/py39/python $ python -V Python 3.9.0Release HighlightsPython 3.9 内容包含: 3个新的语法个性1个新的内置个性2个新的规范库个性6点解释器晋升2个新的库模块如果把以上所有内容都过一遍,可能须要1-2小时。咱们这里就挑一些与咱们部门产品开发相干的内容,具体来讲一讲,其它内容如果有趣味,能够自行去读读。 New FeaturesDictionary Merge & Update Operatorsdict类提供了merge (|) 和 update (|=) 操作符。 ...

October 12, 2020 · 4 min · jiezi

关于编程:5-幅插图-让你轻松看懂面向对象编程的SOLID原则

如果你相熟面向对象的编程,那么可能曾经据说过SOLID原理。SOLID是针对面向对象编程和设计的五大依赖关系治理,每个字母代表另外一个三个字母的首字母缩写,用来形容一个准则。这五项软件开发准则是构建软件时要遵循的准则,以便于零碎扩大和保护。这项准则失去软件工程师Robert C. Martin的同意。在其余网站上有太多对于SOLID的精彩文章,但我很少看到带有图片的示例,这使得像我这样青睐用图片记忆的人在学习上变得有些艰难。因而,本文的次要目标是通过插图强调每种原理的指标,帮忙大家更好地了解这些原理。你可能会看到,其中一些准则看起来很类似,但它们的指标并不相同。 留神!你大能够违反一个准则来满足另一个准则。为了使此操作更简单明了,我将应用“Class”一词,但请留神,本文中它也能够作为主体利用于函数、办法或模块。当初,让咱们开始吧!S —Single Responsibility(繁多责任)Class应负繁多责任。 图释: 谬误示范——我是一名厨师、园丁、画家和司机;正确做法——四个Class别离负责厨师、园丁、画家和司机。如果一个Class承当许多职责,便会减少产生谬误的可能性,因为对其中一个Class进行更改可能会在您不知情的状况下影响其余角色。指标:该准则旨在辨别变量,以防因为更改而产生谬误,这样当前批改就不会影响其余无关的行为啦。O —Open-Closed (开闭)Class该当在凋谢的时候进行编程扩大,关闭的时候进行批改。 图释: 谬误示范——我能做”Cut”这个动作->关闭后-> 批改成能做”Paint”;正确做法——我能做”Cut”这个动作->关闭后->扩大成能做”Cut”和”Paint”两个动作。更改Class的以后行为将影响应用该类的所有零碎。如果要让Class执行更多功能,现实的办法是将性能增加到曾经存在的性能中,而不是间接更改Class。指标:该准则旨在扩大Class的性能,而不扭转特定Calss的现有性能。这是为了防止在应用Class的任何中央引起谬误。 L — Liskov Substitution(替换)如果S是T的子类型,则能够将程序中类型T的Class替换为类型S的Class,这样就无需更改总程序内的任何所需属性。 图释:有一对父子Sam和Eden,有人心愿Sam 做一杯咖啡 谬误示范——父亲Sam不在场时,工作便生效;正确做法——继承工作给儿子Eden。当子类无奈执行与其父类雷同的操作时,可能会导致谬误。如果您有一个类并从中创立另一个类,则该类将成为父类,而新的类将成为子类。 子类应该可能执行父类能够做的所有事件。此过程称为继承。子类应该可能解决与父类雷同的申请并提供雷同的后果,或者它能够传递雷同类型的后果。图中父类提供咖啡(能够是任何类型的咖啡)。 子类交付Cappucino是能够承受的,因为它是一种非凡的咖啡,然而交付水是不可承受的。如果子类别不合乎这些要求,则意味着子类别已齐全更改,并违反了这一准则。指标:该准则旨在增强一致性,以便能够以雷同的形式应用父类或其子类,而不会呈现任何谬误。 I —Interface Segregation(接口隔离)不应强制客户依赖他们不应用的办法 图释: 谬误示范——用凌乱的办法去作排列 -> 无奈应用;正确做法——用简洁的办法去作排列 -> Awesome!当要求一个Class执行无用的操作时,这是节约的,并且如果该Class没有能力执行那些操作,则可能会产生意外的谬误。Class应仅执行其职责所需的操作。如果未来其余Class可能会负责到其余任何动作,则应将其彻底删除或移至其余地位。指标:该准则旨在将一组动作分成较小的一组,以便Class仅执行其所需的一组动作。 D —Dependency Inversion(依赖倒置) 高级模块不应依赖于低级模块,两者都应取决于abstraction;abstraction不应依赖细节,细节应取决于abstraction。 图释: 谬误示范——我用特定工具来工作;正确做法——我用任何给我的工具来工作。首先,让咱们更简略地定义此处应用的术语: _高级模块(或Class)_:应用工具执行动作的Class;_低级模块(或Class)_:执行操作所需的工具;_形象abstraction:_示意连贯两个Class的接口;_详细信息_:该工具如何工作。该准则表明,不应将Class与用于执行动作的工具交融在一起。而是应将其与容许工具连贯到Class的接口交融。它还阐明,Class和接口都不应该晓得工具的工作形式。然而,该工具须要满足接口标准。指标:该原理旨在通过引入接口来缩小高级模块对低级模块的依赖性。总结到目前为止,咱们曾经探讨了这五个准则并突出了它们的指标。它们将帮忙你使代码易于调整、扩大和测试,达到完满的境界。最初,非常感谢你的浏览。 我心愿你能对这个主题造成一个更好的概念,并且浏览时和我编写代码时一样开心。????原文链接:https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898以上信息来源于网络,由“京东智联云开发者”公众号编辑整理,不代表京东智联云立场 [浏览原文]

October 10, 2020 · 1 min · jiezi

关于编程:谁常说这-9-句话你基本可以肯定-TA-是程序员了

程序员日常说得最多的话在外人看来可能会很奇怪,其实是因为工作的环境限度,工夫长了就成了习惯,个别最常见的就是上面这 9 句话。1、别更新了,学不动了。 2、我不会修电脑,谢谢。 3、据说今晚不必加班。 4、是你的网络有问题。 5、清一下缓存再试试 6、扫码提需要,谢谢。 7、换一台设施试试看。 8、保障今晚十点上线。 9、键盘给你,你来写。

September 27, 2020 · 1 min · jiezi

关于编程:100队伍逐鹿大奖创新编程挑战赛秋季赛圆满落幕

就在上周末,SegmentFault 思否策动承办的RTE 2020 编程挑战赛秋季赛的决赛在线上圆满闭幕了。本次秋季赛的赛题只有一个,参赛者能够依据本人的创意,基于声网Agora SDK、 声网Agora 实时音讯 RTM SDK、云录制 SDK 等 SDK 实现实时互动利用,或在已有的我的项目中实现实时互动场景。 绝对秋季赛,只管赛题减半,但参赛选手激情不减,仅一个赛道便有近 260 名开发者报名参赛,组成了 100+队伍,最终 20 个作品进入决赛问难。 与秋季赛一样,这次的决赛和颁奖都是通过 Agora Video Call App 在线上进行的,同时通过 B 站全程对外直播。 最终,决赛一共产生了一、二、三等奖各一支团队,还有两支团队别离取得了最佳创意奖和最佳实用奖。 获奖名单:一等奖:Storyteller 二等奖:AR Assistance 三等奖:Codesync 最佳创意奖:Touch Fish Artifact 最佳实用奖:Post-it Notes 上面让咱们一睹获奖作品的风采! 一等奖:Storyteller这是一个交互式 Demo 的编辑器,借助了声网Agora SDK 的能力,实现了多人实时协同编辑以及云端录制音视频。         在传统的教学视频中,都会演示很多交互的步骤,比方实现某一步后点击哪个按钮,接着输出代码等。绝对于其余演示 Demo 的形式的优缺点,参赛者也做了比照:        Storytell 无需编写代码,任何人员能够应用,反对多人协同,而且可为交互式 Demo 增加多种特效。另外,基于声网 Agora 录制 SDK,还能够在为演示 Demo 录制以视频旁白。  二等奖:AR Assistance取得第二名的团队中有一位开发者有多年的 AR 互动软件开发教训,并有多款 AR 利用和 Kinect 交互利用上线。所以这次他们的作品就是将 AR 与 RTC 联合到了一起,做了一个 AR Assistance。 ...

September 22, 2020 · 1 min · jiezi

关于编程:近-50-种花式-Hello-World你会几种

本文转自公众号CSDN(ID:CSDNnews)作者:Sylvain Saurel,译者:风车云马,责编:屠敏,原文链接:https://medium.com/javarevisited/70-years-of-hello-world-with-50-programming-languages-2400de893a97导读:历经 70 年,一直呈现的编程语言为开发者解决了哪些难题?其存在又有怎么的个性?本文将以「Hello, World」为例,花色出现 50 种编程语言。 当咱们学习一门编程语言时,都是从“Hello, World!”开始。所有程序员在其职业生涯中,都至多接触过一个经典的“Hello, World!” 程序。通常程序员会应用多种编程语言,多的甚至实现了十几种。 还有一种称为TTHW(Time to “Hello, World!”)的办法,来掂量程序员创立一个新的“Hello, World!”程序的工夫。 你能够用多少种不同的语言编写一个“Hello, World!”程序,你的答案是什么? 让咱们在计算机编程的世界里回顾一翻。我会向你展现50种不同编程语言编写的“Hello, World!”程序。同时让你看到计算机编程语言随工夫的演变。 01 汇编语言- 1949汇编语言创立于1949年。上面我介绍一种经典的汇编语言,实用于Intel 8080 8位处理器,该处理器起初在1974年4月正式推出。 bdos equ 0005H ; BDOS entry pointstart: mvi c,9 ; BDOS function: output string lxi d,msg$ ; address of msg call bdos ret ; return to CCPmsg$: db 'Hello, world!$'end start02 Fortran - 1957Fortran编程语言是Formula Translation的派生。它是一种汇编命令式程序设计语言,特地适宜于数值计算和科学计算。Fortran语言创立于1957年,用这种语言写的“Hello, World!”: PROGRAM HelloWRITE (*,*) 'Hello, World!'STOPEND在Fortran 90或95版本中,程序“Hello, World!”能够这样写: ...

September 15, 2020 · 3 min · jiezi

关于编程:不懂什么叫编程

本文作者:刘超,原文地址:https://cnblogs.com/flame7/p/9110579.html,如有侵权,则可删除。工夫一晃而过,大学毕业转眼间曾经工作9年了,总结一下本人这些年来感触。 与程序打交道的人生,是简略的人生一次做规划局的我的项目,规划局的职员很是钦佩地说:“你们真了不起,在电脑上敲敲键盘就能做出软件来。”, 规划局领导说:“跟电脑打交道是最简略的,难的是跟人打交道。”。 领导的话很有深意,一语道破了实质,做程序的人,是比较简单的。 不懂什么叫编程大学本科,读“计算机科学与技术业余”(置信看这篇博客的人多半也是学这个业余的 ^_*),课程重实践而轻实际。 最后学习C语言,对于编程没有任何概念,我分明的记得,一次在课堂上问老师:“计算机输入法,可视化操作界面曾经很欠缺了,为什么要用C语言中 Print() 函数输入一段字符呢?而且咱们学习应用Console控制台的黑白屏输入输出,也不像是平时应用的软件啊?”。 老师听后也是一脸的懵逼,说:“你好好学,缓缓就明确了”。 你不懂的,老师也没法答复你,只有靠本人缓缓地摸索,缓缓去领悟。 Java还是C#,平台抉择的爱恨情仇初学Java,这是我接触的第一个最具备实用意义的编程语言(能够做网站,做软件,尽管C语言,C++也能够开发应用软件,但毕竟应用的人较少,对于初学者,找到一个适合的教程都艰难)。 过后的学习,根本是自学,上网下载视频教程,一集一集地看,不懂的概念上网查,去图书馆借阅相干书籍材料。 什么JSP标签,Servlet,JDBC,到Struts MVC,Hibernate,Spring,设计模式,半年工夫,算是初步入门,只管对常识还是只知其一;不知其二,但还是胜利用Java做了毕业设计,做过几个小程序。 工作之后,开始应用C#,算是与.NET平台结缘,一行一行地敲代码,一个接一个的做我的项目,一版又一版的降级软件,一晃9年了。 从最后的ASP.NET WebForm,ADO.NET,到ASP.NET MVC,WebAPI,EntityFramework,面向服务架构的WCF,以及最新的跨平台.NET Core,微软为软件开发人员,提供了编程最大的便利性。 仅从开发语言自身角度讲,C#并不比Java差,并且很多轻微的中央,C#比Java做的要好,比方,C#中的get,set属性拜访,要比Java的字段拜访不便很多,雷同逻辑代码运行效率方面,C#的MSIL比Java的字节码容许效率还要略微高一些,然而无奈,.NET平台倒退始终不迭Java平台。 诚然,平台的倒退不能仅从开发语言自身思考,平台运行环境,平台参加人员整体程度,应用老本等,更是起着决定性作用。 .NET平台在互联网大潮中,逐步被边缘化,收费的Java平台,被开源社区拥抱,成为互联网我的项目开发平台的中流砥柱。微软仿佛意识到问题所在,逐渐退出开源队伍,并提供了跨平台计划.Net Core。 前端编程,JavaScript从无知到沉睡 做Web开发,离不开HTML,CSS,JavaScript,只管日常工作当前台开发为主,但接触的多了,缓缓地了解深刻。 从只会应用JS写函数,倒退到应用JS面向对象的性能,了解了JS中闭包的概念(好烧脑,用离散数学中的概念来示意函数汇合,让没学过汇合概念的同学情何以堪)。 明确了JS的面向对象编程,通过JS自定义前端控件,数据与逻辑代码拆散,达到优雅地实现前端逻辑。 学习的过程是波折的,有时候一个概念始终了解不了,但一旦明确过去,会有一种眼前一亮,恍然大悟的感觉。 起初始终不明确,为什么JQuery中的“$”这么牛,一个“$”符号能操作所有,读过JQuery源码之后才明确,这个“$”原来是jQuery在Window中定义的的一个变量,同时也是jQuery这个函数的别名,每次调用$(...)时,其实间接地创立了一个JQuery的实例。 当然,这种操作得益于JS是始终动静语言,能够给对象任意增加属性和办法(相比拟Java和C#是不能这样操作的)。 技术之路要一直学习,路漫漫其修远技术更新迭代的速度,远超设想,往往是刚学会一个新技术,另一个更新的技术又变的炽热,仿佛新技术的产生,也在遵循一个摩尔定律。 追赶技术的脚步,就如同夸父追日个别,你始终在追赶,但它始终在你后面。好在,每一个新技术,新架构的产生,都是在为更简略、更高效的解决现有的问题。 所以,新的技术,尽管减少了学习的累赘,然而新技术的利用,可能解决事实的问题,是效率的晋升。从这个角度讲,学习是值得的。 通常来说,没有谁天生就会做什么,只有肯学习,他人能做到的,你也能做到。 React炽热的时候,学习React,理解了这种基于模板的开发方式,见识了这种相似于MVC,实现数据与业务逻辑拆散的编程形式在JS中的理论利用,对于这种仅须要一个render()函数的超简洁的框架赞叹不已。 Facebook搞出了React,国人也不逞强,于是诞生了Vue,相对来说更简洁,应用更不便。 React倒退出了React Native,圈子里更是为之振奋,为炽热的挪动端开发又添了一把柴,让挪动端开发,在Android和IOS原生开发之外,又多了一种全新的抉择。 我用3天工夫,学会了开发微信小程序,实现了原有Web性能向小程序的移植。 Node.JS炽热的时候,我用了一周的业余时间,学习NodeJS编程,配合MongoDB,搭建了简略的日志零碎。 说起来有点吹牛的意思,但却是事实。 一方面,不论是React,微信小程序,Node.JS,实质上都是JavaScript,Html,CSS的组合应用,类似度很高,只是各自有各自特点的标准特色而已,学习难度是逐步升高的。 另一方面,我置信大多数人也有感触,当工作教训,认知程度达到肯定积攒之后,学习其实是一件瓜熟蒂落的事件。 总结有一次跟敌人聊天,敌人说,“感觉本人越学习,越感觉到不懂的方面更多了”。 我笑笑,表示同意他的观点,这是一个叫做“常识边界”的问题。 每个人的常识,就如同是一个圆,圆内是你曾经理解的常识,圆之外就是还不懂的常识,一个人把握的常识越多,这个圆也就越大,而圆越大,圆周所接触的那些未知领域也就越多。 如果一个人说本人没有什么不懂的,那只能阐明他知识面太小。 如此,当咱们意识到本人有很多不懂的货色的时候,也不必焦虑,因为咱们的常识在扩大,放弃一颗凋谢,学习的心,这是人生路上所必须的。

September 10, 2020 · 1 min · jiezi

关于编程:教师节送什么老师最开心程序员三招解决家长送礼难题

摘要:三个臭皮匠顶个诸葛亮,三个程序员在一起那作用可就大了。2020年9月8日,HR王姐忽然在家长群里收到了一条孩子幼儿园老师发来的音讯,登时略感焦虑: 内容截图 碰巧,公司的3位程序员GG来办公室递资料,见到王姐一脸笑容,问道:“您这是咋啦,大早上的不开心?” 王姐就把手机信息拿给他们看,说道:“这不往年儿子刚上小学,本想借着这个教师节,给他们班主任示意一下,也留个好印象。可学校出了这么一个不能送礼的告诉,那我怎么让老师明确我的情意呀?” 说完,程序员GG们相视一笑,“就这事儿?想跟老师表白情意?形式有很多种啊,咱们给你整个最酷炫的!然而中午这顿大餐是少不了哈哈。” “你们能帮我搞定?走,到会议室通知我怎么解决,我这就打电话订餐位。” 四人来到会议室,只见研发小刘一顿操作猛如虎,10分钟后,他把电脑屏幕推过来:“王姐,我刚给你写了两个给老师的祝愿小利用,你快看看?” 主动绘画祝愿 “老师关上这个利用,就会看到主动绘画出的祝福语【教师节高兴】。 另外,还有这个弹窗式的祝愿利用。 弹窗式祝愿 你看这两个怎么样,等教师节那天发给老师,给他们一个惊喜?这是代码,咱还能够改祝福语的哦!” 弹窗式祝愿代码 “我看你这是惊吓,好么。”研发小陈看完小刘的演示,立马反驳道:“你这弹窗,几乎就跟中了病毒似的,怎么能当成礼物送出去呢?” “王姐,教师节是给每天都很辛苦的老师的节日。古有三行情书,明天咱们能够用三行代码献礼教师节!”小陈说道,就在那咔咔敲键盘。王姐边看屏幕,边念道: if(dream==distance)&&(road==river){ //梦是远方 //路线为河 teacher.birdge(); //老师就是桥梁 }intday; //一日师长 for(day=0;day //一期缘分 printf("Youare always my guide."); //一世恩情everyBoy=aFlyBird.wafting(far).alone(); //我曾是孤独的飞鸟 nowBoy= everyBoy.flying(long); //在暗淡的天空单独航行 realLife= nowBoy.meet(you); //见到你才有了人生的方向booleanisMagic=true; //我能想到最美妙的事 while(I.grownup){ //是长大后 I.become(U); //我就成了你 }敲完这些内容,小陈问道:“王姐,你看这怎么样?咱用代码写诗,独具创意。你儿子拿出去也显得不同凡响。” 王姐看完:“这个感觉挺不错的,用代码写祝愿很有创意。可就是不晓得老师懂不懂这些代码呢?” “你看你俩这想法,一个比一个离谱,一点都没切中要害。咱们送礼物,要去想她当下最须要什么?”研发小宋在那一脸厌弃的说道。 “老师须要什么?你晓得吗?”小刘不屑。 “王姐的儿子刚上二年级,二年级的数学是要开始学乘数法,坚固加减法的学年。平时,老师必定会常常给学生出一些数学题。尽管这事简略,但见不得隔三差五的就出一二十道题。”小宋悠哉的说道。 “我这边给你筹备了一个‘小学生加减乘除口算考试题卷主动生成小利用’。老师只有有了这个,齐全不必对出题发愁了。” 王姐听完眼前一亮,“快展现给我看看。” 小宋立马就在那边演示边解说, 这个利用是利用Python开发的一套小利用,应用程序外围性能: 1.能够设置各算数项和后果的取值范畴及多步算数符号的抉择,能够生成求后果、求算数项、带括号的算式,可反对3步算式题 2.能够简略设置文档题目,小标题。设置生成的口算题文档个数 应用办法:确定本机反对python3.6.1以上版本 装置.docx模块,装置wxPython模块 装置办法: 下载程序进入主目录,终端下运行 python App.py 批改运算项和后果范畴里的数值,多步运算请增加批改须要的运算符号: ...

September 10, 2020 · 1 min · jiezi

关于编程:国内禁用全球最火的少儿编程语言-Scratch-凉了其平台辱华被举报

要说当初最火的儿童教育可能就是编程了,如同孩子不学个编程都不好意思上学一样。当初的青少年编程培训和编程机器人市场能够说十分火爆,甚至有点当初家长们一窝蜂的让孩子学奥数的架势。 Scratch 就是中国大陆少儿编程课程采纳的支流软件,是由麻省理工开发的,曾经被宽泛应用了十几年。然而最近,Scratch 却因为社区内的辱华文章和舆论被国内中小学纷纷抵制,甚至下发告诉严禁培训课程中应用 Scratch。 涉嫌辱华,Scratch 被禁原来是有家长发现麻省理工 Scratch 社区内有辱华的文章,被家长举报后,此事受到了高度关注,Scratch.mit.edu 的官网很快就无奈失常拜访了,各大少儿编程教育的群内也纷纷发放告诉紧急排查 Scratch 编程课程的相干内容,禁止所有线上线下的课程应用这个软件。 除了官网无法访问,Scratch 离线版中的翻译、语音辨认,和与硬件连贯的扩大模块等相干扩大性能都不能再应用了,因为这些性能都须要拜访麻省理工的服务器。 国家教材委员会办公室也下发了告诉,要求排出学校应用的教材中是否有相干课程,或者有疏导学生到 Scratch 社区学习的内容。 或被永恒禁用,离线版本临时可持续应用Scratch编辑器可在寰球每个国家/地区应用编码器,并提供50多种语言版本,可下载并离线应用。据统计,寰球有将近 6000 万儿童应用 Scratch,其中有 300 万左右来自中国,还有很多基于 Scratch 开发的衍生产品在国内风行。 尽管是被学生家长举报的,但有不少用户为 Scratch 叫屈,有人指出,Scratch 就是个编程工具不是平台,社区官网呈现的文章和舆论与它无关。目前,曾经装置了该软件的中国用户能够临时持续应用它。 当初很多学校和培训机构都在应用 Scratch,它也是许多支流较量官网指定的软件。目前尚不分明该限度是否会扩大并妨碍软件的将来版本更新。 只管 Scratch 在中国很受欢迎,但近年来也有不少国内竞争者涌现,如果 Scratch 在国内被永恒禁用,肯定水平上也会减少对外乡替代品的反对。 青少年学编程能够造就孩子的运算思维和协同能力,是国内外当初都很提倡的一种教育形式,这几年在国内也开始流行起来,不少国外的编程软件和平台也开始进入国内,受到了不少家长的追捧。 但少儿编程面对的是正在建设常识体系和价值观的青少年,他们须要正确踊跃的疏导。技术是凋谢的,但在引入技术的同时,要尽量排除不良影响的呈现。

September 9, 2020 · 1 min · jiezi

关于编程:学编程还能抽美男IT-就职网站推出女性向编程游戏

无心写代码只想玩游戏?不想改 bug 只想看美男?兴许,程序媛的欲望能够实现了。 有个叫 paiza 的日本 IT 就任网站推出了一个女性向育乐页游《和“我推”一起学编程》,有点相似一些抽卡的养成类游戏,只不过游戏情节改成了学习编程的内容。 这个游戏中包含了Java、JavaScript、PHP、Python、Kotlin、Ruby、C、C++、C# 9 种编程语言。玩家能够在游戏中抽不同性情的“美男卡”,和美男工程师一起学编程,还能给美男组队,一起加入编程赛挑战。 工程师美男们长这样 游戏界面设计的很有日漫格调 玩个游戏都要秃头,你胆怯了么?据说这曾经不是 paiza 第一次推出相似的游戏了,以前还有过女性向的数学游戏,和 AI 入门的游戏。为了能让大家多学点货色这家就任网站也是拼了。 也有网友间接质疑了这个游戏,“太不实在了,程序员怎么可能有美男,更不可能有这么茂密的头发。” 不过看到这个美男的形象设计,还是不得不问一句:程序员真的都穿格子衬衫吗? 有玩过 paiza 页有的网友总结了一下本人的游戏体验。 “这公司的每个游戏都是换皮,大体都一样,就是每个关卡给你几个程序题,大部分语言都只能学个根底。” “都是入门级的题目,可简略了,一点都不令人头秃。” 看到这个游戏忽然想起了小时候学英语时玩的单词闯关游戏,通过游戏带动大家学习的趣味, paiza 的出发点还是很好的,给干燥的学习带来一点设想也很有乐趣。 游戏自身要面向的也是更多的受众,在题目设置难度和闯关上必定要思考到更多人能不能适应。而且,这种游戏自身推广的意义自身就要大于学习。 传送门送上,有趣味倒是无妨试试。 https://paiza.jp/oshipro/

August 21, 2020 · 1 min · jiezi

关于编程:常用编程语言中英文API汇总

A Android Android is a mobile operating system based on a modified version of the Linux kernel and other open source software, designed primarily for touchscreen mobile devices such as smartphones and tablets. Android 中文版 安卓(Android)是一种基于Linux的自在及凋谢源代码的操作系统。次要应用于挪动设施,如智能手机和平板电脑, B Bootstrap3 教程 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、挪动设施优先的 WEB 我的项目 Bootstrap4 教程 Bootstrap 4从Less迁徙到Sass,改良网格零碎,反对抉择弹性盒模型(flexbox),废除了wells、thumbnails和panels,应用cards代替。Bootstrap 4不再反对IE8,应用rem和em单位,为了利用JavaScript的新个性,用ES6重写了所有插件。 C CSS 手册 是一种用来体现HTML或XML等文件款式的计算机语言。CSS不仅能够动态地润饰网页,还能够配合各种脚本语言动静地对网页各元素进行格式化。 C语言 C语言是一门通用计算机编程语言,C语言的设计指标是提供一种能以繁难的形式编译、解决低级存储器、产生大量的机器码以及不须要任何运行环境反对便能运行的编程语言。 D Docker 教程 Docker 是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可移植的镜像中,而后公布到任何风行的 Linux或Windows 机器上,也能够实现虚拟化。 G Go 语言 ...

August 16, 2020 · 2 min · jiezi

关于编程:常用编程语言中英文API汇总

A Android Android is a mobile operating system based on a modified version of the Linux kernel and other open source software, designed primarily for touchscreen mobile devices such as smartphones and tablets. Android 中文版 安卓(Android)是一种基于Linux的自在及凋谢源代码的操作系统。次要应用于挪动设施,如智能手机和平板电脑, B Bootstrap3 教程 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、挪动设施优先的 WEB 我的项目 Bootstrap4 教程 Bootstrap 4从Less迁徙到Sass,改良网格零碎,反对抉择弹性盒模型(flexbox),废除了wells、thumbnails和panels,应用cards代替。Bootstrap 4不再反对IE8,应用rem和em单位,为了利用JavaScript的新个性,用ES6重写了所有插件。 C CSS 手册 是一种用来体现HTML或XML等文件款式的计算机语言。CSS不仅能够动态地润饰网页,还能够配合各种脚本语言动静地对网页各元素进行格式化。 C语言 C语言是一门通用计算机编程语言,C语言的设计指标是提供一种能以繁难的形式编译、解决低级存储器、产生大量的机器码以及不须要任何运行环境反对便能运行的编程语言。 D Docker 教程 Docker 是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可移植的镜像中,而后公布到任何风行的 Linux或Windows 机器上,也能够实现虚拟化。 G Go 语言 ...

August 16, 2020 · 2 min · jiezi

关于编程:常用编程语言中英文API汇总

A Android Android is a mobile operating system based on a modified version of the Linux kernel and other open source software, designed primarily for touchscreen mobile devices such as smartphones and tablets. Android 中文版 安卓(Android)是一种基于Linux的自在及凋谢源代码的操作系统。次要应用于挪动设施,如智能手机和平板电脑, B Bootstrap3 教程 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、挪动设施优先的 WEB 我的项目 Bootstrap4 教程 Bootstrap 4从Less迁徙到Sass,改良网格零碎,反对抉择弹性盒模型(flexbox),废除了wells、thumbnails和panels,应用cards代替。Bootstrap 4不再反对IE8,应用rem和em单位,为了利用JavaScript的新个性,用ES6重写了所有插件。 C CSS 手册 是一种用来体现HTML或XML等文件款式的计算机语言。CSS不仅能够动态地润饰网页,还能够配合各种脚本语言动静地对网页各元素进行格式化。 C语言 C语言是一门通用计算机编程语言,C语言的设计指标是提供一种能以繁难的形式编译、解决低级存储器、产生大量的机器码以及不须要任何运行环境反对便能运行的编程语言。 D Docker 教程 Docker 是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可移植的镜像中,而后公布到任何风行的 Linux或Windows 机器上,也能够实现虚拟化。 G Go 语言 ...

August 16, 2020 · 2 min · jiezi

关于编程:零基础入行如何学习Java呢

Java 语言的学习开始,很多同学不晓得从哪动手?如果你也想晓得如何从零开始学 java?怎么学 java 最无效?小编本文为你解答。 尽管 Java 面向对象很多货色都是被封装好的间接用,绝对其余语言没那么简单,然而学的货色也没有那么的 so easy,总之如果你是真想做开发,就先沉下心用心把根底打好,不要先老想着因为软件行业有市场,所以要进来分一杯羹的这种浮躁心态。 另外,在编程这个行业,技术更新速度快,所以肯定要具备相应的自学能力及自学意识,不然即便当初入职了 Java 相干的工作,不被动学习的话,说不定几年后你就跟不上技术要下岗了。互联网时代最快的就是更新迭代了。话不多说,上面一起来理解一下如何从零开始学 Java。 一、到相应的培训机构付费学习别在这说培训机构没用什么的,不过肯定要找正规的培训机构,不然容易被坑。培训机构外面的课程都是当初工作中须要用到的,工夫短,所以可能学生消化得没那么快,根底可能也没那么快坚固,所以须要本人更加的致力。 在培训机构里学习要留神的是:勤加练习、被动自学、有问题提,不懂的只管问老师,不然毕业后再有问题就没有这么好的机会可能间接失去无效的沟通了。 二、自学因为是自学,所以从开始到入门会很干燥,不肯定所有的人才能保持下来,所以如果你没有深厚的趣味的话集体倡议还是别自学编程了。 这是老师卫星:lezijie007(人太多了记得程序员暗号哦:1024),如果大家对于学习 Java 的学习办法,如何学习有效率以及待业的问题能够和老师进行交换 上面再给大家补充一些 Java 的学习思路! 学习 Java 其实应该回升到如何学习程序设计这种境界,其实学习程序设计又是承受一种编程思维。每一种语言的程序设计思维大同小异,只是一些由语言个性的而带来的细微差别,比方 Java 中的 Interface,你简直在以前的学习中没有碰到过。以下我认真给你说几点: 1、明确面向对象的领域咱们必须明确一个大方向,也就是说当初面向对象的编程领域。只管人工智能已经有所浪潮(看看 Borland 为什么有 Turbo Prolog),但将来5-10年工业界宽泛抵赖并承受的将是面向对象式的编程。 工业界目前最风行的面向对象编程语言就是 C++ 和 Java。所以基本上锁定这两个方向就能够了。而且齐全能够同时把握。 2、把握 Java 的精髓个性把握 Java 的精髓个性的同时,肯定要晓得为什么。比方,Interface 和 multi-thread。用 interface 是更好的多继承的模型,而多线程则是设计到语言一级的重要个性。要齐全了解 interface 是为什么,用多线程又有几种罕用的编程模型。 3、开始进行设计了解了语言的个性是为什么了之后,就能够试着回升到设计这个档次,毕竟学习语言是要用的。目前比拟好的开发模式是采纳自定向下的面向对象的设计,加上 MVC 的模式(你能够看一下我介绍的对于 MVC 的内容)。首先要找出最顶层的对象(这往往是最难的),而后一层一层往下递归,记住每次应合乎7+/-2的准则,因为咱们人的短记忆就是这样。个别有图形用户界面的应从界面开始设计。 4、学习设计模式有了根本设计模型后,能够学一些设计模式(Design Pattern)。这是目前证实很无效的。比方体系结构模式(Layering 分层,Pipe/Filter 管道或过滤器),设计模式(有很多,比方对象池 Object Pool、缓冲池 Cache等),编程模式(比方 Copy-on-Write)。 懂了这些模式之后,就会对系统的整体构造有很好的把握,而学术上也有偏向一个零碎齐全能够由各种模式组合而成。后面提到的 MT 实际上就有好几种模式,把握后就不必本人花很多工夫去试了。另外一个很重要的畛域就是并行和分布式计算畛域,大略有20种左右。 ...

July 29, 2020 · 1 min · jiezi

关于编程:零基础入行如何学习Java呢

Java 语言的学习开始,很多同学不晓得从哪动手?如果你也想晓得如何从零开始学 java?怎么学 java 最无效?小编本文为你解答。 尽管 Java 面向对象很多货色都是被封装好的间接用,绝对其余语言没那么简单,然而学的货色也没有那么的 so easy,总之如果你是真想做开发,就先沉下心用心把根底打好,不要先老想着因为软件行业有市场,所以要进来分一杯羹的这种浮躁心态。 另外,在编程这个行业,技术更新速度快,所以肯定要具备相应的自学能力及自学意识,不然即便当初入职了 Java 相干的工作,不被动学习的话,说不定几年后你就跟不上技术要下岗了。互联网时代最快的就是更新迭代了。话不多说,上面一起来理解一下如何从零开始学 Java。 一、到相应的培训机构付费学习别在这说培训机构没用什么的,不过肯定要找正规的培训机构,不然容易被坑。培训机构外面的课程都是当初工作中须要用到的,工夫短,所以可能学生消化得没那么快,根底可能也没那么快坚固,所以须要本人更加的致力。 在培训机构里学习要留神的是:勤加练习、被动自学、有问题提,不懂的只管问老师,不然毕业后再有问题就没有这么好的机会可能间接失去无效的沟通了。 二、自学因为是自学,所以从开始到入门会很干燥,不肯定所有的人才能保持下来,所以如果你没有深厚的趣味的话集体倡议还是别自学编程了。 这是老师卫星:lezijie007(人太多了记得程序员暗号哦:1024),如果大家对于学习 Java 的学习办法,如何学习有效率以及待业的问题能够和老师进行交换 上面再给大家补充一些 Java 的学习思路! 学习 Java 其实应该回升到如何学习程序设计这种境界,其实学习程序设计又是承受一种编程思维。每一种语言的程序设计思维大同小异,只是一些由语言个性的而带来的细微差别,比方 Java 中的 Interface,你简直在以前的学习中没有碰到过。以下我认真给你说几点: 1、明确面向对象的领域咱们必须明确一个大方向,也就是说当初面向对象的编程领域。只管人工智能已经有所浪潮(看看 Borland 为什么有 Turbo Prolog),但将来5-10年工业界宽泛抵赖并承受的将是面向对象式的编程。 工业界目前最风行的面向对象编程语言就是 C++ 和 Java。所以基本上锁定这两个方向就能够了。而且齐全能够同时把握。 2、把握 Java 的精髓个性把握 Java 的精髓个性的同时,肯定要晓得为什么。比方,Interface 和 multi-thread。用 interface 是更好的多继承的模型,而多线程则是设计到语言一级的重要个性。要齐全了解 interface 是为什么,用多线程又有几种罕用的编程模型。 3、开始进行设计了解了语言的个性是为什么了之后,就能够试着回升到设计这个档次,毕竟学习语言是要用的。目前比拟好的开发模式是采纳自定向下的面向对象的设计,加上 MVC 的模式(你能够看一下我介绍的对于 MVC 的内容)。首先要找出最顶层的对象(这往往是最难的),而后一层一层往下递归,记住每次应合乎7+/-2的准则,因为咱们人的短记忆就是这样。个别有图形用户界面的应从界面开始设计。 4、学习设计模式有了根本设计模型后,能够学一些设计模式(Design Pattern)。这是目前证实很无效的。比方体系结构模式(Layering 分层,Pipe/Filter 管道或过滤器),设计模式(有很多,比方对象池 Object Pool、缓冲池 Cache等),编程模式(比方 Copy-on-Write)。 懂了这些模式之后,就会对系统的整体构造有很好的把握,而学术上也有偏向一个零碎齐全能够由各种模式组合而成。后面提到的 MT 实际上就有好几种模式,把握后就不必本人花很多工夫去试了。另外一个很重要的畛域就是并行和分布式计算畛域,大略有20种左右。 ...

July 29, 2020 · 1 min · jiezi

关于编程:零基础入行如何学习Java呢

Java 语言的学习开始,很多同学不晓得从哪动手?如果你也想晓得如何从零开始学 java?怎么学 java 最无效?小编本文为你解答。 尽管 Java 面向对象很多货色都是被封装好的间接用,绝对其余语言没那么简单,然而学的货色也没有那么的 so easy,总之如果你是真想做开发,就先沉下心用心把根底打好,不要先老想着因为软件行业有市场,所以要进来分一杯羹的这种浮躁心态。 另外,在编程这个行业,技术更新速度快,所以肯定要具备相应的自学能力及自学意识,不然即便当初入职了 Java 相干的工作,不被动学习的话,说不定几年后你就跟不上技术要下岗了。互联网时代最快的就是更新迭代了。话不多说,上面一起来理解一下如何从零开始学 Java。 一、到相应的培训机构付费学习别在这说培训机构没用什么的,不过肯定要找正规的培训机构,不然容易被坑。培训机构外面的课程都是当初工作中须要用到的,工夫短,所以可能学生消化得没那么快,根底可能也没那么快坚固,所以须要本人更加的致力。 在培训机构里学习要留神的是:勤加练习、被动自学、有问题提,不懂的只管问老师,不然毕业后再有问题就没有这么好的机会可能间接失去无效的沟通了。 二、自学因为是自学,所以从开始到入门会很干燥,不肯定所有的人才能保持下来,所以如果你没有深厚的趣味的话集体倡议还是别自学编程了。 这是老师卫星:lezijie007(人太多了记得程序员暗号哦:1024),如果大家对于学习 Java 的学习办法,如何学习有效率以及待业的问题能够和老师进行交换 上面再给大家补充一些 Java 的学习思路! 学习 Java 其实应该回升到如何学习程序设计这种境界,其实学习程序设计又是承受一种编程思维。每一种语言的程序设计思维大同小异,只是一些由语言个性的而带来的细微差别,比方 Java 中的 Interface,你简直在以前的学习中没有碰到过。以下我认真给你说几点: 1、明确面向对象的领域咱们必须明确一个大方向,也就是说当初面向对象的编程领域。只管人工智能已经有所浪潮(看看 Borland 为什么有 Turbo Prolog),但将来5-10年工业界宽泛抵赖并承受的将是面向对象式的编程。 工业界目前最风行的面向对象编程语言就是 C++ 和 Java。所以基本上锁定这两个方向就能够了。而且齐全能够同时把握。 2、把握 Java 的精髓个性把握 Java 的精髓个性的同时,肯定要晓得为什么。比方,Interface 和 multi-thread。用 interface 是更好的多继承的模型,而多线程则是设计到语言一级的重要个性。要齐全了解 interface 是为什么,用多线程又有几种罕用的编程模型。 3、开始进行设计了解了语言的个性是为什么了之后,就能够试着回升到设计这个档次,毕竟学习语言是要用的。目前比拟好的开发模式是采纳自定向下的面向对象的设计,加上 MVC 的模式(你能够看一下我介绍的对于 MVC 的内容)。首先要找出最顶层的对象(这往往是最难的),而后一层一层往下递归,记住每次应合乎7+/-2的准则,因为咱们人的短记忆就是这样。个别有图形用户界面的应从界面开始设计。 4、学习设计模式有了根本设计模型后,能够学一些设计模式(Design Pattern)。这是目前证实很无效的。比方体系结构模式(Layering 分层,Pipe/Filter 管道或过滤器),设计模式(有很多,比方对象池 Object Pool、缓冲池 Cache等),编程模式(比方 Copy-on-Write)。 懂了这些模式之后,就会对系统的整体构造有很好的把握,而学术上也有偏向一个零碎齐全能够由各种模式组合而成。后面提到的 MT 实际上就有好几种模式,把握后就不必本人花很多工夫去试了。另外一个很重要的畛域就是并行和分布式计算畛域,大略有20种左右。 ...

July 29, 2020 · 1 min · jiezi

关于编程:程序员如何在一个月内有效地提高编程能力

俗话说得好,不想进大厂的程序员不是一个好程序员。那么作为行将步入程序员大军的小萌新/程序员界的老司机,你们都是如何备战大厂的呢?是否面对网络上纷繁复杂的材料茫然无从下手?抑或是坐在电脑旁埋头敲着代码却找不到一丝存在感?不必怕!明天我就来带大家一起解锁一款程序员必备法宝,帮你轻松晋升编程能力,离大厂更进一步。 家喻户晓,刷题是程序员晋升编程能力的最快办法,所以领有一款靠谱的刷题神器至关重要。如上图所示,咱们能够看到此刷题神器将题目分为了容易、中等、艰难三个等级,这样,大家就能够依据本人的以后程度抉择对应难度的题目,由难到易一一击破,极大地晋升了咱们的学习效率。此外,咱们还能够通过标签来抉择对应知识点的题目,在做题中把握各个知识点的出题法则和类型,同时也加深了对知识点的了解,全方位地夯实本人的根底。 然而,看到这里必定还有人纳闷:此款刷题神器虽好,但总感觉少了点什么。这样天天对着电脑一个人默默刷题也太干燥了吧,缓缓就会丢失学习的激情。想要激情?别放心!该神器还贴心地为大家筹备了业余的编程赛来激发大家的学习激情。 辞别传统的封闭式刷题模式,乏味又离奇的玩法,让你彻底爱上编程! 此次在线编程大赛波及范围广,难度不高,入门级算法赛(可参考LeetCode或九章算法),反对Java、Python、C++、JS、Go等多种语言,不论你是高校的学生还是社会人员,只有你对编程感兴趣,想晋升本人的编程能力,都能够报名加入较量。本次较量与九章算法单干,确保了赛题的专业性。这么牛的较量,加入完还怕找不到好工作吗? 加入较量不仅能够激发你学习的激情,晋升你的编程能力,还能够赢取高达20000的奖金,入围复赛就能够失去留念T恤一件。当初还可报名模仿赛,额定赢取樱桃键盘、SKG颈椎按摩仪、付费课程等超值礼品。一般的刷题千篇一律,乏味的较量奖金上万。报名入口流动工夫:2020年7月20日-2020年9月17日 Get 同款刷题神器请点击 在线编程

July 23, 2020 · 1 min · jiezi

知乎问题如何让不懂编程的人感受到编程的魅力

「MoreThanJava」 鼓吹的是 「学习,不止 CODE」,本系列 Java 基础教程是本人在联合各方面的常识之后,对 Java 根底的一个总回顾,旨在 「帮忙新敌人疾速高质量的学习」。当然 不管新老朋友 我置信您都能够 从中获益。如果感觉 「不错」 的敌人,欢送 「关注 + 留言 + 分享」,文末有残缺的获取链接,您的反对是我后退的最大的能源!知乎问题:如何让不懂编程的人感触到编程的魅力?链接:https://www.zhihu.com/question/406408447 Part 0. 前言问一个相似的问题:「如何让不懂篮球的人感触到篮球的乐趣?」 很显著,答案取决于人。 对于某些人来说,编码可能是乏味而艰巨的,但对于有些人则是十分乏味且无益的。 通常状况下,编写好代码之后,咱们很难评判编码的过程是无聊还是乏味的。 然而咱们能够通过更好地理解 「计算机编程是什么」,因而您能够本人来评判这是否让你感到乐趣。 就当代的倒退程度来说,只有有电的货色就会波及到编码;Part 1. 计算机倒退简史 | 解决理论的问题 原文地址:「MoreThanJava」计算机发展史—从织布机到IBM所有的开始 | 织布机衣食住行是人类的根本需要,世界各地都有纺织和织机的创造。 如何晋升纺织的效率,成为一个很重要的课题。 与 「针织物」 不同,「机织物」 由两条或两组以上的互相垂直的两个零碎纱线或丝线形成,纵向的纱线 叫 经纱,横向的纱线 叫 纬纱。 通过两条线不同法则的交织,就会造成不同的色彩和排列的变动,也就会带来不同的纹样。 图片援用自:https://www.sohu.com/a/301616...最原始的织机是手动实现的。 起初人们发现,织物纹样的变动总是依照肯定法则排列实现的,到了战国时期,就创造了 多综式提花织机,通过 综框 来实现这一项工作: 这或者就是最原始的 编码:通过把 提起法则雷同的经纱 穿入 同一个综框的综丝 中,来达到当某一个综框提起时 (通过脚踏板实现),表白某一个特定纹路的线被提起,也就实现了 特定纹路的编织,放慢了工作效率。 织布机的更进一步 | 束综提花织机不过采纳综框也有一个显著的限度,那就是 无奈织出比较复杂的纹样,因为纹样简单则代表着须要更多的经纬纱以及经纱晋升的法则更简单,意味着可能引入成千盈百次纬纱能力实现一个循环。 ...

July 15, 2020 · 5 min · jiezi

面向对象面向组件面向服务

面向对象编程 (OOP Object Oriented Programing)  将数据及对数据的操作行为作为一个整体即对象。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。面向对象编程就是定义这些类,类是描述相同类型的对象集合。类定义好之后将作为数据类型用于创建类的对象。程序的执行表现为一组对象之间的交互通信。 面向组件编程 (COP Compment Oriented Programing) 组件的粒度比对象要大,在面向对象系统设计中,对象是构建系统的基本建筑材料;面向组件系统开发中,组件是系统的基本建筑块;组件有点类似子系统的概念,把一组相关的对象封装起来对外提供服务;在面向组件强调封装,在复用方面更多的是强调黑盒复用。组件中,接口的概念特别被强调。接口是组件的和组件使用者之间的契约;接口的确定使得组件的开发者和使用者得以分开。 面向服务架构 (SOA Service Oriented Architecture) 面向服务架构是一种使用松耦合的黑盒服务构建业务应用的体系架构,这些服务可以通过编排连接在一起以实现特定的功能。 SOA的特点 SOA组件是松耦合的,意味着每一个服务组件包含单独的逻辑。如"PricingServer","notificationServer" 的服务,将它附加到不同的系统。 SOA中,服务隐藏有内在的复杂性。服务之间仅仅交互信息使系统变得松耦合。 SOA服务应该可以自定义。 SOA服务保持在一个中央存储库。应用程序可以在中央存储库中搜索服务,并调用相应服务。 SOA服务可以编排和链接实现一个特定功能: 即插即用的方式。如购物前后进行安全验证,使用SOA以松耦合的方式管理服务之间的工作流。

June 24, 2020 · 1 min · jiezi

第一门编程语言选什么好

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。转载请注明出处。原文:http://www.jianshu.com/p/c2b8...内容简介前言建议入门推荐分析总结1. 前言现在 IT 行业越来越火爆,许多朋友都愿意入门「挨踢」,噢,不,当程序员。 那么问题来了,对刚接触这个领域的新人来说,选什么语言作为第一门语言呢?这是很关键的问题,因为这很可能决定了这位新人是「从入门到继续」还是「从入门到放弃」。 2. 建议我推荐:或者从 C 语言入门,或者从 Python 入门。当然,也不排除从 Java 入门。这里又得分情况来说: 如果你只是想用编程来完成一些简单的任务,目标不是深入技术,那么选 Python。有很多好处,入门快,成就感来得快,高效好用。如果你要深入编程,想成为技术专家,那么选 C 语言。如果你还不清楚自己的未来发展方向,那请先弄清自己想要做什么再来学编程。如果实在是前路迷茫,懵懂未知,那么从 C 语言入门。因为你把 C 语言学了,你会发现 Python 入门太简单了;反之不然。3. 入门推荐如果你选 Python 作为第一门编程语言,请看我的 最近迫切应学的编程语言 这篇文章,说的就是 Python 的好处和入门建议。如果你选 C 语言作为第一门入门语言,虽然开始会有些「疼痛」,但是至久必成为你的帮助。请看我的 《C语言探索之旅》 系列教程来入门。也可以看《C Primer Plus》这本书来入门。4. 分析总结一下 C 语言作为第一门编程语言的好处: 1. 基础深厚现在你看到的大部分编程语言都是借鉴了 C 语言或者用 C 语言写成的,比如 Java,C++,C#,Python,Go,JavaScript,Objective-C,Swift,PHP,Perl,等等。 几乎所有的操作系统都用到了 C 语言,比如 Windows,Unix,Linux,macOS,iOS,Android,等等。 可以说,C 语言影响了全球的计算机系统和网络。改编《指环王》的经典台词就是「One language to rule them all」(意思是“一门语言统领其他语言”)(《指环王》原来的诗是「One ring to rule them all」(意思是“一枚戒指统领其他戒指”))。 当然了,C 语言最初是用 B 语言写的,但今天却几乎没有人在用 B 语言了。可见 C 语言的飞跃,其源码设计之精良。 ...

June 22, 2020 · 1 min · jiezi

会做菜就会编程一篇写给从未编程过的人的入门教程

简介: 编程没有那么难,会做菜就会编程。 平时工作之余,很多蚂蚁技术同学也乐于分享技术心得和经验感悟,我们会不定期精选其中的优秀文章,分享给大家。不少同学对于编程感到好奇,但一看到厚厚的教程就打退堂鼓,我就曾经被问过:“外行需要多长时间才能学会这玩意儿呀?”这个问题不知道该如何回答,因为我并不认同“外行”这个词。我始终认为,在编程这件事情上,每个人都是内行,每个人也都是外行。 学会编程没有你想象中的那么复杂。 编程是什么?编程,说得简单一点,就是通过一系列逻辑将你想做的事情或者想描述的物体表达清楚,然后让它展现出来,或者运动起来。说得专业一点: 编程 = 算法 + 数据结构什么是算法?就是解决问题的办法,或者说通过几个步骤来解决一个问题的过程描述;那么什么是数据结构呢?咱们在解决问题的时候经常需要去放置一些物件,比如把书放到书架上,那么书架就是一种数据结构,把书放到柜子里,柜子就是一种数据结构,书架和柜子就是数据的不同呈现/储存方式。 其实,每个人对编程都不陌生,你进过厨房吧,17:00 回到家,怎么让家人在 18:30 之前吃上饭?这里头的算法就多了去了,你可以先煮上饭然后去买菜,也可以买完菜再回来煮饭,那么哪种方式更好呢?下面我们用程序语言来分析这道题: 编程问题:17:00 回到家,怎么让家人在 18:30 之前吃上饭?算法一:先煮上饭然后去买菜算法二:买完菜再回来煮饭这里的做饭是一个程序实体,它包含了煮饭、买菜、切菜、做菜,这个程序实体的表达方式是: 做饭 = { 煮饭() {}, 买菜() {}, 切菜() {}, 做菜() {},}把中文换成英文不就是你平时看到的程序代码么?所以说呀,编程对你其实并不陌生,它也没你想象中的那么复杂。 编程的核心是什么?为什么人跟人之间编写出来的代码有这么大的差异,或者说,为什么存在小白和专家的区别?编程确实不复杂,复杂的原因是很多人不能把问题思考周全,我举个例子你就知道了: 做饭 = { 开始() { 煮饭(); 买菜(); 切菜(); 做菜(); }, 煮饭() {}, 买菜() {}, 切菜() {}, 做菜() { if (家里没有油了) { 买油(); 炒菜(); } else { 炒菜(); } }}做饭->开始();我们定义了一个程序实体叫做「做饭」,包含了几个步骤,开始、煮饭、买菜、切菜和做菜,在编程语言里头,我们把「做饭」称之为对象,这几个步骤称之为方法,「做饭」这个对象拥有 5 个方法,我们可以一个个地调用它。首先我们调用了「开始」方法,在这个方法里,又依次调用了「煮饭」、「买菜」、「切菜」和「做菜」。 在「做菜」方法里,我们看到了一个细节,那就是“家里没油了”,咋整,这个人是这么考虑的:先去「买油」,然后回来「炒菜」。很显然,这人不靠谱,你看,菜都要下锅了,才想起没有油。但是下面这个人就不一样了: 做饭 = { 开始() { 煮饭(); 检查结果 = 检查(); 买菜(检查结果); 切菜(); 做菜(); }, 检查() { if (家里没有油了) { 买菜的时候要买油 } if (家里没有辣椒了) { 买菜的时候要买辣椒 } }, 煮饭() {}, 买菜() {}, 切菜() {}, 做菜() {},}做饭->开始();他的程序里多了个步骤叫做「检查」,在出门买菜之前,先在家里扫一眼,缺了什么,用小本本记下来,然后「买菜」的时候,带上这个小本本,这样「买菜」就不会有遗漏了。 ...

June 8, 2020 · 1 min · jiezi

2020最新PHP阿里面试和答案解析

一、单选题(共27题,每题5分)1.Memcache与Redis的比较错误的是? A、Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据; B、Memcache和redis都是只支持单线程;CPU利用方面Memcache和redis部分伯仲 C、Memcache只支持key value存储方式,Redis支持更多的数据类型,比如Key value,hash,list,set,zset; D、Memcache自身不支持持久化,Redis支持持久化; 参考答案:B 答案解析: Memcache支持多线程,redis支持单线程;CPU利用方面Memcache优于redis 2.mysql5.7中关于json类型的说明,不对的是那个 A、JSON数据可以做有效性检查 B、json数据中,还是需要遍历所有字符串才能找到数据 C、JSON使得查询性能提升 D、JSON支持部分属性索引,通过虚拟列的功能可以对JSON中的部分数据进行索引 参考答案:B 答案解析: 原生的JSON优势如下: 1. 存储上类似text,可以存非常大的数据。 2. JSON有效性检查:插入的数据必须是JSON类型的字符串才行。 3. 相比于传统形式,不需要遍历所有字符串才能找到数据。 4. 支持索引:通过虚拟列的功能可以对JSON中部分的数据进行索引 3.执行下面代码$x会变成什么值呢? $x=NULL; if('0xFF'==255){ $x=(int)'0xFF';} PHP A、NULL B、255 C、0 D、false 参考答案:C 答案解析: 正确答案:C 答案解析:oxFF是一个十六进制数,这时不会转整型比较,会先将16进制数字转换成10进制数字,再做比较。 使用int函数,PHP会使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。发现0xff的0后面无数字,故为0. 4.大数据的数据库 (NoSQL)与关系型数据库的区别: A、    水平扩展与垂直扩展 B、    是否支持事务的 ACID C、    应用中两种数据库互相补充 D、    以上都是 参考答案:D 答案解析:无 5.关于判断文件类型,以下说法正确的是? A、根据文件的扩展名可以正确判断文件的类型 B、根据文件的特征值可以正确判断文件类型 C、根据文件的大小及特征值可以正确判断文件类型 D、通过任何方法也无法100%确定文件类型 参考答案:D 答案解析:任何方式都可以伪造,所以我们只能通过方法无限接近,而无法完全保证可以判断正确。 6.以下命令描述争取的是? ps -aux --sort -pcpu,+pmem | head -n 10 A、查询CPU使用排名前十的程序 ...

May 30, 2020 · 3 min · jiezi

2020最新腾讯PHP试题和答案解析

一、单选题(共29题,每题5分)1.PHP执行的时候有如下执行过程:Scanning(Lexing) - Compilation - Execution - Parsing,其含义分别为: A、将PHP代码转换为语言片段(Tokens)、将Tokens转换成简单而有意义的表达式、顺次执行Opcodes、将表达式编译成Opocdes B、将PHP代码转换为语言片段(Tokens)、将表达式编译成Opocdes、顺次执行Opcodes、将Tokens转换成简单而有意义的表达式 C、将PHP代码转换为语言片段(Tokens)、将Tokens转换成简单而有意义的表达式、将表达式编译成Opocdes、顺次执行Opcodes D、将PHP代码转换为语言片段(Tokens)、将表达式编译成Opocdes、将Tokens转换成简单而有意义的表达式、顺次执行Opcodes 参考答案:C 答案解析: 正确答案为C 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsing, 将Tokens转换成简单而有意义的表达式 3.Compilation, 将表达式编译成Opocdes 4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。 2.不是php魔术常量的是? A、__TRAIT__ B、__CALL__ C、__CLASS__ D、__FUNCTION__ 参考答案:B 答案解析: \_\_LINE\_\_ \_\_FILE\_\_ \_\_DIR\_\_ \_\_FUNCTION\_\_ \_\_CLASS\_\_ \_\_TRAIT\_\_ \_\_METHOD\_\_ \_\_NAMESPACE\_\_ 3.php选项/信息函数作用错误的是? A、phpinfo() 输出关于 PHP 配置的信息 B、php_sapi_name() 返回 web 服务器和 PHP 之间的接口类型 C、ini_set() 为一个配置选项设置值 D、ini_get() 获取所有配置选项 参考答案:D 答案解析: ini\_get() 是获取一个配置选项,获取所有配置选项的函数是ini\_get\_all() 4.下列代码的输出是 ? $father="mother";$mother="son";echo$$father; PHP A、son B、mother C、motherson D、error 参考答案:A 答案解析: ...

May 30, 2020 · 2 min · jiezi

2020年新浪最新PHP试题和答案解析

一、单选题(共28题,每题5分)1.以下语句输出的结果是什么? $a\=3;echo"$a",'$a',"\\\\\\$a","${a}","$a"."$a","$a"+"$a"; PHP A、3$a\\$a3336 B、33\$a3336 C、$a$a\$a3336 D、3$a\\$a333$a$a 参考答案:A 答案解析:\是转义的意思 2.包含文件方式,下列哪个是错误的? A、include B、include_once C、require D、import 参考答案:D 答案解析:import是CSS的引入方式。 3.三个人独立地破译一份密码,已知各人能译出的概率分别为 1/5,1/4,1/3,则密码能被破译的概率为 ? A、1/60 B、3/5 C、59/60 D、13/30 参考答案:B 答案解析:题目中,至少有一人能破译密码和三人都不能破译密码是对立事件。 所以至少有一人能译出的概率=1-三人都没译出的概率=1-(1-1/5)(1-1/3)(1-1/4)=1-2/5=3/5 4.innodb的事务与日志的实现方式? A、redo B、redo和undo C、undo D、无 参考答案:B 答案解析:1.有多少种日志 redo/undo 2.日志的存放形式 redo:在页修改的时候,先写到redo log buffer 里面,然后写到redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件(fsync)。 Undo:在MySQL5.5之前,undo只能存放在ibdata\*文件里面,5.6之后,可以通过设置innodb\_undo\_tablespaces参数把undo log存放在ibdata\*之外。 3.事务是如何通过日志来实现的,说得越深入越好。 因为事务在修改页时,要先记undo,在记undo之前要记undo的redo,然后修改数据页,再记数据页修改的redo。Redo(里面包括undo的修改)一定要比数据页先持久化到磁盘。当事务需要回滚时,因为有undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果redo log中事务没有对应的commit记录,那么需要用undo把该事务的修改回滚到事务开始之前。如果有commit记录,就用redo前滚到该事务完成时并提交掉。 5.PHP面向对象方法重写描述错误的是? A、子类必须继承父类 B、子类可以重写父类已有方法 C、重写之后子类会调用父类方法 D、子类也可以具有与父类同名的属性,进行属性覆盖 参考答案:C 答案解析: 重写之后子类不会再去调用父类的方法,而是直接调用自身的方法 6.TCP/IP协议栈中的位置(由上到下)? A、TCP->IP->HTTP->数据链路层 B、IP->HTTP->TCP->数据链路层 C、HTTP->IP->TCP->数据链路层 D、HTTP->TCP->IP->数据链路层 参考答案:D 答案解析:HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上 正确排序为HTTP->TCP->IP->数据链路层 7.在PHP面向对象中有一个通用方法__toString()方法,下面关于此方法描述或定义错误的是( ): A、此方法是在直接输出对象引用时自动调用的方法。 B、如果对象中没有定义此方法时,直接使用echo输出此对象,会报如下错误:Catchable fatal error: Object of class A could not be converted to string. ...

May 30, 2020 · 2 min · jiezi

TiDB-Hackathon-参考选题扩充组队参赛走起

TiDB Hackathon 2019 已经开放报名 1 个多月啦,之前抓耳挠腮想不到选题、组不到队友的伙伴们都渐渐成队,并开始做赛前准备了。为了刺激围观同学的“灵感小火花”,我们今天又扩充了一波选题,如果大家还不知道做什么项目的话,择日不如撞日,今天就锚定一个果断报名参赛吧!另外,参赛选手在赛前准备阶段对选题有任何疑问,都可以联系 TiDB Robot(微信号:tidbai),导师团将针对性地进行赛前辅导,帮大家扫清一些知识盲区哦~参考选题性能提升提升 TiDB 的内存复用(可以考虑使用 sync.pool)用 unistore 替换 mocktikv,跑出单机 TiDB 的极限性能,同时加快跑单元测试易用性提升Key visualizer for TiKV,相关资料:https://cloud.google.com/blog/products/databases/develop-and-deploy-apps-more-easily-with-cloud-spanner-and-cloud-bigtable-updates 热点索引统计使用 SQL 获取集群信息稳定性提升自适应 SQL 引擎提高 Cost 估算的精度基于历史的查询优化SQL Plan Management 之 Plan History结合 https://github.com/intel-go/n..., http://github.com/google/nets... 替换掉 MySQL 和 TiDB 的连接层功能提升Follower Read 与 MVCC 的结合动态多副本Cloud TiKV 支持,底层用 rockset 替换掉单机版本的 RocksDB允许 TiDB 缓存已经锁表的表数据,缓存数据可以在 TiDB server 内共享支持 select into fileTiDB coprocessor cache,相关资料:https://docs.google.com/document/d/1WXlifEbHaik--vwQFdBEs8ezRrAUneGUQSRW-fsZEWE/edit 生态扩展基于 Docker 的集群模拟器BI / AI / Search 等集成等应用层生态解决方案TiDB Play ground(类似 play.golang.org)基于 TiDB 的图计算引擎用 TiKV 替换 K8s 后端的 etcd 解决扩展性和性能问题机器学习在 TiDB 的应用数据特征学习Learned data structure(bloom filter, hash...) 在 tidb/unistore 的应用其他DBA 工具,比如:https://github.com/ngaut/sqltop ...

October 16, 2019 · 1 min · jiezi

5门前途美好的编程语言

作者 | Nick Kolakowski来源 | 涛哥聊Python前不久, Dice Insights(提供求职消息的技术职业消息服务的网站)研究了 TIOBE 和 RedMonk 的编程语言排名,以及自己网站的招聘信息数据库,得出了5门可能衰落的编程语言。 接着,Dice Insights再次公布了在未来几年使用量飙升的5门编程语言。这些结论是依靠强大的数据推断出来的,得出来的结果,有些是在意料之中,有些可能会让你大跌眼镜,我们一起来看看: 1、Swift 苹果想要把Objective-C淘汰,算起来,Objective-C已经有35年的历史了,一直被用于构建苹果生态系统的应用程序,而今苹果想用Swift替代Objective-C,Swift是苹果五年前发布的语言,根据分析公司RedMonk的长期语言排名,自创建以来,Swift的使用率迅速飙升,能够得到这样的反馈,苹果公司自然很满意。 话虽如此,想要真正淘汰Objective-C也不是那么简单的,这主要是因为在过去的35年里产生的大量遗留代码,但随着苹果打压力度不断加大,Objective-C迟早有一天还是会被淘汰,而Swift会真正成为为苹果应用程序提供动力的中坚力量,此外,苹果跨平台应用支持的计划会加速Swift的发展。 2、Kotlin Kotlin正在崛起,十年前,Kotlin只是俄罗斯的一个岛屿,而今,它还是一门编程语言,Kotlin之所以能一跃成名,都要归功于谷歌将其定义为Android 的“一级”开发语言。 可以说,通过选择Kotlin,谷歌减少了对Java的依赖,而且Java是谷歌和Oracle法律纠纷的原因所在,无论谷歌的律师们是否推动了公司对Kotlin的支持,我们都能看出,许多开发者都很喜欢这门编程语言,因为其灵活的特性。 早在2018年,Pusher就发起了一项开发者调查,数据显示,归功于Android,Kotlin的使用率正在爆发式增长,大部分开发者在他们的工作中或副业的项目中使用Kotlin编程,Pusher还补充道:说到Kotlin最受青睐的特性,大多数开发者表示Kotlin是安全的,80%的开发者喜欢null安全,其次是扩展函数,Java的简化互操作性和数据类。 但是换句话说,Kotlin似乎也没有别的发展空间了,因为这种编程语言很难扩展到Android生态系统之外,拓展到其他领域。 3、Python Python是门庞大的编程语言,被世界各地的开发人员广泛使用,根据TIOBE指数显示,Python的受欢迎程度不断在攀升,甚至对其他编程语言已经产生威胁,而且实际上,人们正不断发现Python的新用途 考虑到Python已经拥有强大的用户基础,而且它被广泛应用于大量的业务当中,因此,Python在短期内消亡的可能性微乎其微,唯一令人疑惑的是,这种编程语言能发展到何种程度,以及下一步它将占领哪些行业。 4、Groovy Groovy在TIOBE排名上的上升得益于广泛的IDE支持、与Java的相似性以及与流行的开源自动化服务器Jenkins的集成。它已经成为许多系统中的“编程语言粘合剂”,所以说,它的未来似乎很光明。 5、TypeScript 在这里,我们将Typescript也称之为编程语言,它是JavaScript的一个超集,一些开发人员认为它并不是一门“完整”的编程语言,因为它可以被转换成JavaScript 。 无论你如何定义它,在RedMonk和GitHub的月度报告上,对Typescript的评级都是快速增长,TIOBE也曾暗示TypeScript甚至开始蚕食JavaScript的市场份额。 不管你是否认为TypeScript是一个“全新改进的”JavaScript,都无法否认很多技术专家认为TypeScript在未来几年还有发展的空间。 以上就是Dice为大家总结出的5门未来前途大好的编程语言,你赞同么? 如果您是以下几种情况之一:1、想了解更多有关大数据分析、数据挖掘、机器学习、人工智能领域内容的好学者;2、职业遭遇瓶颈,想提升自己在数据分析或人工智能领域的硬件技能的在职人士;3、寻求新出路、新突破,有意向转行到数据分析行业或人工智能领域的求职人士;4、对未来摇摆不定,有兴趣想Python、数据分析、人工智能方向发展的在校大学生。可给我们私信留言,我们会在第一时间为您答疑解惑,提供专业而具体的建议! 也可以搜索进入我们的小程序,解锁更多新鲜资讯和优质内容,不要错过哟!

October 14, 2019 · 1 min · jiezi

为什么推荐程序员录制课程

程序员的副业有很多种,唯独视频课程当下最为推荐. 从几年前写博客以来,一直主张的是技术分享和思维方式,个人成长始终是核心. 但是"恰饭"和成长并不冲突,两者互成因果,正向循环反馈,也是如写作一样,几乎零成本,意义巨大. 谈趋势 时势造英雄,很多时候成功不过是自己的一点基础恰好命中时代的需要,运气和努力都很关键. 博客时代已经落幕了十几年,现在还在坚持写的少之又少,短文字更加适合快节奏的社会步伐,所以有了微博. 娱乐至死的年代,有人热衷为明星打call,爱好花边新闻,有人想要深度思考,不想被人喂养投食,有人想要一夜暴富,功成名就,于是自媒体大行其道. 当浅薄的资讯已经无法满足人们之后,当整个信息环境已经稳固定型之后,资本需要新的渠道和新的收益的时候,知识付费应运而生. 学习打卡,社群人脉,读书健身,一切看起来自我成长的内驱力都被赋予了各式各样的理由,大部分人交了"智商税",少数人破蛹成蝶. 现如今短视频当道,流量经济全部往视频倾斜,各大巨头纷纷布局,反观公众号等自媒体,早已是明日黄花. 写作从博客到短文字再到自媒体,无非是换了一个又一个形式,本质上好的内容依旧是一切的基础,只是不太适合当下. 视频作为另一种载体,能够搭上知识付费尾巴和短视频顺风车的,对于程序员而言,录制视频课程,无疑是最佳选择. 谈成本 无论是程序员的个人品牌还是开发人员的副业刚需,反复提及的来来回回都是那么几个. 从时间成本和精力成本简单到困难的顺序来看,写作>录课>演讲>开发程序>出书. 近段时期算是尝试了其中一些 在视频平台录制了一些视频在网易云课堂上架了免费课程在google play等发布app在公众号运营自媒体,开始构思出书的整体框架和内容发现和当初一开始就选择个人独立博客一样,打造了一个信息孤岛,一个平台闭环,没什么流量和反馈,甚至键盘侠都没有几个. 比起写作而言,录制视频不会有内容枯竭的现象,很多人写作一开始很多可以写,写着写着就发现能写的都写完了,除非不断的输入大量的内容,不然就没有什么存货了,并且写作最不被推荐的就是写流水文,没有思想的内容是没有灵魂的. 但是视频不一样,视频本就是记录和展现,尤其是编程视频,无论是运行过程中的错误提示,还是解决问题的方法,或者是安装和下载的步骤,都是越还原越好,当然,如何设计课程,剪辑视频,PPT演示都是有很多技巧可言的. 谈规划 又到了程序员中年危机论的时候. 人到中年,程序员就应当考虑转管理或者自行创业了. 技术并不总是去写代码,创业也不止于软件产品. 在程序员职业路径中,有一种特殊的职业,叫做讲师,通俗点说就是培训班. 由于大学并没有设立编程开发相关的课程,K12也几乎是是一片空白,想要转行互联网,培训班是大多数人的选择. 又如同,学音乐的不见得举办演唱会,学画画的不见得办画展,学瑜伽的不见得就要做出点什么. 很多学习类的知识,除了应用于做事以外,有时候的用途就是学了去教,至于别人是继续教还是做什么,就不在考虑范围了. 课程是一个极其垂直类的产品,谈学习谈成长愿意为之付费和主动学习的少之又少,这种道理都懂却依然过不好这一生的事物,也没有人爱看了. 但是技术是一个硬需求,有就是有,少了一个标点符号都不能通过的那种,技术迭代,不断需要新的课程,职业也在一直演变. 从个人成长来讲,录制课程有助于记录自己的实时操作,整理自己的所学所为,以可视化的角度展现和分享给别人. 从职业规划来讲,中年转行讲师,或者将来演讲培训,都需要锻炼自己的口才和思维,录制视频是一个很好的起点. 从副业刚需来看,目前短视频经济,在线教育还没有如同软件一样需要软著和公司资质,把个人限制的全方位无死角,而付费课程恰巧能打通支付渠道,同时和写作一样也是复利的一种,并且更加具备专业性. 如果写作注重沟通的话,那么视频课程表现的更加专业,对提升行业影响力和求职也是不错的选择. 谈坚持试一试又不会错,也不会损失什么. 录制课程的成功或者失败,总会让你进步. 以上的所有内容仅为个人思考,具体的还是要看自己的时间和目标等因素. 自己录制了一些课程,有所付出,也有所收获. 有一门在网易云课堂的课程<<react native 从创建到发布>>就是体会到了热门的流量效果,没有推广也一直有学员,反而一些冷门的课程,再怎么推广也很少有人看. 写作,还是会继续坚持,它促使我不断的思考,输出倒逼输入,不断学习.从内而外成长. 录课,还是会继续尝试,看的到逐渐的进步,更为垂直的专业有助于职业学习和发展.

October 1, 2019 · 1 min · jiezi

悉尼大学SOFT2201课业解析

题意:完善“Stickman”项目,根据课堂反馈和导师反馈的具体观点来纠正现有的功能,并使用新功能扩展应用程序。 解析: 功能实现: 1.加载不同的级别: - 级别必须从json配置文件中加载,该文件给出了加载和定位不同资产的指令。 - 关卡信息必须包括平台,敌人,终点线位置和第一阶段的云和英雄。 - 需要在报告中对不同层次的输出格式的设计进行合理化和详细说明。 - 不需要在游戏执行过程中进行关卡转换,游戏在启动时加载一个给定的关卡文件,并在关卡完成时结束。 2.英雄必须能够站在平台对象上,并且不能与任何对象相交。 3.关卡将包含伤害英雄的敌方特工 - 如果英雄从它们上面跳过去触碰它们,敌人将会消失。 - 如果英雄以任何其他方式触碰它们,英雄将失去一条命,并重新回到最初配置的位置。 4.英雄能够越过终点线,此时关卡(游戏的这个阶段)将完成 5.游戏必须记录从游戏开始到英雄到达终点线的当前时间 附加功能(要获得满分需要实现一个附加功能): 1.不同的敌人运动个性。 2.不同平台上的不同物理特性(如使英雄滑块) 测试测试: 为代码编写jUnit4测试。这些测试必须涵盖每个类的功能,并且必须使用gradle test(包含在gradle构建中)运行 涉及知识点:软件设计,设计模式,单元测试 可以加v深入了解:WHJ980416

September 19, 2019 · 1 min · jiezi

浏览器开发者控制台使用入门基础

开发者控制台代码是很容易出现错误的。你也很可能犯错误...... 哦,我在说什么?只要你是人,你一定会犯错误(在写代码的时候),除非你是机器人)。 但在浏览器中,默认情况下用户是看不到错误的。所以,如果脚本中有错误,我们看不到是什么错误,更不能够修复它。 为了发现错误并获得一些与脚本相关且有用的信息,浏览器内置了“开发者工具”。 通常,开发者倾向于使用 Chrome 或 Firefox 进行开发,因为它们有最好的开发者工具。一些其他的浏览器也提供开发者工具,有时还具有一些特殊的功能,通常它们都是在追赶 Chrome 或 Firefox。所以大多数人都有“最喜欢”的浏览器,当遇到某个浏览器独有的问题的时候,人们就会切换到其他的浏览器。 开发者工具很强大,功能丰富。首先,我们将学习如何打开它们,查找错误和运行 JavaScript 命令。 Google Chrome打开网页 bug.html。 在 JavaScript 代码中有一个错误。一般的访问者看不到这个错误,所以让我们打开开发者工具看看吧。 按下 key:F12 键,如果你使用 Mac,试试 key:Cmd+Opt+J。 开发者工具会被打开,Console 标签页是默认的标签页。 就像这样: 具体什么样,要看你的 Chrome 版本。它随着时间一直在变,但是都很类似。 在这我们能看到红色的错误提示信息。这个场景中,脚本里有一个未知的 “lalala” 命令。在右边,有个可点击的链接 bug.html:12。这个链接会链接到错误发生的行号。在错误信息的下方,有个 > 标志。它代表“命令行”,在“命令行”中,我们可以输入 JavaScript 命令,按下 key:Enter 来执行(key:Shift+Enter 用来输入多行命令)。 现在,我们能看到错误就够了。稍后,在 <info:debugging-chrome> 章节中,我们会重新更加深入地讨论开发者工具。 Firefox、Edge 和其他浏览器大多数其他的浏览器都是通过 key:F12 来打开开发者工具。 他们的外观和感觉都非常相似,一旦你学会了他们中的一个(可以先尝试 Chrome),其他的也就很快了。 SafariSafari(Mac 系统中的浏览器,Windows 和 Linux 系统不支持)有一点点不同。我们需要先开启“开发菜单”。 打开“偏好设置”,选择“高级”选项。选中最下方的那个选择框。 现在,我们通过 key:Cmd+Opt+C 就能打开或关闭控制台了。另外注意,有一个名字为“开发”的顶部菜单出现了。它有很多命令和选项。 通常,当我们向控制台输入一行代码后,按 key:Enter,这行代码就会立即执行。如果想要插入多行代码,请按 key:Shift+Enter 来进行换行。这样就可以输入长片段的 JavaScript 代码了。 ...

September 9, 2019 · 1 min · jiezi

前端开发者可以选择哪些代码编辑器

代码编辑器程序员接触时间最长的就是代码编辑器。 代码编辑器主要分两种:IDE(集成开发环境)和轻量编辑器。很多人喜欢这两种各选一个。 IDEIDE(集成开发环境)是用于管理整个项目具有强大功能的编辑器。顾名思义,它不仅仅是一个编辑器,而且还是个完整的开发环境。 IDE 加载项目(通常包含很多文件),并且允许在不同文件之间切换。IDE 还提供基于整个项目(不仅仅是打开的文件)的自动补全功能,集成版本控制(如 git)、集成测试环境等一些其他“项目层面”的东西。 如果你还没考虑好选哪一款 IDE,可以考虑下面两个: Visual Studio Code(跨平台,免费)WebStorm(跨平台,收费)对于 Windows 系统来说,也有个叫 “Visual Studio” 的 IDE,请不要跟 “Visual Studio Code” 混淆。“Visual Studio” 是一个收费的、强大的 Windows 专用编辑器,它十分适合于 .NET 开发。用它进行 JavaScript 开发也不错。“Visual Studio” 有个免费的版本 Visual Studio Community。 大多数 IDE 是收费的,但是他们都可以试用。购买 IDE 的费用对于一名合格的程序员的薪水来说,肯定算不了什么,所以去选一个对你来说最好的吧。 轻量编辑器“轻量编辑器”没有 IDE 功能那么强大,但是他们一般很快、优雅而且简单。 “轻量编辑器”主要用于立即打开编辑一个文件。 “轻量编辑器”和 IDE 最大的区别是,IDE 一般在项目中使用,这也就意味着在开启的时候要加载很多数据,如果需要的话,在使用的过程中还会分析项目的结构等。如果我们只需要编辑一个文件,那么“轻量编辑器”会更快。 实际上,“轻量编辑器”一般都有各种各样的插件,这些插件可以做目录级(directory-level)的语法分析和补全代码。所以“轻量编辑器”和 IDE 也没有严格的界限。 下面是一些值得你关注的“轻量编辑器”: Atom(跨平台,免费)。Sublime Text(跨平台,共享软件)。Notepad++(Windows,免费)。Vim 和 Emacs 很棒,前提是你知道怎么用。不要争吵上面列表中的编辑器都是我和我的朋友(他们都是我认为很优秀的开发人员)已经使用了很长时间并且很满意的。 世上还有很多其他很好的编辑器,你可以选择一个你最喜欢的。 选择编辑器就像选择其他工具一样。要看你的项目,以及个人的习惯和喜好。 现代 JavaScript 教程:开源的现代 JavaScript 从入门到进阶的优质教程。在线免费阅读:https://zh.javascript.info/ 扫描下方二维码,关注微信公众号「技术漫谈」,订阅更多精彩内容。 ...

September 8, 2019 · 1 min · jiezi

现代-JavaScript-教程到底是什么

手册与规范《现代 JavaScript 教程》是开源的现代 JavaScript 从入门到进阶的优质教程,它旨在帮助你逐渐掌握 JavaScript 这门语言。但是一旦你已经熟悉了这门语言的基础知识,你就会需要其他资料。 规范ECMA-262 规范包含了大部分深入的、详细的、规范化的关于 JavaScript 的信息。这份规范明确地定义了这门语言。 但正因其规范化,对于新手来说难以理解。所以如果你需要知道关于这门语言细节最权威的信息来源,这份规范就很适合你(去阅读)。但是它并不适合日常使用。 最新的规范草案在此 https://tc39.es/ecma262/。 想要知道最新最前沿且将要“标准化”的功能,请看这里的提案 https://github.com/tc39/propo...。 当然,如果你正在做浏览器相关的开发工作,那么本教程的 第二节 涵盖了其他规范。 手册MDN(Mozilla)JavaScript 索引是一本带有用例和其他信息的手册。它是一个获取关于个别语言函数、方法等深入信息的很好的来源。你可以在 https://developer.mozilla.org... 找到这本手册。 虽然,通常利用互联网搜索是最好的选择。只需在查询时输入“MDN [关键字]”,例如 https://google.com/search?q=M... 搜索 parseInt 函数。 MSDN —— 一本微软的手册,它包含大量的信息,包括 JavaScript(在里面经常被写成 JScript)。如果有人需要关于 Internet Explorer 的规范细节,最好去看:http://msdn.microsoft.com/。我们还可以在使用互联网搜索时使用如 “RegExp MSDN” 或 “RegExp MSDN jscript” 这样的词条。 兼容性表JavaScript 还是一门还在发展中的语言,经常会添加一些新的功能。 如果想要获得一些关于浏览器和其他引擎的兼容性信息,请看: http://caniuse.com> —— 每个功...。https://kangax.github.io/comp... —— 一份列有语言功能以及引擎是否支持这些功能的表格。所有这些资源在实际开发中都有用武之地,因为他们包含了语言细节以及它们被支持的程度等非常有价值的信息。 为了不要让你在真正需要深入了解特定功能的时候捉襟见肘,请记住它们(或者这一页)。 现代 JavaScript 教程:开源的现代 JavaScript 从入门到进阶的优质教程。在线免费阅读:https://zh.javascript.info/ 扫描下方二维码,关注微信公众号「技术漫谈」,订阅更多精彩内容。

September 8, 2019 · 1 min · jiezi

软件开发什么是过度设计

软件设计(架构)往往在项目开发中起到非常关键性的作用,至少它是能够工作。良好的软件设计包含了:灵活性、可伸缩性、可行性、可复用性、安全性,通过该一系列的定义,使我们影响到了软件功能的设计和特征。 (一)、什么是过度设计过度设计一词在英文中称为"over design",over意思是太多,design意思是设计、构思,通过教科书上面的解释,意味着你设计的或构思的太多了,即为过度设计。 什么是过度设计?设计出来的系统比恰到好处要复杂或臃肿的多,过度的封装、继承、接口或是大量的无用配置方法,其实就是用户需要一把杀鸡的刀,而你却设计出了杀牛刀或是电锯。 过度设计通常来自于开发者将问题过于复杂化或是前瞻性欠缺。 在我们日常所犯的错误中,大部分是来自于前者,至于后者的欠缺,需要一定的项目经验和洞察力来支撑,能够合理的预判和考虑需求会哪个方向发展。 在前者,问题复杂化会引入大量额外的代价,如成本上升,系统缺陷增大、提升维护成本、降低系统性能。而高性能和可维护性都是系统的隐性需求,如果这些也没实现好,那就可能属于设计错误。 但是从客观角度来看,能够进行过度设计的,多半设计能力高于设计不足的,过度的设计改回来的成本也比设计不足的改过去的成本低的多,在此需要更多地去权衡"利与弊"。 (二)、过度设计案例以系统充值为例,最初你设计的系统只需要一个支付宝功能,你的数据库设计如下: id primary key int //主键user_id int//充值用户status int //-1充值失败,0充值中,1充值成功order_no string //第三方支付系统订单号amount decimal //金额但是没过多久,你的系统需要接入另一个支付系统-微信,需要区分用户是通过微信还是支付宝充值的,于是你的数据库设计便成了以下模样 id primary key int //主键user_id int//充值用户status int //-1充值失败,0充值中,1充值成功order_no string //第三方支付系统订单号platform string //第三方交易平台amount decimal //金额但是你想了下,感觉可能以后需要接入银联支付,需要记录是哪张银行卡支付的,然后你又想了下,既然已经接入了银联支付,那顺便就再完善以下,支持国际支付,如美元充值,港币充值,然后需要记录上当地充值的汇率及当地支付时间,最终你花了一天的时间,将数据库改成了这样 id primary key int //主键user_id int//充值用户status int //-1充值失败,0充值中,1充值成功order_no string //第三方支付系统订单号platform string //第三方交易平台amount decimal //金额currency string //货币:CNY USD HKD bank_id int //银行卡IDrate decimal // 充值汇率local_pay_time //当地支付时间完成基本设计后,你花了4周的时间完成编码和测试,最终交付了上去,然而系统的初衷只是需要简单区分的是微信充值或支付宝充值,而因过度设计带来的额外成本和缺陷是非常巨大的,为此我们需要尽力让自己做的恰到好处并且避免过度设计。 (三、)如何避免过度设计?避免过度设计的最佳方法就是“不要设计的太远”,未了解实际未来,就做出了各种预设和判断,为系统增加了额外的负担。 正如scrum(敏捷开发)所倡导的Evolutionary Design(演进式设计),将每一次的重构和迭代都映射和更新到最新的设计中来,从而最大限度的满足系统的功能性需求和非功能性需求。 当你手里握着一把锤子时,不要把所有看到的,都当成钉子。

September 8, 2019 · 1 min · jiezi

如何学好python编程

如何学好python编程1.过程- 1.1 掌握python语法- 1.2 设计python程序结构- 1.3 设计问题的解决方法2.重点- 2.1 多看代码- 2.2 照着写- 2.3 调试运行- 2.4 独立编写3.IPO程序编写方法- 3.1 input- 3.2 process- 3.3 output[toc]

July 16, 2019 · 1 min · jiezi

阿里资深技术专家的10年感悟

阿里妹导读:阿里有许多土话,比如“方法总比困难多”、“不淘汰自己就会被别人淘汰”、“你感觉不舒服的时候,就是成长的时候”。每一句都在激励我们向前。生活总不缺困难和磨练,痛苦的时候,只有转变思维,才能蜕变。今天,阿里巴巴资深技术专家无相分享他在阿里这10年来的几点感悟。今天很残酷,明天更残酷,后天很美好,熬过明天晚上,才能看到后天的太阳。 2019年的上半年,我密集地写了 tbbpm idea 插件,终于比较圆满地解决 idea 插件的开发问题。经过这件事,内心有股强烈的冲动,促使我写下这些年面对痛苦时,我的一些解决问题的方法和感悟。 1. 一个人走得快,一群人走得远“一个人走得快,一群人走得远”,这句话是阿里的土话。没有这些年的编程经历,不会深刻地感受这句话背后逻辑与力量。一个人持续做一件工作量较大且较长期的事情时,对心力的考验是很大的。当多人协同时,心力压力能够得到很大的缓解。 Knowledge is commonly socially constructed, through collaborative efforts toward shared objectives or by dialogues and challenges brought about by differences in persons' perspectives.Salomon 《The Costs and Benefits of Pair Programming》这篇论文的研究表明:结对编程能够改进设计质量,减少代码缺陷(代码行数减少,测试通过率更高),减少员工离职风险,提升软件技能。团队解决问题的速度变快,同时更加愿意坐到一起工作。 2. 当你不舒服,难受或陷于困境时,应该停下来思考在写 tbbpm idea 插件时,我花了三年(准确来说是3个春节)才写成,idea 的设计插件在业界无参考标准,不能很好地快速进行。记得在 eclipse tbbpm 插件时,因有业界源码参考,用了两个通宵原型就做出来了。Tbbpm 是一个闲暇时间的产物,只能利用春节这样的大长假才能开发。我希望自己能够在极短的时间内完成,然而,第一个春节与第二个春节都没有成功。在第三个春节时,关键的拖拽依然没有很好的搞定,心力已经接近憔悴。屡次失败之后,我不得不开始反思,是不是我做这件事的方式错了?是不是我的欲望已经超越了我当前的能力。 于是,那时候我停下手头的工作,冷静的地思考了2天。 这里举个当时的例子,idea 插件绘制表单的困境:因为用 swing 的方式来构建流程时,使用很多原生的库、GUI、JformBuilder,觉得画一个表单很困难, 尽管有些产品商已经用了,依然非常难用。静下来思考后,通过 google,找到了 miglayout 这个库,问题才得以解决。 困境是个人成长的最好机会,放弃、逃避、拒绝思考,就意味着放弃成长。如果遇到困境不自知,不解决,则会出现昨日所不知不能者,今日仍是不知不能;去年所不知不能者,今年仍是不知不能。 同时,最近有很多同学向我反馈,遇到困境时,通过个人的努力依然不能突破。这种情况下,可以尝试另外一条路,像《能力陷阱》这本书所说的一样,可以引入外部的力量。 3. 学习能力与思维模式是一个人的核心竞争力没有自学能力的人没有未来。李笑来 3.1 首先承认自己的不足 ...

July 11, 2019 · 1 min · jiezi

记一次前端项目重构要点总结

不知不觉已是2019年的7月,恍惚之间已工作四年。懵懵懂懂的成长,间歇性努力,实话说,对现在自己取得的成果不大满意。不过,好在时不时顿悟,知道适时作出改变。 此后发文会适当记录一些心路历程,与君共勉。 欢迎Star和订阅我的博客。本文要点: 什么项目,为何会重构?怎么重构的?重构前后对比什么项目,为何会重构?项目是公司主打业务产品之一的可视化子项目,与其他子项目几乎没有耦合,所以可以单独拎出来重构。 具体业务不作描述。技术主要用的是Vue2系列和JavaScript,还有一个自研的可视化工具库。第一个重构原因就是没有引入静态类型,导致查看一个对象结构需要翻来覆去在多个文件中查找。第二是因为之前新增代码模式一般为:“来一个需求加一段代码”,长期积累导致代码结构混乱,可读性差。第三是各个状态模块耦合度高,加大了代码维护难度。 怎么重构的?一、在JavaScript中使用TypeScript。“什么?在JS中使用TS? 闻所未闻。 ” 在看到TS官网手册最后一条"Type Checking JavaScript File"之前,我也这样想。其实,TS和VSCode(一款IDE)结合,也可以实现静态类型检测,只不过使用注释形式,一样支持tsconfig.json和自定义Typing。 type TypeApple = { name: string, count: number }/** @type {TypeApple} */const apple = { name: 'foo', count: 100 }二、细化模块分类。一般情况下,模块都会有耦合。但如果耦合度过高,往往是因为模块没有细分到位。如果细化模块?举例,假如有一个模块叫Operation,里面既包含操作相关逻辑,也有操作面板逻辑。随着业务发展,操作面板逻辑越来越多。我们完全可以将操作面板逻辑单独抽成一个模块OperationPanel。 三、解耦可视化库和Vue/Vuex。写业务的时候,很容易因为方便,在Vue组件或Vuex模块中代码越写越长,越来越难维护。这个项目也不列外。所以重构的时候,单独将可视化库喜爱那个管逻辑抽成模块,并使用类Vuex写法(state, getters, mutations, actions)进行管理。 class Counter { // # state /** @type {number} */ count = 0 // # getters get countText() { return `Count is: ${ this.count }` } // # mutations /** @param {number} count*/ SET_COUNT = count => { this.count = count } // # actions /** @param {number} count*/ logCount = ( count ) => { this.SET_COUNT( count ) console.log( this.countText ) }}四、最后一条,编写可维护性高的代码。这里说两个方法。 ...

July 4, 2019 · 2 min · jiezi

GoogleGame-Builder不懂编程也能开发-3D-游戏

简评: 之前微软曾推出过「Kodu Game Lab」,它可以让完全没有编程经验的人通过简单的步骤打造属于自己的游戏。无独有偶,Google 最近在 Steam 也推出了类似的程序「Game Builder」,可以让使用者体会到「开发游戏跟玩游戏一样简单」的体验。「Game Builder」是来自内部孵化器 Area 120 的实验项目。如果你想制作一个第一人称多人游戏,却没有任何开发经验,也不会建立 3D 模组,这个程序就能帮到你了! 用户不必动手写一行代码,仅仅通过其内的视觉化程序编写系统,套用 if A then do B 的简单逻辑,就能够打造出一款运作正常的游戏。它就像《我的世界》一样,在「Game Builder」里头,有自建的材质物件供玩家自行打造场景,整个过程的目的就是希望玩家在开发游戏时也感觉像在玩游戏一样。 对于有一定编程经验的用户,「Game Builder」还内置了 JavaScript 开发环境,可以借此打造属于自己的卡片,并且几乎允许更改所有「Game Builder」中的预设内容。更方便的是,所有改动都无需花费时间编译,全都即时呈现。 「Game Builder」还有一个很酷的功能,那就是用户还可以开发多人游戏,甚至可以与朋友实时创建游戏。想学游戏开发,不如亲身体验一下试试,目前已在 Steam 上供玩家 免费下载 ????。 不论是「Kodu Game Lab」或「Game Builder」,都显示出「游戏」对于编程教育的重要性,类似的开发工具也会更加丰富和完善,大人和小朋友们也都更能体验到程序编写的乐趣, 原文链接: Create 3D games with friends, no experience required推荐阅读: Google 有个不为人知的面试渠道

June 25, 2019 · 1 min · jiezi

Java程序的编程与执行Java新手常见问题及解决方法乐字节Java学习

今天,我们来写一段Java程序。然后看看Java程序是如何执行的,以及Java新手小白遇到的问题和解决办法。 一、HelloWorld的编写① 新建一个XXX.java (文件的扩展名显示出来) ②编写代码 ,以类为单位编写,编写入口函数/方法 public class HelloWorld{ // 类名最好与文件名一致public static void main(String[] args){ // 程序的入口System.out.println("HelloWorld");// 以分号结尾}}③通过 javac命令完成 编译操作(需要写java文件的完整路径) ④运行java程序, 运行 .class 文件/字节码文件 通过 java 命令完成 执行如下命令: 其中: -classpath /-cp是用来指定路径。 若不指定则java会从当前目录找,找不到去java的lang包找。 若指定路径如:-classpath /-cp .;c: 文件名 则java命令会先从当前目录开始找,找不到去指定的C目录找文件名 ,若还是找不到就再去java的lang包下找 . 代表当前路径 ; 分隔路径 切记:在路径和文件名之间需要空格分隔 二、程序解释:A: Java程序的最基本单位是类,所以我们要定义一个类。 class 代表类 格式:class 类名 举例:class HelloWorld{} B:在类中写内容的时候,用大括号括起来。 C:Java程序要想执行,必须有main方法。 格式:public static void main(String[ ] args){} D:要指向那些东西呢,也用大括号括起来。 E:输出语句: System.out.println(“输出的内容”); 注:一个class 编译后会对应一个 .class文件,一个源文件当中可以有多个class,当有公共类(public)存在时文件名必须和 公共类名(public 修饰类的类名)一致。因此一个源文件当中最多只能有一个公共类 ...

June 17, 2019 · 1 min · jiezi

一文读懂架构整洁之道附知识脉络图

程序的世界飞速发展,今天所掌握的技能可能明年就过时了,但有一些东西是历久弥新,永远不变的,掌握了这些,在程序的海洋里就不会迷路,架构思想就是这样一种东西。 本文是《架构整洁之道》的读书笔记,文章从软件系统的价值出发,认识架构工作的价值和目标, 依次了解架构设计的基础、指导思想(设计原则)、组件拆分的方法和粒度、组件之间依赖设计、组件边界多种解耦方式以及取舍、降低组件之间通信成本的方法,从而在做出正确的架构决策和架构设计方面,给出作者自己的解读。 阿里巴巴中间件微信公众号对话框,发送“架构”,可获取《架构整洁之道》知识脉络图。直接访问,点击这里。 一、软件系统的价值架构是软件系统的一部分,所以要明白架构的价值,首先要明确软件系统的价值。软件系统的价值有两方面,行为价值和架构价值。 行为价值是软件的核心价值,包括需求的实现,以及可用性保障(功能性 bug 、性能、稳定性)。这几乎占据了我们90%的工作内容,支撑业务先赢是我们工程师的首要责任。如果业务是明确的、稳定的,架构的价值就可以忽略不计,但业务通常是不明确的、飞速发展的,这时架构就无比重要,因为架构的价值就是让我们的软件(Software)更软(Soft)。可以从两方面理解: 当需求变更时,所需的软件变更必须简单方便。变更实施的难度应该和变更的范畴(scope)成等比,而与变更的具体形状(shape)无关。当我们只关注行为价值,不关注架构价值时,会发生什么事情?这是书中记录的一个真实案例,随着版本迭代,工程师团队的规模持续增长,但总代码行数却趋于稳定,相对应的,每行代码的变更成本升高、工程师的生产效率降低。从老板的视角,就是公司的成本增长迅猛,如果营收跟不上就要开始赔钱啦。 可见架构价值重要性,接下来从著名的紧急重要矩阵出发,看我们如何处理好行为价值和架构价值的关系。 重要紧急矩阵中,做事的顺序是这样的:1.重要且紧急 > 2.重要不紧急 > 3.不重要但紧急 > 4.不重要且不紧急。实现行为价值的需求通常是 PD 提出的,都比较紧急,但并不总是特别重要;架构价值的工作内容,通常是开发同学提出的,都很重要但基本不是很紧急,短期内不做也死不了。所以行为价值的事情落在1和3(重要且紧急、不重要但紧急),而架构价值落在2(重要不紧急)。我们开发同学,在低头敲代码之前,一定要把杂糅在一起的1和3分开,把我们架构工作插进去。 二、架构工作的目标前面讲解了架构价值,追求架构价值就是架构工作的目标,说白了,就是用最少的人力成本满足构建和维护该系统的需求,再细致一些,就是支撑软件系统的全生命周期,让系统便于理解、易于修改、方便维护、轻松部署。对于生命周期里的每个环节,优秀的架构都有不同的追求: 开发阶段:组件不要使用大量复杂的脚手架;不同团队负责不同的组件,避免不必要的协作。部署阶段:部署工作不要依赖成堆的脚本和配置文件;组件越多部署工作越繁重,而部署工作本身是没有价值的,做的越少越好,所以要减少组件数量。运行阶段:架构设计要考虑到不同的吞吐量、不同的响应时长要求;架构应起到揭示系统运行的作用:用例、功能、行为设置应该都是对开发者可见的一级实体,以类、函数或模块的形式占据明显位置,命名能清晰地描述对应的功能。维护阶段:减少探秘成本和风险。探秘成本是对现有软件系统的挖掘工作,确定新功能或修复问题的最佳位置和方式。风险是做改动时,可能衍生出新的问题。三、编程范式其实所谓架构就是限制,限制源码放在哪里、限制依赖、限制通信的方式,但这些限制比较上层。编程范式是最基础的限制,它限制我们的控制流和数据流:结构化编程限制了控制权的直接转移,面向对象编程限制了控制权的间接转移,函数式编程限制了赋值,相信你看到这里一定一脸懵逼,啥叫控制权的直接转移,啥叫控制权的间接转移,不要着急,后边详细讲解。 这三个编程范式最近的一个也有半个世纪的历史了,半个世纪以来没有提出新的编程范式,以后可能也不会了。因为编程范式的意义在于限制,限制了控制权转移限制了数据赋值,其他也没啥可限制的了。很有意思的是,这三个编程范式提出的时间顺序可能与大家的直觉相反,从前到后的顺序为:函数式编程(1936年)、面向对象编程(1966年)、结构化编程(1968年)。 1.结构化编程 结构化编程证明了人们可以用顺序结构、分支结构、循环结构这三种结构构造出任何程序,并限制了 goto 的使用。遵守结构化编程,工程师就可以像数学家一样对自己的程序进行推理证明,用代码将一些已证明可用的结构串联起来,只要自行证明这些额外代码是确定的,就可以推导出整个程序的正确性。 前面提到结构化编程对控制权的直接转移进行了限制,其实就是限制了 goto 语句。什么叫做控制权的直接转移?就是函数调用或者 goto 语句,代码在原来的流程里不继续执行了,转而去执行别的代码,并且你指明了执行什么代码。为什么要限制 goto 语句?因为 goto 语句的一些用法会导致某个模块无法被递归拆分成更小的、可证明的单元。而采用分解法将大型问题拆分正是结构化编程的核心价值。 其实遵守结构化编程,工程师们也无法像数学家那样证明自己的程序是正确的,只能像物理学家一样,说自己的程序暂时没被证伪(没被找到bug)。数学公式和物理公式的最大区别,就是数学公式可被证明,而物理公式无法被证明,只要目前的实验数据没把它证伪,我们就认为它是正确的。程序也是一样,所有的 test case 都通过了,没发现问题,我们就认为这段程序是正确的。 2.面向对象编程 面向对象编程包括封装、继承和多态,从架构的角度,这里只关注多态。多态让我们更方便、安全地通过函数调用的方式进行组件间通信,它也是依赖反转(让依赖与控制流方向相反)的基础。 在非面向对象的编程语言中,我们如何在互相解耦的组件间实现函数调用?答案是函数指针。比如采用C语言编写的操作系统中,定义了如下的结构体来解耦具体的IO设备, IO 设备的驱动程序只需要把函数指针指到自己的实现就可以了。 struct FILE { void (*open)(char* name, int mode); void (*close)(); int (*read)(); void (*write)(char); void (*seek)(long index, int mode);}这种通过函数指针进行组件间通信的方式非常脆弱,工程师必须严格按照约定初始化函数指针,并严格地按照约定来调用这些指针,只要一个人没有遵守约定,整个程序都会产生极其难以跟踪和消除的 Bug。所以面向对象编程限制了函数指针的使用,通过接口-实现、抽象类-继承等多态的方式来替代。 前面提到面向对象编程对控制权的间接转移进行了限制,其实就是限制了函数指针的使用。什么叫做控制权的间接转移?就是代码在原来的流程里不继续执行了,转而去执行别的代码,但具体执行了啥代码你也不知道,你只调了个函数指针或者接口。 ...

June 12, 2019 · 1 min · jiezi

projecteulerproblem12

problem12地址:https://projecteuler.net/problem=12。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:1 + 2 + 3 + ...的和中第一个有超过500个因数。 #include <stdio.h>#include <math.h>#include "debug.h"#define NUM 500int main(int argc, char **argv){ int i = 0; int sum = 0; int num = 0; int j; debugTime(); while (num <= NUM){ i++; sum = i * (i + 1) / 2; num = 0; j = 1; while (j <= (sum / j)){ if (0 == (sum % j)){ if (j == (sum / j)) num++; else num += 2; } j++; } } printf("Problem12 Answer: %d\n", sum ); debugTime(); return 0;}

June 9, 2019 · 1 min · jiezi

projecteulerproblem11

problem11地址:https://projecteuler.net/problem=11。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找出20X20表格中上下左右乘积最大值。 #include <stdio.h>#include <string.h>#include <stdlib.h>#include "debug.h"#define NUM 20int main(int argc, char **argv){ char *strsrc= "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"; char *sep = " "; char *s = NULL; int list[NUM][NUM]; int i, j; char *tmp; long int iResult = 0; long int tmpResult = 0; debugTime(); s = strdup(strsrc); tmp = strsep(&s, sep); i = 0; while (NULL != tmp){ list[i / NUM][i % NUM] = atoi(tmp); tmp = strsep(&s, sep); i++; } for (i = 0; i < NUM; i++){ for (j = 0; j < NUM; j++){ if (0 == list[i][j]) continue; if (NUM > j + 3){ tmpResult = list[i][j] * list[i][j + 1] * list[i][j + 2] * list[i][j + 3]; iResult = iResult>tmpResult?iResult:tmpResult; } if (NUM > i + 3){ tmpResult = list[i][j] * list[i + 1][j] * list[i + 2][j] * list[i + 3][j]; iResult = iResult>tmpResult?iResult:tmpResult; } if ((NUM > i + 3) && (NUM > j + 3)){ tmpResult = list[i][j] * list[i + 1][j + 1] * list[i + 2][j + 2] * list[i + 3][j + 3]; iResult = iResult>tmpResult?iResult:tmpResult; } if ((NUM > i + 3) && (NUM > j - 3)){ tmpResult = list[i][j] * list[i + 1][j - 1] * list[i + 2][j - 2] * list[i + 3][j - 3]; iResult = iResult>tmpResult?iResult:tmpResult; } } } printf("Problem11 Answer: %ld\n",iResult); debugTime(); return 0;}

June 8, 2019 · 3 min · jiezi

projecteulerproblem10

problem10地址:https://projecteuler.net/problem=10。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到2000000内质数和。 #include <stdio.h>#include <math.h>#include "debug.h"#include "prime.h"#define NUM 2000000int main(int argc, char **argv){ debugTime(); initGlobalPrime(); printf("Problem10 Answer: %lld\n", findPrimeSumByNum(NUM)); debugTime(); freeGlobalPrime(); debugTime(); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem8

problem8地址:https://projecteuler.net/problem=8。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到给出一系列数中相邻13位的最大乘积。 #include <stdio.h>#include <string.h>#include "debug.h"#define NUM 13int main(int argc, char **argv){ char *strsrc = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"; int length = strlen(strsrc); long long int sum = 1; long long int isum; int i, j; debugTime(); for (i=0; i<= NUM - 1; i++){ sum *= (strsrc[i] - '0'); } for (i=0; i <= (length - NUM); i++){ if (strsrc[i] < strsrc[i + NUM]){ isum = 1; for (j = i + 1; j <= i + NUM; j++){ isum *= (strsrc[j] - '0'); } sum = (sum > isum)?(sum):(isum); } } printf("Problem8 Answer: %lld\n", sum); debugTime(); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem6

problem6地址:https://projecteuler.net/problem=6。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到100和平方与平方和的差值。 #include <stdio.h>#include <math.h>#include "debug.h"#define NUM 100int main(int argc, char **argv){ long int iResult = 0; int i, j; debugTime(); for (i = 1; i < NUM; i++){ for (j = i + 1; j <= NUM; j++){ iResult += i * j; } } iResult *= 2; printf("Problem6 Answer: %ld\n", iResult); debugTime(); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem7

problem7地址:https://projecteuler.net/problem=7。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到第10001个素数。 #include <stdio.h>#include <math.h>#include "debug.h"#include "prime.h"#define NUM 10001int main(int argc, char **argv){ debugTime(); initGlobalPrime(); printf("Problem7 Answer: %lld\n", findPrimeByCount(NUM)); debugTime(); freeGlobalPrime(); debugTime(); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem9

problem9地址:https://projecteuler.net/problem=9。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:和为1000,且满足勾股定理的数最大积。 #include <stdio.h>#include <math.h>#include "elr_debug.h"#define NUM 1000int main(int argc, char **argv){ int a, b, c; long int result = 0; long int lResult; elrDebugTime(EDT_BEGIN); for (a=1; a < NUM / 2; a++){ for (b=a+1; b < NUM; b++){ c = NUM - a - b; if ((c>b) && (c*c==b*b+a*a)) { lResult = a * b *c; result = result>lResult?result:lResult; } } } printf("Problem9 Answer: %ld\n", result); elrDebugTime(EDT_SPEND); elrDebugTime(EDT_END); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem5

problem5地址:https://projecteuler.net/problem=5。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到能整除1到20最小的数。 #include <stdio.h>#include <math.h>#include "elr_debug.h"#include "elr_list_int.h"#include "elr_prime.h"#define NUM 20int main(int argc, char **argv){ pIntNode tmpPrimeNode; int i; long int lResult = 1; elrDebugTime(EDT_BEGIN); initGlobalPrime(); if (NUM > globalPrimeNum) isPrime(NUM); tmpPrimeNode = globalPrime; do{ if (NUM < tmpPrimeNode->data) break; i = 1; while (pow(tmpPrimeNode->data, i) < NUM) i++; lResult *= pow(tmpPrimeNode->data, i - 1); tmpPrimeNode = tmpPrimeNode->next; }while (globalPrime != tmpPrimeNode); printf("Problem5 Answer: %ld\n", lResult); freeGlobalPrime(); elrDebugTime(EDT_SPEND); elrDebugTime(EDT_END); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem4

problem4地址:https://projecteuler.net/problem=4。 源码:git@code.aliyun.com:c-program/projecteuler.gitt。问题:找到三位数相乘最大回文数。 #include <stdio.h>#include <math.h>#include "debug.h"#define BIT 3int isPalindrome(const long int number){ char tmp[BIT * 2] = ""; int i = 0; int lth = sprintf(tmp, "%ld", number) - 1; while (i < lth - i){ if (tmp[i] != tmp[lth - i]) return 0; i++; } return 1;}int main(int argc, char **argv){ int iMin = pow(10, BIT - 1); int iMax = pow(10, BIT); long int iResult = 0; int i, j; long int tmpResult = 0; debugTime(); for (i = iMax - 1; i > iMin; i--){ for (j = i; j > iMin; j--){ tmpResult = i * j; if (isPalindrome(tmpResult) && (iResult < tmpResult)){ iResult = tmpResult; break; } } } printf("Problem4 Answer: %ld\n", iResult); debugTime(); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem3

problem3地址:https://projecteuler.net/problem=3。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到600851475143最大质因数。 #include <stdio.h>#include <math.h>#define MAXNUM 600851475143int main(int argc, char **argv){ long long int tmp = MAXNUM; long long int i; long long int max = sqrt(tmp) + 1; for (i = 2; i <= max; i++){ while (! (tmp % i)){ tmp = tmp / i; } if (1 == tmp) break; } printf("Problem3 Answer: %lld\n", i); return 0;}

June 8, 2019 · 1 min · jiezi

projecteulerproblem2

problem2地址:https://projecteuler.net/problem=2。 源码:git@code.aliyun.com:c-program/projecteuler.git。问题:找到4000000内斐波那契数列中偶数的和。 #include <stdio.h>#define MAXNUM 4000000int main(int argc, char **argv){ long long int sum = 0; long long int a = 1; long long int b = 1; long long int c = 0; while ((c = a + b) <= MAXNUM){ a = b; b = c; if (! (c % 2)) sum = sum + c; } printf("Problem2 Answer: %lld\n", sum);}

June 8, 2019 · 1 min · jiezi

projecteulerproblem1

problem1地址:https://projecteuler.net/problem=1。 问题:找到1000内3或5的倍数的和。 源码:git@code.aliyun.com:c-program/projecteuler.git。 #include <stdio.h>#define MAXNUM 1000int main(int argc, char **argv){ int iResult = 0; int i; for (i = 1; i < MAXNUM; i = i + 2){ if ((i % 3 == 0) || (i % 5 == 0)) iResult += i; } printf("Problem1 Answer: %d\n", iResult); return 0;}

June 8, 2019 · 1 min · jiezi

ApacheCN-编程大数据数据科学人工智能学习资源-20196

Special Sponsors 我们组织了一个开源互助平台,方便开源组织和大 V 互相认识,互相帮助,整合资源。请回复这个帖子并注明组织/个人信息来申请加入。请回复这个帖子来推荐希望翻译的内容。如果大家遇到了做得不错的教程或翻译项目,也可以推荐给我们。我们会联系项目的维护者,一起把它变得更好。我们的公众号接受大家的投稿。将文章链接通过消息发给公众号,我们会和你联系。我们近期有制作 Kaggle 教学视频的计划,如果你有兴趣参与,请联系片刻(QQ 529815144)。为了能够将开源事业做大做强,ApacheCN 需要与公益基金会(IT、教育类)合作,欢迎大家提供帮助。如果你不希望再收到我们的邮件,请在这里添加你的邮箱来退订。开源不是一个人的事情,我们的各个模块(请见组织架构)都需要人手来维护。如果你有兴趣参与,请联系片刻(QQ 529815144)。权限分配灵活,能者居之。特色项目AILearning - 机器学习实战 文字教程教学版视频讨论版视频Kaggle 学习系列视频简历分享系列视频AI 路线图(知识树)Machine Learning Mastery 博客文章翻译PyTorch 0.2/0.3/0.4/1.0 中文文档和教程人工智能/机器学习/数据科学比赛系列 Kaggle 项目实战教程:文档 + 代码 + 视频数据科学比赛收集平台LeetCode,HackRank,剑指 offer,经典算法实现斯坦福 AI 系列笔记 斯坦福 CS229 机器学习中文笔记DeepLearning.ai 深度学习中文笔记UCB CS/DS 系列课本 UCB CS61a 课本:SICP Python 描述UCB CS61b 课本:Java 中的数据结构UCB Data8 课本:计算与推断思维UCB Prob140 课本:面向数据科学的概率论UCB DS100 课本:数据科学的原理与技巧Numpy 技术栈中文文档 NumPy 中文文档Pandas 中文文档Matplotlib 中文文档Sklearn 0.19 中文文档statsmodels 中文文档seaborn 0.9 中文文档Girls In AI:面向编程零基础女孩子的AI算法工程师养成计划Daily Interview - 人工智能面经编程语言Java Java 编程思想Java 8 简明教程Java 从0~1个人笔记Java8 中文官方教程Python ...

June 1, 2019 · 2 min · jiezi

数据库优化第一步数据类型

阅读原文:数据库优化第一步:数据类型 为什么选择合适的数据类型很重要?因为数据类型会影响存储空间的开销,也会影响数据的查询效率,可以说这是你优化数据库的第一步要做的事情。 疑问本文的前提环境是:MySQL 5.7 , UTF-8 Unicode char与varchar的区别和选择?CHAR是固定长度,长度范围为0-255字符,存储时,如果字符数没有达到定义的位数,会在后面用空格补全存入数据库中,比指定长度大的值将被截短。VARCHAR是变长长度,长度范围为0-21845(utf8)或16383(utf8mb4)字符,存储时,如果字符没有达到定义的位数,也不会在后面补空格,当然还有一或两个字节来描述该字节长度varchar(10) 括号中的数字代表 字节 还是 字符 ?代表的是字符,无论英文或中文 都可以存储10个字符。 int(5) 括号中的数字代表 什么 ?数字5并不是代表存储的长度,int型的长度是4字节固定的,括号里的数字仅仅代表最小显示的宽度。 那我们设置它的意义何在呢? 其实当我们长度超过5的时候它是没用的,和没有设置一样,当长度没有超过5时,并且设置了zerofill(填充零),它会在不足的从左侧填充零,假如插入了数字 22 ,那么显示的是 00022 (navicat不显示,可在cmd中查看)。 所以你指定的数字和它的大小及存储的空间没有关系。 int 括号中的数字为什么默认11或10 ?int有符号数最小值: -2 1 4 7 4 8 3 6 4 8 总共11位 2 1 4 7 4 8 3 6 4 7 总共10位 所以你懂得…… 其它的整数类型以此类推。 现在为什么很少使用CHAR ?因为我们使用的是 InnoDB存储引擎,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。 Value CHAR(4) 实际存储VARCHAR(4) 实际存储''' '4 bytes''1 bytes'ab''ab '4 bytes'ab'3 bytes'abcd''abcd'4 bytes'abcd'5 bytes'abcdef''abcd'4 bytes'abcd'5 bytes可以用上表来表示,当定义char时,不管你存入多少字符,都会占用到你定义的字符数,而用varchar时,则和你输入的字符数有关,会多一到两个字节来记录字节长度,当数据位占用的字节数小于255时,用1个字节来记录长度,数据位占用字节数大于255时,用2个字节来记录长度,还有一位来记录是否为nul值 ...

May 27, 2019 · 1 min · jiezi

使用Python开始Web-Scraping

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:15min 在本文中,我们将学习以编程方式执行操作以自动检索和处理信息。Python  requests模块使得执行这些操作变得非常容易。本文知识点: 下载网页解析HTML抓取网络访问受密码保护的页面加快网络抓取速度下载网页下载网页的基本功能包括GET针对URL 发出HTTP 请求。这是任何Web浏览器的基本操作。我们将在此配方中看到如何获取获取网页的简单请求。 安装  requests模块: $ echo "requests==2.18.3" >> requirements.txt$ source .venv/bin/activate(.venv) $ pip install -r requirements.txt如何下载网页导入requests模块:>>> import requests请求URL,这需要一两秒钟:>>> url = 'http://www.columbia.edu/~fdc/sample.html'>>> response = requests.get(url)检查返回的对象状态代码:>>> response.status_code200检查结果的内容:>>> response.text'\n\n\n...FULL BODY...\n'检查正在进行的和返回的标题:>>> response.request.headers{'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}>>> response.headers{'Date': 'Fri, 25 May 2018 21:51:47 GMT', 'Server': 'Apache', 'Last-Modified': 'Thu, 22 Apr 2004 15:52:25 GMT', 'Accept-Ranges': 'bytes', 'Vary': 'Accept-Encoding,User-Agent', 'Content-Encoding': 'gzip', 'Content-Length': '8664', 'Keep-Alive': 'timeout=15, max=85', 'Connection': 'Keep-Alive', 'Content-Type': 'text/html', 'Set-Cookie': 'BIGipServer~CUIT~www.columbia.edu-80-pool=1764244352.20480.0000; expires=Sat, 26-May-2018 03:51:47 GMT; path=/; Httponly'}操作requests非常简单; GET在这种情况下,通过URL 执行操作。这将返回result可以分析的对象。主要元素是status_code身体内容,可以表示为text。 ...

May 15, 2019 · 3 min · jiezi

Python数据分析实用程序

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:13min 本文包含以下部分: 数据分析,数据科学,大数据Python的数据分析简史dautil的高级概述IPython笔记本实用程序下载数据绘制实用程序揭开Docker的神秘面纱数据分析,数据科学,大数据您可能已经看到维恩图将数据科学描述为数学/统计学,计算机科学和领域专业知识的交集。数据分析是永恒的,并且在数据科学和计算机科学之前存在。您可以使用笔和纸进行数据分析,并在更现代的时候使用袖珍计算器进行数据分析。 数据分析涉及许多方面,例如做出决策或提出新的假设和问题。围绕数据科学和大数据的炒作,状态和经济回报让我想起了数据仓库和商业智能成为流行语的时间。商业智能和数据仓库的最终目标是构建管理仪表板。这涉及很多政治和组织方面,但在技术方面,主要是关于数据库。另一方面,数据科学不是以数据库为中心的,而是在很大程度上依赖于机器学习。机器学习由于数据量较大,技术已成为必要。数据增长是由世界人口的增长和社交媒体和移动设备等新技术的兴起引起的。实际上,数据增长可能是我们可以确定的唯一趋势。构建仪表板和应用机器学习之间的区别与搜索引擎的演变方式类似。 搜索引擎最初只不过是手工创建的组织良好的链接集合。最终,自动化方法获胜。由于将及时创建更多数据(而不是销毁),我们可以预期自动数据分析会增加。 Python的数据分析简史1989年:Guido van Rossum在荷兰的CWI实施了第一个Python版本,作为圣诞节爱好项目。1995年:Jim Hugunin创建了NumPy的前身Numeric。1999年:Pearu Peterson将f2py描述为Fortran和Python之间的桥梁。2000:Python 2.0发布。2001:SciPy库发布。此外,还创建了Numarray,一个竞争的数字库。费尔南多佩雷斯发布了IPython,这是一个下午的黑客攻击。NLTK作为一个研究项目发布。2002年:John Hunter创建了matplotlib库。2005年:NumPy由Travis Oliphant发布。最初,NumPy是Numeric扩展,其功能受到Numarray的启发。2006:NumPy 1.0发布。SQLAlchemy的第一个版本发布了。2007年:scikit-learn项目由David Cournapeau发起为Google Summer of Code项目。Cython是从Pyrex分叉的。Cython后来被大量用于熊猫和scikit-学习以提高性能。2008年:Wes McKinney开始研究Pandas。Python 3.0发布了。2011:IPython 0.12版本引入了IPython笔记本。Packt发布了NumPy 1.5初学者指南。2012年:Packt发布了NumPy Cookbook。2013:Packt发布NumPy初学者指南 - 第二版。2014年:Fernando Perez宣布Project Jupyter,旨在打造一款与语言无关的笔记本电脑。Packt发布了学习NumPy数组和Python数据分析。2015:Packt发布NumPy初学者指南 - 第三版和NumPy Cookbook - 第二版。dautil的高级概述dautil模块总结在下表中: 模描述LOCdautil.collect包含与集合相关的实用程序331dautil.conf包含配置实用程序48dautil.data包含用于下载和加载数据的实用程序468dautil.db包含与数据库相关的实用程序98dautil.log_api包含日志实用程序204dautil.nb包含IPython / Jupyter笔记本小部件和实用程序609dautil.options配置与数据分析相关的多个库的动态选项71dautil.perf包含与性能相关的实用程序162dautil.plotting包含绘图实用程序382dautil.report包含报告实用程序232dautil.stats包含统计函数和实用程序366dautil.ts包含时间序列和日期的实用程序217dautil.web包含用于Web挖掘和HTML处理的实用程序47IPython笔记本实用程序IPython笔记本已成为数据分析的标准工具。该dautil.nb有几个互动IPython的小部件,以帮助乳胶渲染,matplotlib属性的设置,和绘图。Ivan定义了一个Context类,它表示小部件的配置设置。这些设置存储在当前工作目录中名为dautil.json的漂亮打印的JSON文件中。这可以扩展,甚至可以使用数据库后端。以下是一个示例dautil.json的编辑摘录(因此它不占用大量空间): { ... "calculating_moments": { "figure.figsize": [ 10.4, 7.7 ], "font.size": 11.2 }, "calculating_moments.latex": [ 1, 2, 3, 4, 5, 6, 7 ], "launching_futures": { "figure.figsize": [ 11.5, 8.5 ] }, "launching_futures.labels": [ [ {}, { "legend": "loc=best", "title": "Distribution of Means" } ], [ { "legend": "loc=best", "title": "Distribution of Standard Deviation" }, { "legend": "loc=best", "title": "Distribution of Skewness" } ] ],...} Context对象可以使用字符串构建 - Ivan建议使用笔记本的名称,但任何唯一标识符都可以。该dautil.nb.LatexRenderer还使用了Context类。它是一个实用程序类,可帮助您在IPython / Jupyter笔记本中编号和渲染Latex方程式,例如,如下所示: ...

May 14, 2019 · 2 min · jiezi

Go有趣520用Go做一个表白图让文字跳舞

今天给大家介绍一个段有趣的代码将图片生成用文字组成的图案。看过B站那些文字组成的跳舞小姐姐的GIF吗?用这段代码你可以自己做出来。 GIF我就懒得做了,作为一个后端程序员,不是太有耐心一帧一帧截图,大家可以先看看把图案文本贴在VScode里的效果 直接上码,说明都在代码中 /*先定义一个函数参数: imgPath: 图片路径 size: 生成文本后的尺寸(这个不是真实的尺寸,1代表1个像素,1个像素会被替换成1个字符,所以是字符的个数,高度是自动换算的,所以这里的size指的是“宽度”被压缩成多少像素) txts: 将像素处理成的字符列表 rowend: 换行字符(因为windows和linux不同) output: 生成文本文件保存路径*/func img2txt(imgPath string, size uint, txts []string, rowend string, output string) { //获取图片文件 file, err := os.Open(imgPath) if err != nil { fmt.Println(err.Error()) return } defer file.Close() //用图片文件获取图片对象 img, err := png.Decode(file) if err != nil { fmt.Println(err.Error()) return } //用将宽度设置为size,然后换算出等比例的高度 var width = size var height = (size * uint(img.Bounds().Dy())) / (uint(img.Bounds().Dx())) height = height * 6 / 10 //这里6/10是大致字符的宽高比 newimg := resize.Resize(width, height, img, resize.Lanczos3) //根据高宽resize图片,并得到新图片的像素值 dx := newimg.Bounds().Dx() dy := newimg.Bounds().Dy() //创建一个字节buffer,一会用来保存字符 textBuffer := bytes.Buffer{} //遍历图片每一行每一列像素 for y := 0; y < dy; y++ { for x := 0; x < dx; x++ { colorRgb := newimg.At(x, y) r, g, b, _ := colorRgb.RGBA() //获得三原色的值,算一个平均数出来 avg := uint8((r + g + b) / 3 >> 8) //有多少个用来替换的字符就将256分为多少个等分,然后计算这个像素的平均值趋紧与哪个字符,最后,将这个字符添加到字符buffer里 num := avg / uint8(256/len(txts)) textBuffer.WriteString(txts[num]) fmt.Print(txts[num]) //打印出来 } textBuffer.WriteString(rowend) //一行结束,换行 fmt.Print(rowend) } //将字符buffer的数据写入到文本文件里,结束。 f, err := os.Create(output + ".txt") if err != nil { fmt.Println(err.Error()) return } defer f.Close() f.WriteString(textBuffer.String())}然后,在main函数里 ...

May 14, 2019 · 1 min · jiezi

架构整洁之道-看这一篇就够了

阿里妹导读:程序的世界飞速发展,今天所掌握的技能可能明年就过时了,但有些知识历久弥新,掌握了它们,你在程序的海洋中就不会迷路,架构思想就是这样的知识。本文是《架构整洁之道》的读书心得,作者将书中内容拆解后再组织,不仅加入了个人的独到见解,而且用一张详细的知识脉络图帮助大家了解整本书的精华。如果你读过这本书,可以将本文当做一次思想交流,如果你还没看过这本书,更要阅读这篇文章,相信你会得到不同于以往的启发。 本篇文章我们将从软件系统的价值出发,首先认识架构工作的价值和目标, 接下来依次了解架构设计的基础、指导思想(设计原则)、组件拆分的方法和粒度、组件之间依赖设计、组件边界多种解耦方式以及取舍、降低组件之间通信成本的方法,从而最终指导我们做出正确的架构决策和架构设计。 一、软件系统的价值架构是软件系统的一部分,所以要明白架构的价值,首先要明确软件系统的价值。软件系统的价值有两方面,行为价值和架构价值。 行为价值是软件的核心价值,包括需求的实现,以及可用性保障(功能性 bug 、性能、稳定性)。这几乎占据了我们90%的工作内容,支撑业务先赢是我们工程师的首要责任。如果业务是明确的、稳定的,架构的价值就可以忽略不计,但业务通常是不明确的、飞速发展的,这时架构就无比重要,因为架构的价值就是让我们的软件(Software)更软(Soft)。可以从两方面理解: 当需求变更时,所需的软件变更必须简单方便。变更实施的难度应该和变更的范畴(scope)成等比,而与变更的具体形状(shape)无关。当我们只关注行为价值,不关注架构价值时,会发生什么事情?这是书中记录的一个真实案例,随着版本迭代,工程师团队的规模持续增长,但总代码行数却趋于稳定,相对应的,每行代码的变更成本升高、工程师的生产效率降低。从老板的视角,就是公司的成本增长迅猛,如果营收跟不上就要开始赔钱啦。 可见架构价值重要性,接下来从著名的紧急重要矩阵出发,看我们如何处理好行为价值和架构价值的关系。 重要紧急矩阵中,做事的顺序是这样的:1.重要且紧急 > 2.重要不紧急 > 3.不重要但紧急 > 4.不重要且不紧急。实现行为价值的需求通常是 PD 提出的,都比较紧急,但并不总是特别重要;架构价值的工作内容,通常是开发同学提出的,都很重要但基本不是很紧急,短期内不做也死不了。所以行为价值的事情落在1和3(重要且紧急、不重要但紧急),而架构价值落在2(重要不紧急)。我们开发同学,在低头敲代码之前,一定要把杂糅在一起的1和3分开,把我们架构工作插进去。 二、架构工作的目标前面讲解了架构价值,追求架构价值就是架构工作的目标,说白了,就是用最少的人力成本满足构建和维护该系统的需求,再细致一些,就是支撑软件系统的全生命周期,让系统便于理解、易于修改、方便维护、轻松部署。对于生命周期里的每个环节,优秀的架构都有不同的追求: 开发阶段:组件不要使用大量复杂的脚手架;不同团队负责不同的组件,避免不必要的协作。部署阶段:部署工作不要依赖成堆的脚本和配置文件;组件越多部署工作越繁重,而部署工作本身是没有价值的,做的越少越好,所以要减少组件数量。运行阶段:架构设计要考虑到不同的吞吐量、不同的响应时长要求;架构应起到揭示系统运行的作用:用例、功能、行为设置应该都是对开发者可见的一级实体,以类、函数或模块的形式占据明显位置,命名能清晰地描述对应的功能。维护阶段:减少探秘成本和风险。探秘成本是对现有软件系统的挖掘工作,确定新功能或修复问题的最佳位置和方式。风险是做改动时,可能衍生出新的问题。三、编程范式其实所谓架构就是限制,限制源码放在哪里、限制依赖、限制通信的方式,但这些限制比较上层。编程范式是最基础的限制,它限制我们的控制流和数据流:结构化编程限制了控制权的直接转移,面向对象编程限制了控制权的间接转移,函数式编程限制了赋值,相信你看到这里一定一脸懵逼,啥叫控制权的直接转移,啥叫控制权的间接转移,不要着急,后边详细讲解。 这三个编程范式最近的一个也有半个世纪的历史了,半个世纪以来没有提出新的编程范式,以后可能也不会了。因为编程范式的意义在于限制,限制了控制权转移限制了数据赋值,其他也没啥可限制的了。很有意思的是,这三个编程范式提出的时间顺序可能与大家的直觉相反,从前到后的顺序为:函数式编程(1936年)、面向对象编程(1966年)、结构化编程(1968年)。 1.结构化编程 结构化编程证明了人们可以用顺序结构、分支结构、循环结构这三种结构构造出任何程序,并限制了 goto 的使用。遵守结构化编程,工程师就可以像数学家一样对自己的程序进行推理证明,用代码将一些已证明可用的结构串联起来,只要自行证明这些额外代码是确定的,就可以推导出整个程序的正确性。 前面提到结构化编程对控制权的直接转移进行了限制,其实就是限制了 goto 语句。什么叫做控制权的直接转移?就是函数调用或者 goto 语句,代码在原来的流程里不继续执行了,转而去执行别的代码,并且你指明了执行什么代码。为什么要限制 goto 语句?因为 goto 语句的一些用法会导致某个模块无法被递归拆分成更小的、可证明的单元。而采用分解法将大型问题拆分正是结构化编程的核心价值。 其实遵守结构化编程,工程师们也无法像数学家那样证明自己的程序是正确的,只能像物理学家一样,说自己的程序暂时没被证伪(没被找到bug)。数学公式和物理公式的最大区别,就是数学公式可被证明,而物理公式无法被证明,只要目前的实验数据没把它证伪,我们就认为它是正确的。程序也是一样,所有的 test case 都通过了,没发现问题,我们就认为这段程序是正确的。 2.面向对象编程 面向对象编程包括封装、继承和多态,从架构的角度,这里只关注多态。多态让我们更方便、安全地通过函数调用的方式进行组件间通信,它也是依赖反转(让依赖与控制流方向相反)的基础。 在非面向对象的编程语言中,我们如何在互相解耦的组件间实现函数调用?答案是函数指针。比如采用C语言编写的操作系统中,定义了如下的结构体来解耦具体的IO设备, IO 设备的驱动程序只需要把函数指针指到自己的实现就可以了。 struct FILE { void (*open)(char* name, int mode); void (*close)(); int (*read)(); void (*write)(char); void (*seek)(long index, int mode);}这种通过函数指针进行组件间通信的方式非常脆弱,工程师必须严格按照约定初始化函数指针,并严格地按照约定来调用这些指针,只要一个人没有遵守约定,整个程序都会产生极其难以跟踪和消除的 Bug。所以面向对象编程限制了函数指针的使用,通过接口-实现、抽象类-继承等多态的方式来替代。 前面提到面向对象编程对控制权的间接转移进行了限制,其实就是限制了函数指针的使用。什么叫做控制权的间接转移?就是代码在原来的流程里不继续执行了,转而去执行别的代码,但具体执行了啥代码你也不知道,你只调了个函数指针或者接口。 ...

May 14, 2019 · 1 min · jiezi

Python中的单元测试

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min 基本单元测试在我们开始讨论新的概念和功能之前,让我们来看看如何使用unittest来表达我们已经学到的想法。这样,我们就能有一些坚实的基础来建立我们的新理解。 采取行动的时间-用unittest测试PID我们将访问PID类(或至少访问PID类的测试)。我们将编写测试,以便它们在unittest框架内运行。 我们将使用unittest框架实现测试。 创建一个名为新文件test_pid.py在同一目录pid.py。请注意,这是一个.py文件:unittest测试是纯 python源代码,而不是包含源代码的纯文本。这意味着从纪录片的角度来看,测试的用处不大,但可以交换其他好处。将以下代码插入到新创建的test_pid.py中from unittest import TestCase, mainfrom mocker import Mockerimport pidclass test_pid_constructor(TestCase): def test_without_when(self): mocker = Mocker() mock_time = mocker.replace('time.time') mock_time() mocker.result(1.0) mocker.replay() controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12) mocker.restore() mocker.verify() self.assertEqual(controller.gains, (0.5, 0.5, 0.5)) self.assertAlmostEqual(controller.setpoint[0], 0.0) self.assertEqual(len(controller.setpoint), 1) self.assertAlmostEqual(controller.previous_time, 1.0) self.assertAlmostEqual(controller.previous_error, -12.0) self.assertAlmostEqual(controller.integrated_error, 0) def test_with_when(self): controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=1, initial=12, when=43) self.assertEqual(controller.gains, (0.5, 0.5, 0.5)) self.assertAlmostEqual(controller.setpoint[0], 1.0) self.assertEqual(len(controller.setpoint), 1) self.assertAlmostEqual(controller.previous_time, 43.0) self.assertAlmostEqual(controller.previous_error, -11.0) self.assertAlmostEqual(controller.integrated_error, 0)class test_calculate_response(TestCase): def test_without_when(self): mocker = Mocker() mock_time = mocker.replace('time.time') mock_time() mocker.result(1.0) mock_time() mocker.result(2.0) mock_time() mocker.result(3.0) mock_time() mocker.result(4.0) mock_time() mocker.result(5.0) mocker.replay() controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12) self.assertEqual(controller.calculate_response(6), -3) self.assertEqual(controller.calculate_response(3), -4.5) self.assertEqual(controller.calculate_response(-1.5), -0.75) self.assertEqual(controller.calculate_response(‑2.25), ‑1.125) mocker.restore() mocker.verify() def test_with_when(self): controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12, when=1) self.assertEqual(controller.calculate_response(6, 2), -3) self.assertEqual(controller.calculate_response(3, 3), -4.5) self.assertEqual(controller.calculate_response(‑1.5, 4), ‑0.75) self.assertEqual(controller.calculate_response(‑2.25, 5), ‑1.125)if __name__ == '__main__': main()键入以下命令运行测试:$ python test_pid.py ...

May 10, 2019 · 2 min · jiezi

Python面试问题指南如何编码链表

什么是链表?链表是一种数据结构,由许多称为“节点”的迷你数据结构组成。节点链接在一起形成一个列表。 整个链表,由3个节点链接在一起组成。 每个节点包含2个属性它的价值。这可以是任何东西:整数,字符,字符串,对象等。指向序列中下一个节点的指针。一些定义头节点:头节点只是链表中的第一个节点。从上面的例子可以看出,包含'5'的节点是第一个节点,因此是头部。 '尾节点:尾节点是序列中的最后一个节点。由于它是最后一个节点,因此它指向null,因为序列中没有下一个节点。在上面的示例中,包含“3”的节点将是尾节点。 单身联系与双重联系在链接列表方面,有两种主要类型。 那些“单独”联系的,以及那些“双重”联系的。 单独链接意味着每个节点仅指向最多1个其他节点,即其前面的节点。这在上面的例子中展示。 双重链接意味着每个节点可以指向其他2个节点,前面的节点和它后面的节点。正如我们从下面的例子中可以看到的那样,由于头节点之前没有节点(即5),因此其中一个指针指向null。 代码是如何工作的呢?编码链接列表可能是4行问题或400行问题。这取决于你想要如何接近它。 在最简单的层面上,就像我们讨论的那样,链表只是一堆连接的节点。 因此,我们真正需要创建此结构的只是一个节点对象。 class linkedListNode: def __init__(self, value, nextNode=None): self.value = value self.nextNode = nextNode在这里我们可以看到我们只是创建了一个具有value和nextNode属性的类。 要创建节点,我们只需传入一个值。 node1 = linkedListNode("3") # "3"node2 = linkedListNode("7") # "7"node3 = linkedListNode("10") # "10"在这里,我们创建了3个单独的节点。 下一步就是将它们连接在一起。 node1.nextNode = node2 node2.nextNode = node3 上面的第一行使node1指向node2: “3”→“7” 上面的第二行使node2指向node3: “7”→” 10" 总之,我们留下了一个链接列表,如下所示: “3”→” 7" →” 10" →null 注意:“10”指向null,因为没有为node3分配nextNode,并且默认的nextNode为Null。 就像我之前提到的,有很多不同的方法可以做到这一点。这只是最简单的。 遍历链接列表如果您正在进行编程访谈,并且您会收到链接列表问题,那么您将无法获得所有节点。 所有你得到的是头节点。 从该头节点,您必须获得列表的其余部分。 首先让我们了解如何从Python中的节点获取值和nextNode。 假设我们有一个名为'node'的节点。 ...

May 9, 2019 · 1 min · jiezi

如何管理多个Python版本和虚拟环境

多个Python版本:在同一台机器上安装不同的Python,例如2.7和3.4。虚拟环境:独立的环境,既可以同时安装特定版本的Python,也可以安装任何特定于项目的软件包,而不会影响任何其他项目。在这里,我们将介绍使用这些工具的三种不同工具,以及何时需要每种工具。让我们探讨以下用例: venv / pyvenvpyenvpyenv-virtualenv如果您使用单个版本的Python如3.3+版本,并且想要管理不同的虚拟环境,那么venv就是您所需要的。 如果你想使用多个3.3+版本的Python,不管是否有虚拟环境,那么请使用pyenv。 如果您还想使用Python 2,那么这pyenv-virtualenv是一个不错的选择。 VENVPython 3.3+版本中包含venv包。它是创建轻量级虚拟环境的理想选择。 直到Python 3.6,一个被调用的脚本pyvenv也作为包装器被包含在内venv,但是这已被弃用。它将在Python 3.8中被完全删除。当使用venv时,可以使用完全相同的功能,并且应更新所有现有的文档。 venv用于通过终端命令创建一个新的环境: $ python3 -m venv directory-name-to-create激活: $ source name-given/bin/activate通过以下方式停用: $ deactivate如果您在停用环境后需要完全删除环境,则可以运行: $ rm -r name-given默认情况下,它创建的环境是您当前正在使用的Python版本。如果您正在编写文档,并希望读者使用正确版本的Python,则可以在命令中指定主要版本号和次要版本号,如下所示: $ python3.6 -m venv example-three-six如果阅读器使用3.6以外的版本,则该命令将不会成功,并将在其错误消息中指示。但是,任何补丁版本(例如3.6.4)都可以使用。 当环境处于活动状态时,任何包都可以通过pip正常安装到它。默认情况下,新创建的环境不包含计算机上已安装的任何软件包。因为pip它本身不一定会安装在机器上。建议先使用,升级pip到最新版本pip install --upgrade pip。 项目通常会有一个requirements.txt指定其依赖项的文件。这允许使用shortcut命令pip install -r requirements.txt命令将所有包快速安装到新创建的虚拟环境中。它们只存在于虚拟环境中。它在停用时将不可用,但在重新激活时将保持不变。 如果您不需要使用Python本身的其他版本,那么您只需要创建隔离的、特定于项目的虚拟环境。 pyenv如果您希望在一台计算机上使用多个版本的Python,那么pyenv是在版本之间安装和切换的常用工具。这不能与前面提到的贬值的pyenv脚本混淆。它不是与Python绑定的,必须单独安装。 pyenv文档对它的工作原理进行了很好的描述,因此我们将在这里简单介绍如何使用它。首先,我们需要安装它。如果使用Mac OS X,可以使用Homebrew执行此操作,或者考虑其他安装选项。 $ brew update$ brew install pyenv接下来,在shell脚本的底部添加以下内容,以允许pyenv自动更改版本: eval "$(pyenv init -)"打开您在使用外壳脚本,通过$ ~/.zshrc,$ ~/.bashrc或$ ~/.bash_profile复制并粘贴在上面的行。 运行pyenv版本将显示当前安装了哪些Python版本,在当前使用的版本旁边有一个*。pyenv version直接显示了这一点,python——version可以用来验证这一点。 要安装一个附加版本,比如3.4.0,只需使用pyenv install 3.4.0。 pyenv从四个方面来决定使用哪个版本的Python,优先顺序如下: PYENV_VERSION环境变量(如果指定)。您可以使用该pyenv shell命令在当前shell会话中设置此环境变量。当前目录中的特定于应用程序的.python版本文件(如果存在)。您可以使用pyenv local命令修改当前目录的.python版本文件。通过搜索每个父目录找到(如果有的话)第一个.python版本的文件,直到找到文件系统的根目录。全局版本文件。您可以使用pyenv全局命令修改这个文件。如果不存在全局版本文件,pyenv假设您希望使用“system”Python。(换句话说,如果pyenv不在您的路径中,则运行哪个版本。)当设置一个使用Python 3.6.4的新项目时,pyenv local 3.6.4将运行在它的根目录中。这将设置版本,并创建一个.python-version文件,以便其他贡献者的机器能够接收它。 ...

May 9, 2019 · 1 min · jiezi

提升不止一点点,Dubbo 3.0 预览版详细解读

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。更多用户信息,可以访问Dubbo @GitHub,issue#1012: Wanted: who's using dubbo。 自去年 12 月开始,Dubbo 3.0 便已正式进入开发阶段,并备受社区和广大 Dubbo 用户的关注,本文将为您详细解读 3.0 预览版的新特性和新功能。 下面先解答一下两个有意思的与 Dubbo 相关的疑问。 为什么 Dubbo 一开源就是 2.0 版本?之前是否存在 1.0 版本?笔者曾做过 Dubbo 协议的适配兼容,Dubbo 确实存在过 1.x 版本,而且从协议设计和模型设计上都与 2.0 的开源版本协议是完全不一样的。下图是关于 Dubbo 的发展路径: 阿里内部正在使用 Dubbo 开源版本吗?是的,非常确定,当前开源版本的 Dubbo 在阿里巴巴被广泛使用,而阿里的电商核心部门是用的 HSF2.2 版本,这个版本是兼容了 Dubbo 使用方式和 Remoting 协议。当然,我们现在正在做 HSF2.2 的升级,直接依赖开源版本的 Dubbo 来做内核的统一。所以,Dubbo 是得到大规模线上系统验证的分布式服务框架,这一点毋容置疑。 Dubbo 3.0 预览版的要点Dubbo 3.0 在设计和功能上的新增支持和改进,主要是以下四方面: Dubbo 内核之 Filter 链的异步化这里要指出的是,3.0 中规划的异步去阻塞和 2.7 中提供的异步是两个层面的特性。2.7 中的异步是建立在传统 RPC 中 request – response 会话模型上的,而 3.0 中的异步将会从通讯协议层面由下向上构建,关注的是跨进程、全链路的异步问题。通过底层协议开始支持 streaming 方式,不单单可以支持多种会话模型,还可以在协议层面开始支持反压、限流等特性,使得整个分布式体系更具有弹性。综上所述,2.7 关注的异步更局限在点对点的异步(一个 consumer 调用一个 provider),3.0 关注的异步化,宽度上则关注整个调用链上的异步,高度上则向上又可以包装成 Rx 的编程模型。有趣的是,Spring 5.0 发布了对 Flux 的支持,随后开始解决跨进程的异步问题。 ...

April 22, 2019 · 6 min · jiezi

Java面试题:稳定和不稳定排序算法之间的区别-MergeSort与QuickSort

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:6min你是否理解QuickSort与MergeSort之间的区别?你稳定和不稳定的排序算法的含义是什么?当面试官问到以上问题应如何回答?如果排序算法保持数字/记录的相对顺序,即如果需要排序1 1 2 3,那么如果不更改前两个排序的顺序,则认为排序算法是稳定的,但如果交换它们,则尽管总体结果或排序顺序保持不变,但它将变得不稳定。当您对对象进行排序时(例如,按键对键值对进行排序),这种差异会变得更加明显。在稳定算法的情况下,保留键值对的原始顺序,如下例所示。实际上,如果您忘记提及这些概念,面试官可能会将此问题视为快速排序与合并排序的后续工作。quicksort和mergesort之间的主要区别之一是快速排序不稳定,而合并排序是一种稳定的排序算法。顺便说一句,如果您不熟悉Quicksort和Mergesort等基本排序算法,那么我建议您学习下全面的数据结构课程,如数据结构和算法:深度使用Java。它将为您提供进一步探索所需的所有基础知识。稳定与不稳定算法假设您需要按键的递增顺序对以下键值对进行排序:INPUT:(4,5)(3,2)(4,3)(5,4)(6,4)现在,有两个密钥相同的两对的可能解决方案即(4,5)和(4,3)如下所示:OUTPUT1:(3,2),(4,5),(4,3),(5,4),(6,4)OUTPUT2:(3,2 ),(4,3),(4,5),(5,4),(6,4)将产生第一个输出的排序算法称为稳定排序算法,因为保持了相等键的原始顺序,您可以看到(4,5)以排序顺序出现在(4,3)之前,这是原始顺序,即在给定的输入中,(4,5)出现在(4,3)之前。产生第二输出的算法将被称为不稳定的排序算法,因为具有相同键的对象的顺序不按排序顺序维持。你可以看到,在第二个输出中,(4,3)出现在(4,5)之前,原始输入中不是这种情况。现在,最大的问题是稳定和不稳定排序算法的一些例子是什么?那么,你可以把所有众所周知的排序算法分成稳定和不稳定的。稳定算法的一些示例是合并排序,插入排序,冒泡排序和二叉树排序。而QuickSort,堆排序和选择排序是不稳定的排序算法。如果你还记得,Collections.sort()Java Collection框架中的方法使用迭代合并排序,这是一种稳定的算法。如果输入数组被部分排序,它的比较也比NLog(N)少得多。如果您有兴趣了解有关此主题的更多信息,我建议您学习数据结构和算法,比如算法和数据结构-第1部分和第2部分。它是Java程序员算法的综合课程之一。稳定与不稳定算法示例以下图片解释了稳定和不稳定的排序是如何工作的:这就是稳定和不稳定排序算法之间的区别。请记住,如果在排序的输出中保持相等键或数字的原始顺序,则该算法称为排序算法。稳定排序算法的一些常见示例是合并排序,插入排序和冒泡排序。 你还想要知道哪些关于面试题的知识呢?请在下方留言!

April 18, 2019 · 1 min · jiezi

学习Java必读的10本书籍

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9min在学习编程语言时,几乎每个人都会选择在线培训,但是,不得不说书籍也是你学习的重要部分,因为它们可以提供最深入的知识,且通常由权威人士撰写。如果您正在学习Java编程,本文对相关书籍的介绍将为你提供有效的参考。每当程序员开始学习Java编程语言时,他们将会遇到以下问题:我应该参考哪本书来学习Java?初学者学习Java的最佳书籍是什么?你能推荐我一些学习Java的好书吗?这就说明了Java书籍对程序员,尤其是初学者的重要性。尽管关于Java学习很多的免费资源,如教程,在线课程,技巧,博客和代码示例,但Java书籍更值得我们选择,因为:· 书籍是由该领域权威的技术人员编写· 对知识点进行详细说明且利用大量项目案例对该领域知识进行阐述这些书是当今最好的书籍,对初学者,中级和高级Java程序员同样有用。无论您是Java新手还是有一定经验的Java编程工程师,您将通过这些书籍学到很多新东西。不同级别的程序员有其对应的书籍。对于初学者来说,《深入浅出Java 》是仍然上手的最好的书,以及有经验的Java开发人员更适合《Effective Java》(有效的Java)。学习Java编程的10本最佳书籍这些书涵盖了各个领域,包括核心Java基础知识,Java集合框架,多线程和并发,JVM内部和性能调优,设计模式等。1.《Head First Java》许多人会认为这是过时的书,但说实话,《Head First Java》对于新手的程序员来说是很有效的。《Head First Java》涵盖了有关类,对象,线程,集合和语言功能的基本Java编程知识,如泛型,枚举,变量参数或自动装箱,还有一些关于Swing,网络和Java IO的高级部分,这使它们成为Java初学者的完整包。如果你从头开始,这应该是你看的第一本Java书。2.《Head First Design Patterns》关于继承和组合的第一章,简直太棒了,通过引入问题然后解决方案来促进改进实践。本书还包含有用的项目符号,练习和内存映射,可帮助您快速了解设计模式。如果您想学习核心Java设计模式和面向对象的设计原则,这是您应该查看的第一本Java书。3.《Effective Java》对于精通Java编程或经验丰富的程序员来说,《Effective Java》是不二之选。对于那些希望通过编程最佳实践分享他们的技能的程序员来说,他们渴望倾听对Java开发工具包(JDK)做出贡献的人。本书包含一系列Java编程最佳实践,包括静态工厂,序列化,等号和哈希码,以及泛型,枚举,变量和反射。这本Java编程书用与以往不同的方式涵盖了Java的几乎所有方面。4.《Java Concurrency in Practice》《Java Concurrency in Practice》是Joshua Bloch,Doug Lea和团队的另一个经典。这是关于并发和多线程的最佳Java书籍 - 核心Java开发人员必读之一。优势:1)本书非常详细,并捕获了多线程和并发的细节2)本书不是关注核心Java类,而是关注并发问题和问题,如死锁,饥饿,线程安全,竞争条件以及使用Java并发类解决它们的现有方法。3)没有废话的例子,本书中的例子清晰,简洁,智能。4)擅长解释错误及错误的原因以及如何解决简而言之,这是学习Java中并发和多线程的最佳书籍之一。从初学者的角度来看,内容肯定是先进的,但这无疑是一本有经验的Java程序员必须阅读的书。5.《Java Generics and Collections》来自O’Reilly的Naftalin和Philip Wadler撰写的Java Generics and Collections是另一本关于Java的好书,它有关于泛型和集合的内容,是Java语言的核心领域。对一个有经验的程序员有很强的Java收集和泛型知识方面很有帮助。它解释了每个集合界面,如Set,List,Map,Queue及其实现,比较它们在不同情况下的表现,每一章的对比图可以告诉你什么时候使用特定的Java集合类,比如ArrayList,HashMap或LinkedHashMap。6.《Java Performance》Binu John这是另一本讲授JVM内部,垃圾收集,JVM调优,分析的好书。等,我强烈建议每位高级Java开发人员阅读本书。随着逐渐的走向,我们从初学者水平开始到中级水平,现在是高级水平。Java性能是关于性能监视、分析和用于Java性能监视的工具。这不是一本通常的编程书。相反,它提供了有关JVM,垃圾收集,Java堆监视和分析应用程序的详细信息。初学者和中级程序员都可以从本书中受益,但在阅读之前,有一些Java经验是最好。到目前为止,这是关于性能监控的最佳Java书籍。如果你更注重性能,Java中有几本新书,涵盖JDK 1.7。有关Java性能的最新书籍,如Java Performance,Scott Oaks的The Definitive Guide,在购买本书之前肯定值得一试。如果您需要一些解决内存和CPU问题的指导,我建议您也看看Richard Warburton的《Understanding and Solving Java Memory Problems》7.《Java Puzzlers》这本书讲述的是Java编程语言中的极端案例和误区。Java比C ++更安全,JVM可以很好地解决程序员容易出错的内存分配和释放问题。但是,Java仍然有一些极端的案例,即使是有经验的Java程序员也会感到惊讶。这本Java书籍列举了这些Java误区,并对它们进行了更详细的解释。如果你喜欢谜题,这是一本很好的Java书籍,你甚至可以在核心Java面试中用这些知识来检查他们的Java知识。8.《Head First Object-Oriented Analysis and Design》另一篇关于Head-First系列Java编程和设计原理的好书。首先是面向对象的分析和设计可以与《Head First Design Patterns》一起阅读。这本书集中于面向对象的设计原则,比如喜欢组合,接口编程等。从本书中获得的知识适用于许多面向对象的编程语言,并且总体上将提高您对代码和OOP设计原则的理解。9.《Thinking in Java》由Bruce Eckel编写,他也是《Thinking in C ++》的作者,并用他独特的风格来教授Java概念。许多人会同意这是最好的Java书籍之一,其优点是智能化示例。这是Java中的完整书籍之一,也可以作为参考。如果你不喜欢Head-First教学风格,但是你需要一本简单Java风格的初学者书籍,这本书是一个不错的选择。它比较详细,成熟且经常更新。10.《Java SE 8 for the Really Impatient》这是学习Java 8 的最佳书籍之一。如果您想在短时间内了解有关Java 8的所有重要事项,那么这本书是最佳选择。本书解释了lambda表达式,Streams,功能接口,方法引用,新的Java Date Time API以及其他一些小的增强功能,如加入字符串,可重复的注释等。以上为推荐的10本学习Java的书籍,如果你有更好的书籍,欢迎在下方留言进行推荐,同时也可以收藏本文以便后期作为参考或转发给更多的小伙伴! ...

April 18, 2019 · 1 min · jiezi

他,将终结“996”

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码在我们身边也不乏在半夜十二点,依然在加班熬夜送外卖的小哥;在深夜打包快递的微商;天微亮,就已忙碌着为做准备的早餐店……与他们不同的是,“社畜”是日本用于形容上班族的贬义词,指在公司很顺从地工作,被公司当作牲畜一样压榨的员工。如今成为了一个在中国也比较常见的网络流行语,类似我们所说的“房奴”、“卡奴”。2019年3月27日,一个名为“996ICU上传开。这是一些不满于互联网公司996模式的程序员发起的“996.ICU”的开源项目:工作996,生病ICU(重症监护病房)。这种幽默的背后俨然是社畜的无奈与自嘲。争论未休,愈演愈烈程序员们揭露“996ICU”互联网公司,本意是抵制互联网公司的996工作制度的声讨,现随着媒体、企业、大佬、员工的跟风,已将矛盾转移,使其变成了“不应强制加班”“反对强制加班”“反对没有回报的无偿加班”。距此事已经过去20余天,但“996”的话题在各大网站上仍持续发热,连日来,“996”工作制引发的热议也引起了马云、刘强东、李国庆大咖先后发表了自己对996的看法,有人持反对也有人表赞同。4月12日,阿里巴巴官方公众号发布了11日董事长马云在阿里巴巴内部交流活动上对于996的观点,马云说:能做996是巨大的福气。“今天中国BAT这些公司能够996,我认为是我们这些人修来的福报。” 在4月11日传出的内部交流会发言中,马云这句话已成金句。可能你连996的资格都没有。刘强东称,京东永远不会强制员工995或者996,但是每一个京东人都必须具备拼搏精神。刘强东举例自己曾经创业时期的艰辛,虽然现在达不到那时候的状态,但他表示,以自己现在的体质,做到周一到周六,早8点工作到晚11点,周日工作8个小时,每个月休假两天,每年也会休一次长假(811648),没有问题。“我享受拼搏的快感!我要找到一帮愿意为理想而一起拼的兄弟们!并让他们的日子过得愈来愈好!”年轻的时候不996,老了你就没机会了。当当创始人李国庆、OPPO副总裁沈义人等直接站到了反对阵营。4月12日,李国庆在微博中直言:“一批老板倡导996……我坚决反对。”“为提高国际竞争力和企业竞争力,我赞成撸起袖子加油干,那是实干、巧干、苦干,不是低效率的耗时间。”他强调,优秀的企业是结果导向,效率导向。管理者提高决策科学性和效率比员工加班更有价值。不同岗位有不同的工作强度。“如程序员,长时间认真写8小时程序,回家基本倒头就睡,和业务层面靠开会耗11小时完全不是一个工作强度。”对此新华社刊发辛识平文章《奋斗应提倡,996当退场》称,我们崇尚的奋斗,是让劳动者实现有尊严地体面劳动、全面发展的奋斗,是基于人们对事业的责任感和对未来的信心的奋斗。如果不能切实保障员工利益,如果无视员工意愿和身心健康,甚至让员工辛辛苦苦连个加班费都拿不到,一些企业强制推行的“996工作制”就是在透支健康、透支未来,这恰恰是对奋斗者的伤害,也是对奋斗精神的误读。当然,持反对方的也少不了律师,企业的确享有安排员工加班的经营自主权,但这一权利的行使需受到法律法规的严格限制。河北询诺律师事务所律师张伟对北京商报记者称,如果是综合工时制度和不定时工时制度符合一定条件就不违法,如果是996成为标准工时制度就违法。公司规定所有员工的正常工作时间为9:30-21:00,每周工作6天,显然是违法行为。“社畜”怎么看待996?“996本来没有什么,加班本就是家常便饭的事情,大家只是不想被‘绑架式’认为996是常态,不加班、不996就是懒惰、浪费生命。”当北京商报记者问起一位在西二旗的一家互联网公司上班的员工,996为何突然“火”了时,上述员工如此回答。他表示,在这轮讨论没有成为公开话题时,996上班制度是一个公开的秘密,无论是出于自愿还是不想耽误团队进度,只要工作没有完成就会留下来加班,早上9点、10点上班,直到凌晨2点、3点下班是常事,甚至还会在公司准备行军床,睡醒了就直接上班。“但我们不想让公司认为996、乃至彻夜加班是件应该的事情,不加班就是懒惰、不勤奋的一群人,如果这样付出就变得没有价值。”上述员工称。大多正在经历996的员工吐槽完仍旧坚定地表示,还是会加班的,现在互联网公司的裁员声一波高过一波,如果这时候因为工作拖后腿被裁员可不好找工作,毕竟自己现在的工资收入比较可观。996到底由谁说了算?从2018开始,提到互联网企业,大家对其贴上的标签更多是裁员、优化、降薪、轮岗……引得人人自危,被爆出的“996.ICU”无疑是员工用来宣泄、表达焦虑不安的一种行为。什么是强制的加班,什么又是合理的加班?更多的员工表示可以接受加班是因为对公司的认同,对领导的尊重,以及对项目和团队的负责。对于996的无偿加班,更多“社畜”表示加班费应是合理得来的,而不是企业的“施舍”。关于996的工作制度,应当根据实际情况决定是否接受,如果你的家庭、生活、身体情况不允许,或是因为996的加班制度给你带来了困扰,那么你应该考虑如何做一个明确的选择,同样的,任何人不应该将996与你的勤奋努力进行道德捆绑。你,将终结“996”!如何终结996?正是因为生活的压力、经济的负担让你不能坦然对996说不,甚至在面试时,HR会明确表示:“这个岗位会加班,你可以吗?”此时,你仍会毫不犹豫的接受这个职位。如何摆脱这种现状?八个字:技能提升,经济独立让你的知识和专业技能在工作之余给你带来收益。举个栗子:传统的知识变现主要有作家写书等,通过版税和专利授权费用来获得收入。前些年付费网络文学的出现、近几年付费问答、知识付费产品的井喷式爆发,可谓是给知识产权收入扩宽了道路。直播课程、录播视频、文档课程等,一旦有用户付费购买,作者本人在床上睡觉的时候,就有了“睡后收入”。即便不工作也不会影响到你的收入状况,这是获得财务自由和提前退休的必要前提,但是并不代表不劳而获,其实,在获得这种“被动收入”之前,往往需要经过长时间的劳动和积累。首先应提升自己的技能,在技能提升的同时培养自己的个人品牌运营意识,将所具备的知识技能,通过建立自媒体输出文章,或者分自己的观点,逐渐就会形成自己的个人品牌,这个时候再去做知识变现就会水到渠成。提升自己的技能是树立个人品牌的重要前提,在获得“睡后收入”的同时,也会有猎头因你的口碑影响力为你介绍高薪岗位,你也有了更多主动的选择机会。访问 愿码(ChainDesk.CN)获取更多学习资料

April 17, 2019 · 1 min · jiezi

PostgreSQL安全性:快速查看身份验证最佳实践

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11minPostgreSQL中的身份验证身份验证回答了问题:谁是用户?PostgreSQL支持一些 身份验证方法,包括以下内容:· Trust认证:任何可以连接到服务器的人都有权使用访问pg_hba.conf配置文件中指定的数据库/数据库。通常用于允许在单个用户计算机上使用Unix域套接字进行连接以访问数据库。此方法也可以与TCP / IP一起使用,但很少允许从本地主机以外的任何IP地址进行连接。 · Ident认证:这通过从ident服务器获取客户端的操作系统用户名然后使用它来访问数据库服务器来工作。这个方法建议用于客户端计算机受系统管理员严格控制的封闭网络。· Peer认证:这类似于身份,但客户端操作系统用户名是从内核获得的。· GSSAPI认证:GSSAPI是RFC2743中定义的行业标准。它提供自动身份验证(单点登录)。· LDAP认证: LDAP服务器仅用于验证用户名/密码对。· 密码认证:有以下三种方法o SCRAM-SHA-256:PostgreSQL 10中引入的最强的身份验证方法。此方法可防止对不受信任的连接进行密码嗅探。默认密码验证方法是MD5使用此功能,配置参数 password_encryption应更改为 scram-sha-256o MD5:MD5具有已知的限制,例如:预先计算的查找表以破解密码哈希。此外,MD5只有40亿个独特的哈希值。最后,MD5计算速度非常快,因此暴力密码猜测不需要大量的CPU资源。对于新应用程序,建议仅使用scram-sha-256。此外,PostgreSQL提供了从scram-sha-256迁移的方法。o Password:建议不要使用此密码,因为密码以明文格式发送到服务器。 要了解身份验证,您需要具有以下信息:· 身份验证通过pg_hba.conf文件控制,其中hba代表基于主机的身份验证。· 最好了解PostgreSQL发行版附带的默认初始身份验证设置· pg_hba.conf文件通常位于数据目录中,但也可以在postgresql.conf配置文件中指定。更改身份验证时,您需要发送一个SIGHUP信号,这是通过基于PostgreSQL平台的几种方法完成的。注意,发送信号的用户应该是超级用户、Postgres或Linux发行版上的根系统用户;同样,这取决于平台。以下是重新加载PostgreSQL配置的几种方法的示例:psql -U postgres -c “SELECT pg_reload_conf();“sudo service postgresql reloadsudo /etc/init.d/postgresql reloadsudo Kill -HUP sudo systemctl reload postgresql-11.service· 该订单的 pg_hba.conf记录或条目是非常重要的。将会话连接pg_hba.conf逐个与记录进行比较, 直到它被拒绝或到达配置文件的末尾。· 最后,检查PostgreSQL日志文件以确定配置重新加载后是否存在错误是非常重要的。PostgreSQL pg_hba.conf与postgresql.conf一样,pg_hba.conf文件由一组记录组成,可以使用哈希符号注释行,并且忽略空格。pg_hba.conf文件记录的结构如下:host_type database user [IP-address| address] [IP-mask] auth-method [auth-options]host_type查询的部分可以是以下内容:· Local:在 Linux系统中使用,允许用户使用Unix域套接字连接访问PostgreSQL。· Host:这是为了允许来自其他主机的连接,基于地址或IP地址,使用带有和不带SSL加密的TCP / IP。· Hostssl:这与主机类似,但应使用SSL加密连接。· Hostnossl:这也与主机类似,但不应加密连接。查询的数据库部分是用户想要连接的数据库的名称。为了提高灵活性,您还可以使用以逗号分隔的列表来指定多个数据库,或者可以all用来指示用户可以访问数据库集群中的所有数据库。此外,可以使用相同的用户和相同的角色值来指示数据库名称与用户名相同,或者用户是与数据库同名的角色的成员。查询的用户部分指定数据库用户的名称; 同样,all值与所有用户匹配。IP地址,地址和IP子网掩码用于标识用户所在的主机尝试连接。可以使用无类别域间路由(CIDR)或点十进制表示法指定IP地址。最后,密码验证方法可以信任,MD5,拒绝等。以下是配置PostgreSQL身份验证的一些典型示例:· 示例1:PostgreSQL集群上的任何用户都可以使用Unix域套接字访问任何数据库,如以下数据库表所示:#TYPE DATABASE USER ADDRESS METHODLocal all all trust· 示例2:PostgreSQL集群上的任何用户都可以使用本地环回IP地址访问任何数据库,如以下数据库表所示:#TYPE DATABASE USER ADDRESS METHODHost all all 127.0.0.1/32 trusthost all all ::1/128 trust· 示例3:192.168.0.53拒绝来自IP地址的所有连接 ,来自192.168.0.1/24范围的连接被接受,如下数据库表所示:#TYPE DATABASE USER ADDRESS METHODHost all all 192.168.0.53/32 rejectHost all all 192.168.0.1/24 trustPostgreSQL提供了一种非常方便的方法来查看pg_hba.conf文件中定义的规则,方法是提供一个名为pg_hba_file_rules的视图,如下所示:postgres=# SELECT row_to_json(pg_hba_file_rules, true) FROM pg_hba_file_rules limit 1; row_to_json ————————- {“line_number”:84, + “type”:“local”, + “database”:[“all”], + “user_name”:[“all”], + “address”:null, + “netmask”:null, + “auth_method”:“trust”,+ “options”:null, + “error”:null}(1 row)侦听地址该listen_addresses 选项定义于postgresql.conf。PostgreSQL listen_addresses连接设置用于标识服务器应从客户端应用程序侦听的IP地址列表。这些listen_addresses是以逗号分隔的主机名或IP地址列表。更改这个值需要重启服务器。此外,还应注意以下几点:· 默认值为localhost,它限制从网络到PostgreSQL集群的直接连接。· 给出一个空列表意味着服务器应该只接受Unix套接字连接· 该值*表示全部对于新加入PostgreSQL的开发人员来说,忘记更改侦听地址是一个常见的错误。如果开发人员忘记更改,并尝试使用网络中的TCP/IP连接到PostgreSQL,则会出现以下错误:Connection refused Is the server running on host and accepting TCP/IP connections on port 5432?认证最佳实践身份验证最佳实践取决于整个基础架构设置,应用程序的性质,用户的特征,数据敏感性等。例如,以下设置对于初创公司很常见:数据库应用程序(包括数据库服务器)托管在同一台计算机上,并且仅由公司内部用户从一个物理位置使用。通常,数据库服务器使用防火墙与世界隔离;在这种情况下,您可以使用SCRAM-SHA-256身份验证方法并限制IP地址,以便数据库服务器接受特定范围或集合内的连接。请注意,重要的是不要使用超级用户或数据库所有者帐户连接到数据库,因为如果此帐户被黑客入侵,则整个数据库集群将被暴露。如果是应用服务器 - 业务逻辑 - 和数据库服务器不在同一台机器上,您可以使用强大的身份验证方法,例如LDAP和Kerberos。但是,对于数据库服务器和应用程序位于同一台计算机上的小型应用程序,SCRAM-SHA-256身份验证方法以及将侦听地址限制为localhost可能就足够了。要对应用程序进行身份验证,建议仅使用一个用户,并尝试使用连接池软件减少允许的最大连接数,以便更好地调整PostgreSQL资源。在应用业务逻辑时可能需要另一级别的安全性来区分不同的登录用户。对于真实用户,更需要LDAP或Kerberos身份验证。此外,如果从外部世界访问数据库服务器,则使用SSL证书加密会话以避免数据包嗅探很有用。您还应该记住保护信任所有localhost连接的数据库服务器,因为访问localhost的任何人都可以访问数据库服务器。角色系统和代理身份验证通常,在设计应用程序时,登录角色用于配置数据库连接和连接工具。需要实现另一级安全性以确保使用该应用程序的用户被授权执行某项任务。该逻辑通常在应用程序业务逻辑中实现。在使用事务块中的SET SESSION AUTHORIZATION 语句或SET ROLE命令建立或重用连接后,通过将身份验证委派给另一个角色,数据库的角色系统也可用于部分实现此逻辑,如下所示:postgres=# SELECT session_user, current_user; session_user | current_user ————–+————– postgres | postgres(1 row)postgres=# SET SESSION AUTHORIZATION test_user;SETpostgres=> SELECT session_user, current_user; session_user | current_user ————–+————– test_user | test_user(1 row)设置角色需要角色成员资格,而设置会话授权需要超级用户权限。允许应用程序作为超级用户进行连接是危险的,因为可以分别使用reset role和reset session命令重置set session authorization和set role命令,从而允许应用程序获得超级用户权限。为了了解如何使用PostgreSQL角色系统来实现身份验证和授权,我们将使用角色系统和汽车门户应用程序。在汽车门户应用程序中,可以将多组用户分类为web-app-user、public-user、registered-user、seller-user和admin-user。web应用程序用户用于配置业务逻辑连接工具;公共用户、注册用户和卖家用户用于区分用户。公共用户组只能访问公共信息,如广告,但不能作为注册用户添加评级,也不能创建广告,因为卖家用户。管理员用户是管理应用程序所有内容的超级角色,例如过滤垃圾邮件和删除不遵守网站策略的用户。当汽车门户网站应用程序连接到数据库时,将使用Web用户。之后,car_portal将根据用户类调用set role命令。这种身份验证方法称为代理身份验证。以下示例演示了如何使用角色系统来实现代理身份验证。第一步是创建角色并分配角色成员身份和权限,如下所示:CREATE ROLE web_app_user LOGIN NOINHERIT;CREATE ROLE public_user NOLOGIN;GRANT SELECT ON car_portal_app.advertisement_picture, car_portal_app.advertisement_rating , car_portal_app.advertisement TO public_user;GRANT public_user TO web_app_user;GRANT USAGE ON SCHEMA car_portal_app TO web_app_user, public_user;该NOINHERIT选项web_app_user 不允许用户继承角色成员资格的权限;但是,web_app_user可以将角色更改为公共用户,如以下示例所示:$ psql car_portal -U web_app_usercar_portal=> SELECT * FROM car_portal_app.advertisement;ERROR: permission denied for relation advertisementcar_portal=> SET ROLE public_user;SETcar_portal=> SELECT * FROM car_portal_app.advertisement; advertisement_id | advertisement_date | car_id | seller_account_id ——————+——————–+——–+——————-(0 rows)car_portal=> SELECT session_user, current_user; session_user | current_user ————–+————– web_app_user | public_user(1 row) ...

April 16, 2019 · 2 min · jiezi

构建可扩展的PostgreSQL解决方案

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min可伸缩性是指软件系统随着使用它的业务增长而增长的能力。 PostgreSQL提供了一些功能,可以帮助您构建可扩展的解决方案,但严格来说, PostgreSQL本身是不可扩展的。它可以有效地利用单台机器的以下资源:它使用多个CPU内核通过并行查询功能更快地执行单个查询如果配置正确,它可以使用所有可用内存进行缓存数据库的大小不受限制; 创建多个表空间时,PostgreSQL可以使用多个硬盘; 通过分区,可以同时访问硬盘,从而加快数据处理速度但是,当涉及将数据库解决方案扩展到多台计算机时,它可能非常有问题,因为标准PostgreSQL服务器只能在单个计算机上运行。在本文中,我们将介绍PostgreSQL中不同的扩展方案及其实现。系统可扩展性的要求意味着现在支持业务的系统也应该能够以与其增长相同的服务质量来支持相同的业务。假设一个数据库可以存储1 GB的数据,并且每秒有效地处理100个查询。如果随着业务的发展,处理的数据量会增长100倍?它能够每秒支持10,000个查询并处理100 GB的数据吗?也许不是现在,不是在同一个装置中。但是,可以扩展可扩展的解决方案,以便能够在需要时立即处理负载。在需要获得更好性能的场景中,设置更多服务器以处理额外负载并从主服务器将相同数据复制到它们是很常见的。在需要高可用性的情况下,这也是将数据连续复制到备用服务器的典型解决方案,以便在主服务器崩溃时它可以接管。可扩展的PostgreSQL解决方案复制可用于许多扩展方案。其主要目的是在系统出现故障时创建和维护备份数据库。对于物理复制尤其如此。但是,复制也可用于提高基于PostgreSQL的解决方案的性能。有时,第三方工具可用于实现复杂的扩展方案。扩展以进行大量查询想象一下,有一个系统应该处理大量的读取请求。例如,可能有一个应用程序实现支持网站上的自动完成功能的HTTP API端点。每次用户在Web表单中输入字符时,系统都会在数据库中搜索名称以用户输入的字符串开头的对象。由于用户数量众多,查询数量可能非常大,并且还因为每个用户会话都处理了多个请求。为了处理大量请求,数据库应该能够使用多个CPU核心。如果同时请求的数量非常大,则处理它们所需的核心数量可能大于单个机器可能具有的核心数量。这同样适用于应该同时处理多个重度查询的系统。您不需要大量查询,但是当查询本身很大时,使用尽可能多的CPU将提供性能优势,尤其是在使用并行查询时。在这种情况下,一个数据库无法处理负载,可以设置多个数据库,设置从一个主数据库到所有数据库的复制,使每个数据库作为热备用,然后让应用程序查询不同的数据库不同的要求。应用程序本身可以是智能的,每次都可以查询不同的数据库,但这需要应用程序的数据访问组件的特殊实现,如下所示:另一个选择是使用一个名为Pgpool-II的工具,它可以作为几个PostgreSQL数据库前面的负载均衡器。该工具公开了一个SQL接口,应用程序可以连接到那里,就好像它是一个真正的PostgreSQL服务器。然后Pgpool-II会将查询重定向到当时执行最少查询的数据库; 换句话说,它将执行负载平衡:另一种选择是将应用程序与数据库一起扩展,以便应用程序的一个实例将连接到数据库的一个实例。在这种情况下,应用程序的用户应该连接到许多实例中的一个。这可以通过HTTP负载平衡来实现:数据分片当问题不是并发查询的数量,而是数据库的大小和单个查询的速度时,可以实现不同的方法。可以将数据分成多个服务器,这些服务器将并行查询,然后将查询结果合并到这些数据库之外。这称为数据分片。PostgreSQL提供了一种基于表分区实现分片的方法,其中分区位于不同的服务器上,而另一个分区(主服务器)将它们用作外部表。在主服务器上定义的父表上执行查询时,具体取决于WHERE子句和分区的定义,PostgreSQL可以识别哪些分区包含所请求的数据,并且只查询这些分区。根据查询,有时可以在远程服务器上执行联接,分组和聚合。PostgreSQL可以并行查询不同的分区,这将有效地利用多台机器的资源。完成所有这些后,可以在应用程序连接到单个数据库时构建解决方案,该数据库将根据要查询的数据在不同的数据库服务器上物理执行查询。也可以在使用PostgreSQL的应用程序中构建分片算法。简而言之,应用程序可能会知道哪些数据位于哪个数据库中,只在那里写入,并且只能从那里读取数据。这会给应用程序增加很多复杂性。另一种选择是使用市场上可用的基于PostgreSQL的分片解决方案或开源解决方案。它们有各自的优点和缺点,但常见的问题是它们基于PostgreSQL的早期版本,并且不使用最新的功能(有时会提供自己的功能)。最受欢迎的分片解决方案之一是Postgres-XL,它使用运行PostgreSQL的多个服务器实现无共享架构。该系统有几个组成部分:· 多个数据节点:存储数据· 单个全局事务监视器(GTM):管理集群,提供全局事务一致性· 多个协调器节点:支持用户连接,构建查询执行计划,并与GTM和数据节点交互Postgres-XL实现与PostgreSQL相同的API,因此应用程序不需要以任何特殊方式处理服务器。它符合ACID,这意味着它支持事务和完整性约束。该COPY命令也受支持。使用Postgres-XL的主要好处如下:它可以扩展以通过添加更多数据节点来支持更多读取操作它可以扩展以通过添加更多协调器节点来支持更多写入操作Postgres-XL的当前版本(在撰写本文时)基于PostgreSQL 10,它相对较新Postgres-XL的主要缺点是它不提供开箱即用的任何高可用性功能。当更多服务器添加到群集时,任何服务器失败的可能性都会增加。这就是为什么你应该注意备份或实现数据节点本身的复制。Postgres-XL是开源的,但可以获得商业支持。值得一提的另一个解决方案是Greenplum。它被定位为大规模并行处理数据库的实现,专门为数据仓库而设计。它有以下组件:· 主节点:管理用户连接,构建查询执行计划,管理事务· 数据节点:存储数据并执行查询Greenplum还实现了PostgreSQL API,应用程序可以连接到Greenplum数据库而无需任何更改。它支持事务,但对完整性约束的支持是有限的。该COPY命令受支持。Greenplum的主要好处如下:它可以扩展以通过添加更多数据节点来支持更多读取操作。它支持面向列的表组织,这对于数据仓库解决方案非常有用。支持数据压缩。开箱即用支持高可用性功能。可以(并且建议)添加辅助主服务器,以便在主服务器崩溃时接管。还可以向数据节点添加镜像以防止数据丢失。缺点如下:它不能扩展以支持更多的写入操作。一切都通过单个主节点,添加更多数据节点不会使写入更快。但是,可以直接从数据节点导入文件中的数据。它的核心使用PostgreSQL 8.4。Greenplum在PostgreSQL基础代码中添加了许多改进和新功能,但它仍然基于一个非常旧的版本; 但是,该系统正在积极开发中。Greenplum不支持外键,并且对唯一约束的支持是有限的。Greenplum有商业和开源版本。扩展许多连接与可伸缩性相关的另一个用例是当数据库连接的数量很大时。但是,当在具有大量微服务的环境中使用单个数据库并且每个数据库都有自己的连接池时,即使它们不执行太多查询,也可能在数据库中打开数百甚至数千个连接。每个连接都消耗服务器资源,只是处理大量连接的要求已经成为问题,甚至不执行任何查询。如果应用程序仅在需要查询数据库并在之后关闭它们时才使用连接池和打开连接,则可能会出现另一个问题。建立数据库连接需要时间 - 而不是太多,但是当操作数量很大时,总开销将是巨大的。有一个名为PgBouncer的工具可以实现连接池功能。它可以接受来自许多应用程序的连接,就像它是PostgreSQL服务器一样,然后打开有限数量的数据库连接。它将为多个应用程序的连接重用相同的数据库连接。建立从应用程序到PgBouncer的连接的过程比连接到真实数据库要快得多,因为PgBouncer不需要初始化会话的数据库后端进程。PgBouncer可以创建多个连接池,它们可以在以下三种模式之一中工作:· 会话模式:与PostgreSQL服务器的连接用于与PgBouncer的客户端连接的生命周期。这种设置可用于加速应用程序端的连接过程。这是默认模式。· 事务模式:与PostgreSQL的连接用于客户端执行的单个事务。当仅同时执行少量翻译时,这可用于减少PostgreSQL端的连接数。· 语句模式:数据库连接用于单个语句。然后将它返回到池中,并为下一个语句使用不同的连接。此模式类似于交易模式,但更具侵略性。请注意,使用语句模式时,无法进行多语句事务。可以设置不同的池以在不同模式下工作。可以让PgBouncer连接到多个PostgreSQL服务器,从而起到反向代理的作用。可以使用PgBouncer的方式如下图所示:PgBouncer建立了与数据库的多个连接。当应用程序连接到PgBouncer并启动事务时,PgBouncer会为该应用程序分配现有数据库连接,将所有SQL命令转发到数据库,然后将结果传回。交易完成后,PgBouncer将断开连接,但不关闭它们。如果另一个应用程序启动事务,则可以使用相同的数据库连接。这样的设置需要配置PgBouncer以在事务模式下工作。PostgreSQL提供了几种实现复制的方法,这种方法可以维护来自另一个服务器或服务器上的数据库的数据副本。这可以用作备份或备用解决方案,以便在主服务器崩溃时接管。通过使负载可以分布在多个数据库服务器上,复制还可用于提高软件系统的性能。

April 15, 2019 · 1 min · jiezi