• 关于

    系统程序错误可以做什么

    的搜索结果

回答

就ISO C标准(语言的正式定义)而言,访问其边界之外的数组具有“ 未定义的行为 ”。其字面意思是: 在使用非便携式或错误程序构造或错误数据时的行为,对此国际标准不施加任何要求 一个非规范性的注释扩展了这一点: 可能的不确定行为范围从完全忽略具有无法预测结果的情况到在翻译或程序执行过程中以环境特征记录的方式表现(带有或不带有诊断消息)到终止翻译或执行(带有发布)诊断消息)。 这就是理论。现实是什么? 在“最佳”情况下,您将访问一些内存,这些内存要么是当前正在运行的程序所拥有的(这可能导致您的程序行为不当),要么不是当前正在运行的程序所拥有的(这可能会导致您的程序崩溃,例如细分错误)。或者,您可以尝试写入程序拥有的内存,但是将其标记为只读;这也可能导致程序崩溃。 假设您的程序在一个试图保护彼此并发运行的进程彼此之间的操作系统下运行。如果您的代码在“裸机”上运行,比如说它是OS内核或嵌入式系统的一部分,则没有这种保护;您行为不当的代码就是应该提供这种保护的内容。在这种情况下,损坏的可能性会更大,包括在某些情况下对硬件(或附近的东西或人)的物理损坏。 即使在受保护的OS环境中,保护也不总是100%。例如,存在一些操作系统错误,这些错误使无特权的程序可以获取根(管理)访问权限。即使具有普通用户特权,出现故障的程序也可能消耗过多的资源(CPU,内存,磁盘),从而可能使整个系统瘫痪。许多恶意软件(病毒等)利用缓冲区溢出来获得对系统的未授权访问。 (一个历史示例:我听说过,在一些带有核心内存的旧系统中,在紧密循环中重复访问单个内存位置可能确实导致该内存块融化。其他可能性包括破坏CRT显示器和移动读取的内容。 /写入磁盘驱动器磁头,使其具有驱动器柜的谐波频率,从而使其滑过桌子并掉落在地板上。) 而且总是有天网需要担心。 底线是:如果您可以编写一个程序来故意做一些不好的事情,那么从理论上讲,一个有缺陷的程序至少有可能偶然地做同样的事情。 在实践中,这是非常不可能的,你与MacOS X系统上运行错误的程序会做什么比暴跌更加严重。但是,不可能完全防止错误的代码做真正的坏事。 问题来源于stack overflow

保持可爱mmm 2020-01-16 15:55:44 0 浏览量 回答数 0

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

但是也有人说尽量不要去使用外键,在程序中控制数据的完整性约束性就可以了,否则不方便维护你要看是什么人说的。很多程序员的数据库水平比不上用户。这些人认为程序是万能的。很多DBA认为数据是最重要的,比程序活的长。程序不能用了,数据仍是企业的重要资产。如果不用外键,数据的完整性得不到保证。如果你觉得这样可以接受,当然可以不用外键。外键是基本的数据库约束,如果这都省略了,那你的数据库根本不能称为数据库。很多人说关系数据库性能差,其实大部分都是他们设计得差。下面谈谈很多人所说的外键的缺点。外键会带来不便比如,删一条数据出错我觉得这不是坏事,尤其是对用户来说。想想编程时,编译器也会报错,我们都知道这不是坏事,反而提前防止了错误。又比如,批量insert如果你可以肯定数据没问题,DBMS提供了忽略外键约束的选择。但是,当数据的输入来源不可靠时,很容易出现数据不一致,所以大部分时间外键(还有其他约束)是必要的。外键需要额外的开销,降低性能任何代码都有开销,关键看值不值得。什么事都不做,是最快的,根本不需要花时间。正因为数据的正确性是至关重要的,用外键当然值得。即使不用外键,你也要在程序中控制数据的正确性。所以这个开销是必须的,不能省掉的。通过程序控制数据完整性有很多缺点,比如1 程序bug基本上没有无bug的程序,这就是说,外键的功能无法可靠地被程序替代。2 数据和程序的强耦合数据库只能被一个程序使用,要支持多个程序,并且保证数据完整性,a) 要么重复逻辑每个程序自己控制数据的一致性,显然是很糟糕的。b) 要么通过共同的接口访问数据库这是比较流行的一种方法。3层架构,SOA,...我不敢说这些架构都是错误的,他们都有特定的用途。但是你要明白,一个系统越复杂,零件越多,出错的可能性就越大,而且性能也越差。总而言之,如果你认为数据正确性是必须要保证的,那么你就必须付出一定的代价来实现。用外键比用程序控制更可靠,同时更简单直接,减轻了程序的负担。DBMS有40年的历史,是顶尖的程序员用C/C++开发出来的,经过重重测试,被无数项目用到,其可靠性和性能已经接近最优状态了。你如果觉得你们项目里的程序员能做得更好,对事务、并发等技术都无比熟悉,又有充足的时间,那你们可以用程序控制。老实说,我接触的项目很多都是不用外键约束的,很多都是不考虑规范化设计的。这样的系统很复杂(没必要这么复杂),性能不好。这是我的切身体会。当然,所有事情都不能一概而论,不用外键的程序也能做得很好,卖得很好。当你做决定时,要想清楚后果。我个人倾向于经典的方法,可靠的方法。

a123456678 2019-12-02 03:02:52 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

但是也有人说尽量不要去使用外键,在程序中控制数据的完整性约束性就可以了,否则不方便维护你要看是什么人说的。很多程序员的数据库水平比不上用户。这些人认为程序是万能的。很多DBA认为数据是最重要的,比程序活的长。程序不能用了,数据仍是企业的重要资产。如果不用外键,数据的完整性得不到保证。如果你觉得这样可以接受,当然可以不用外键。外键是基本的数据库约束,如果这都省略了,那你的数据库根本不能称为数据库。很多人说关系数据库性能差,其实大部分都是他们设计得差。下面谈谈很多人所说的外键的缺点。外键会带来不便1.比如,删一条数据出错我觉得这不是坏事,尤其是对用户来说。想想编程时,编译器也会报错,我们都知道这不是坏事,反而提前防止了错误。2.又比如,批量insert如果你可以肯定数据没问题,DBMS提供了忽略外键约束的选择。但是,当数据的输入来源不可靠时,很容易出现数据不一致,所以大部分时间外键(还有其他约束)是必要的。外键需要额外的开销,降低性能任何代码都有开销,关键看值不值得。什么事都不做,是最快的,根本不需要花时间。正因为数据的正确性是至关重要的,用外键当然值得。即使不用外键,你也要在程序中控制数据的正确性。所以这个开销是必须的,不能省掉的。通过程序控制数据完整性有很多缺点,比如1 程序bug基本上没有无bug的程序,这就是说,外键的功能无法可靠地被程序替代。2 数据和程序的强耦合数据库只能被一个程序使用,要支持多个程序,并且保证数据完整性,a) 要么重复逻辑每个程序自己控制数据的一致性,显然是很糟糕的。b) 要么通过共同的接口访问数据库这是比较流行的一种方法。3层架构,SOA,...我不敢说这些架构都是错误的,他们都有特定的用途。但是你要明白,一个系统越复杂,零件越多,出错的可能性就越大,而且性能也越差。总而言之,如果你认为数据正确性是必须要保证的,那么你就必须付出一定的代价来实现。用外键比用程序控制更可靠,同时更简单直接,减轻了程序的负担。DBMS有40年的历史,是顶尖的程序员用C/C++开发出来的,经过重重测试,被无数项目用到,其可靠性和性能已经接近最优状态了。你如果觉得你们项目里的程序员能做得更好,对事务、并发等技术都无比熟悉,又有充足的时间,那你们可以用程序控制。老实说,我接触的项目很多都是不用外键约束的,很多都是不考虑规范化设计的。这样的系统很复杂(没必要这么复杂),性能不好。这是我的切身体会。当然,所有事情都不能一概而论,不用外键的程序也能做得很好,卖得很好。当你做决定时,要想清楚后果。我个人倾向于经典的方法,可靠的方法。

蛮大人123 2019-12-02 01:46:42 0 浏览量 回答数 0

回答

Java异常是一个非常重要的Java基础设施,很多业务系统依赖异常来做流程控制,不管是不是理想的设计,但是很有效果,根据我的经验,为这些问题来给一些输入。1 有没有合适的封装?一般公司会结合自己业务系统的错误码结合来设计异常,每个异常的实例会包含一个错误码,错误码和异常之间可以互相转换。2 对于catch异常return null这样做有什么弊端。这种做法不好,异常不要吃掉,要不处理掉,要不抛出。3 比如io异常要怎么处理。可以优先考虑临时问题重试,或者对IO问题进行描述,影响范围等进行抛出。4 怎么同时代码简洁程度和程序的健壮度。代码其实不怕多,只要合理、清晰就可以,异常处理其实就是为了逻辑处理的代码保持简洁,试想一下没有异常的语言,如果深层次返回一个错误,需要层层退出,效果是很繁琐的。提出这个几个开放的问题,希望得到大牛的回答。工作中遇到太多异常处理不好埋坑的同事,有时都不知道是自己太强人所难还是他们水平太低。

智扬 2019-12-02 01:55:08 0 浏览量 回答数 0

回答

问题一回答:楼主可以搜索下,在任何C语言中从来没有哪一种标准是鼓励没有返回值的函数的,也就是void main(),甚至一些国外程序大神是严厉抨击这种void返回类型。 所以在gcc 编译下,无论哪一种标准都是c99,ansi,要么产生错误,要么产生警告。`//filename a.cvoid main(){}`gcc a.c 的输出信息为a.c:7:1:warning: return type of 'main' is not 'int' [-Wmain-return-type] void main(int argc, const char *argv[]) gcc -ansi a.c` a.c:7:1: error: 'main' must return 'int' void main(int argc, const char *argv[])楼主可以看到在ansi标准中对于void返回值直接返回了错误,连编译都通不过。至于楼主的疑问应该是来源于微软的vc++,该ide中集成的编译器,已经不是原声的符合标准的c编译器,微软自己做了很多改动,这个你可以网上搜索下。问题二:至于exit 则是用来标识应用程序执行状态的,如果直接return 只能说程序执行成功或者不成功,程序中的分支判断则无线显示,exit退出吗只是用来标识应用程序到底是以何种状态的,因为应用程序都是要被操作系统加载的,操作系统通过返回码来了解进程的执行细节,这也就是前面的为什么不鼓励用void作为返回.

51干警网 2019-12-02 01:34:27 0 浏览量 回答数 0

问题

为什么我加载动态链接库失败了,路径绝对没有错错

a123456678 2019-12-01 20:28:44 1036 浏览量 回答数 1

问题

为什么主机空间上不去,临时域名登录

laluna 2019-12-01 20:11:44 1687 浏览量 回答数 2

问题

Android API兼容性指南

mqc 2019-12-01 21:00:01 2106 浏览量 回答数 0

回答

API(Application Programming Interface,应用程序编程接口)是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么. 这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法. 这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数. 。同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click). API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...). API 声明 正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer. 要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法. 你将会遇到一些问题: 假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用. 在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行. API 分为四种类型: 远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。 标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。 文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。 信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。 当前应用于 API 的标准包括 ANSI 标准 SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些 API 以不同的格式连接数据(如共享数据缓存器、数据库结构、文件框架)。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的 API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种 API 只处理一种信息格式,所以该情形下的信息交付 API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付 API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付 API 类型是比较理想的选择。 API 与图形用户接口(GUI)或命令接口有着鲜明的差别: API 接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。 有时公司会将 API 作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式 API。 da'an'lai'yu'na'w'n答案来源网络,供您参考

问问小秘 2019-12-02 02:13:03 0 浏览量 回答数 0

问题

【算法】五分钟算法小知识:Linux的进程、线程、文件描述符是什么?

游客ih62co2qqq5ww 2020-05-09 11:28:57 0 浏览量 回答数 0

问题

10+年程序员总结的20+条经验教训

雅蕾 2019-12-01 21:56:26 7714 浏览量 回答数 0

回答

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

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

问题

[精品问答]Java一百问第一期

问问小秘 2019-12-01 21:51:20 791 浏览量 回答数 1

问题

Windows Phone 7 - 如何退出程序:报错

kun坤 2020-06-20 11:52:16 1 浏览量 回答数 1

回答

栈内存一般而言由系统的约束和配置决定,一般来说默认的在1-8M每进程不等。linux和macosx一般可以用ulimit命令调节,但一般仍会受到操作系统的“硬限制”而不能想调多大调多大。 关于系统栈: 系统栈的目的,在于跟踪和追溯函数调用的历史。这里的函数尤其指每个函数都有功能上的意义,即打印出系统栈就能表示出程序有意义的功能分块。使用栈内存做算法,不是不好,不过和系统栈的惯例用法毕竟稍微有一点偏差。层级很深,但每个层级都很类似(单独提取出来,无甚分析价值)的深层搜索,无论是为了防止炸栈,还是为了保持调用栈的简洁可分析,都应当自己建立用户栈。关于栈内存: 栈内存整批进、整批退,不存在碎片和管理问题,性能优于堆内存。但相应的代价就是: 其一,比较少,寸土寸金;其二,函数结束(退栈)之后,栈顶退回函数执行前的位置,则函数中所有局部变量所在的栈内存落在栈外自然销毁。(重要)因此函数内的局部变量,只应当表示函数内部执行到了什么状态,绝对不能用作实质性的数据区域。例如:应当用局部变量表示缓冲区的下标、指针,但缓冲区本身绝对不应该开在栈上。数据区域要么从堆上分配获得指针,要么通过参数传递得到指针。事实上这里用全局变量也不是唯一的选择(至少全局变量在语义上还是不太好看)。也可以使用malloc()来做,获取按需分配内存的灵活性,不必事前规定一个“足够大的范围”: int n, i;int a, p;scanf("%d", &n);a = malloc(sizeof(int) * n);p = a;for (i=0; i{ scanf("%d", p++); }题外话——“局部变量所在的栈内存区域自然销毁”这件事,坑死多少C程序员。这里不详细展开,但请一定小心不要撞这个常识性的错误,即:不要把任何局部变量的地址用return返回给调用者。

a123456678 2019-12-02 02:39:20 0 浏览量 回答数 0

回答

默认情况下,所有用户定义的异常都应继承自Exception。在文档中建议这样做: 异常异常 所有内置的,非系统退出的异常都派生自此类。*所有用户定义的异常也应从此类派生。 PEP 8也建议并鼓励这样做: 从Exception而不是BaseException派生异常。从BaseException的直接继承是为异常保留的,在这些异常中捕获异常几乎总是错误的事情。 *通常,由Exception派生的异常应由常规代码处理。相反,直接从BaseException派生的异常与特殊情况相关。像正常异常一样处理它们会导致意外行为。这就是为什么惯用的“全部捕获”处理程序仅处理Exception的原因: def retry(func): while True: try: return func() except Exception as err: print(f"retrying after {type(err)}: {err}") 直接从BaseException继承的内置异常是KeyboardInterrupt,SystemExit和GeneratorExit,它们与程序,线程或生成器/协程的关闭相关。错误地处理它们会阻止正常关机。 注意,虽然默认值应该是继承自Exception,但是如果有充分的理由可以继承自BaseException。例如,asyncio.CancelledError也继承自BaseException,因为它表示asyncio线程等效项Task的关闭。 回答来源:stackoverflow

is大龙 2020-03-24 21:54:48 0 浏览量 回答数 0

回答

Re3M的带宽1.5WIP就扛不住了? 不知道楼主是什么类型的网站,正常来说,1.5wIP,6WPV,保守估计每个月至少能有1万的收入。这种情况下,还不麻麻利利的上标准A服务器? 如果等到因为带宽不够造成流量下降,你就后悔都来不及了。 ------------------------- 回39楼publichtml的帖子 换apache php? 按照你目前的情况看,你现在用nginx phpcgi顶多负载高点,网站还能访问。换成apache php直接把网站搞趴下,呵呵 ------------------------- 回44楼ap6214f2r的帖子 php-cgi如果不稳定,就找不出更稳定的了。 nginx做前端,apache php做后端那是多此一举啊,相当于跑了两个webserver。 apache php的性能远远不及nginx phpcgi,这个无论是从我的实际使用,还是网上大量的事实都已经证明的了。可以在网上搜一下。 当访问量过大时,nginx phpcgi最多给你返回504错误,但apache php可以把你的服务器搞宕机。 ------------------------- 回46楼ap6214f2r的帖子 我九年前和你一样坚信modphp比phpcgi强,经过近五年的实际体会,早就抛弃apache。 你那篇文章首先是phpfpm的,这个本身不如phpcgi,其次文章里已经证明了nginx phpfpm的性能大于apache和modphp。至于说的稳定性,phpcgi是可以优化的。 那篇文章只是测试,并不代表真实环境,大家尽可以自己实际使用对比,选出自己合适的架构。 ------------------------- 回49楼ap6214f2r的帖子 soso和sogou我建议允许。百度流量并不好做,soso和sogou有时会给你带来惊喜的。我有一个网站,soso长期带来每天5000的ip ------------------------- 回49楼ap6214f2r的帖子 阿里的rds实在不敢恭维,我一个3g多的数据库sql文件用了五个多小时愣是导不完,在云服务器上十分钟就导完了,而且rds比较贵,同样的钱不如买个云服务器单独放数据库了。反正阿里云提供七天的备份,也不用担心自己建的数据库坏掉 ------------------------- 回58楼ap6214f2r的帖子 呵呵,你这就是在跟我钻牛角尖了。如果你扯到订单/银行这样的系统,PHP本身就不适合做这样的系统。做这样的系统,不光是采用了nginx要考虑出现50x错误,你采用了apache架构也得考虑啊。 nginx phpcgi方式通常是不会出现503错误的,一般出现的是502或者504错误。如果出现502或者504,那恰恰说明需要优化了。包括nginx的参数,php程序,mysql都可能需要优化。优化的好的话是不会经常出现50x错误。我的网站在每日20万IP访问的时候都没出现过50x错误。 如果你说会出现50x错误,那你觉得是出现50x错误严重,还是整个服务器都不能访问了宕机了严重? 这个问题就不再讨论了。你坚持你的观点没有关系。我坚持我的nginx phpcgi也没问题。至少我不是做订单/银行的系统,至少我不希望服务器成天宕机,呵呵。

xinpule 2019-12-01 23:16:34 0 浏览量 回答数 0

问题

阿里云上安装oracle遇到Check if the DISPLAY variable is set怎么解决?

哪怕去追逐 2019-12-01 22:05:18 2109 浏览量 回答数 0

问题

性能测试:软件测试的重中之重

云效平台 2019-12-01 21:45:09 5839 浏览量 回答数 1

问题

从镜像系统想到的

爱斑斓 2019-12-01 21:41:52 4928 浏览量 回答数 2

问题

【教程免费下载】大数据系统构建

玄学酱 2019-12-01 22:07:49 995 浏览量 回答数 1

问题

为什么SSH 登录时出现如下错误:Maximum amount of failed attempts was reached

boxti 2019-12-01 21:59:27 1705 浏览量 回答数 0

问题

【春招必备】初级程序员必备Linux面试题

黄一刀 2020-03-12 19:15:24 7685 浏览量 回答数 3

问题

如何定位Android NDK开发中遇到的错误?报错

爱吃鱼的程序员 2020-06-14 18:55:10 0 浏览量 回答数 1

问题

mysql并发的问题,能不能有办法避免sql出错的情况,数据的完整性怎才能做到……?

a123456678 2019-12-01 20:16:25 1534 浏览量 回答数 2

回答

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

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

问题

Web测试方法

技术小菜鸟 2019-12-01 21:41:32 7022 浏览量 回答数 1

回答

服务器常被攻击表明很可能存在安全漏洞,建议及时查找漏洞,安装补丁、升级系统,并做好服务器的日常防护。 1.设置复杂密码 不要小看密码设置,其对于保持在线安全和保护数据至关重要。创建复杂的云服务密码,字符越多,电脑就越难猜出。特殊字符、数字和字母的随机组合要比姓名或生日更强。 2.杀毒和高防应用 为服务器建立多道防线,杀毒程序通常可以在病毒感染电脑前识别并清除掉。专业的高防服务是应对攻击的最好办法,推荐西部数码的ddos高防,可有效防御各类ddos攻击。 3.保持备份和更新 保持应用程序更新到最新版。如果网站是基于WordPress的,建议把不使用的插件卸载或完全删除,而不只是禁用。在更新之前备份重要数据。另外,仔细检查文件权限,谁有何种级别的权限。 4.部署SSL证书 网站最好使用SSL证书。超过一半以上的网站已经加密了,不要落下。在网页上如需提交敏感信息,优先检查网站域名前是否是https。浏览器会在这种链接前显示一个绿色锁图标。 5.数据库避免敏感信息 存在数据库里的身份证和银行卡信息是易受攻击和盗取的目标。所以,建议不要把此类信息存储在数据库中。 服务器安全这问题,很重要,之前服务器被黑,管理员账号也被篡改,远程端口也登陆不了了。,在网上搜索了一些服务器安全设置以及防黑的文章,对着文章,我一个一个的设置起来,费了好几天的时间才设置完,原以为会防止服务器再次被黑,没想到服务器竟然瘫痪了,网站都打不开了,无奈对服务器安全也是一窍不通,损失真的很大,数据库都损坏了,我哪个后悔啊。娘个咪的。最后还是让机房把系统重装了。找了几个做网站服务器方面的朋友,咨询了关于服务器被黑的解决办法,他们建议找国内最有名的服务器安全的安全公司来给做安全维护,找了sinesafe,服务器被黑的问题,才得以解决。 一路的走来,才知道,服务器安全问题可不能小看了。经历了才知道,服务器安全了给自己带来的也是长远的利益。 希望我的经历能帮到楼主,帮助别人也是在帮助我自己。 下面是一些关于安全方面的建议! 建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。 一:挂马预防措施: 1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。 2、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具! 序,只要可以上传文件的asp都要进行身份认证! 3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。 4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。 5、要尽量保持程序是最新版本。 6、不要在网页上加注后台管理程序登陆页面的链接。 7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。 8、要时常备份数据库等重要文件。 9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全! 10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。 11、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛程 二:挂马恢复措施: 1.修改帐号密码 不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。帐号 密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用 SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。 2.创建一个robots.txt Robots能够有效的防范利用搜索引擎窃取信息的骇客。 3.修改后台文件 第一步:修改后台里的验证文件的名称。 第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。 第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。 4.限制登陆后台IP 此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。 5.自定义404页面及自定义传送ASP错误信息 404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。 ASP错误嘛,可能会向不明来意者传送对方想要的信息。 6.慎重选择网站程序 注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。 7.谨慎上传漏洞 据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。 可以禁止上传或着限制上传的文件类型。不懂的话可以找专业做网站安全的sinesafe公司。 8. cookie 保护 登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。 9.目录权限 请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。 10.自我测试 如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。 11.例行维护 a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。 b.定期更改数据库的名字及管理员帐密。 c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。 如果服务器系统多了好多用户,不是被攻击。而是服务器被入侵、被黑了。服务器装完系统后,立即打补丁,并关闭不必要的服务和进程。修改服务器为复杂密码,并修改服务器的远程密码;安装服务器安全狗、网站安全狗等防护软件。 来源于网络,供您参考,如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】 希望我的回答对您有所帮助,望采纳! ~ O(∩_∩)O~

保持可爱mmm 2019-12-02 02:24:17 0 浏览量 回答数 0

问题

为什么SSH 服务启动时出现如下错误:main process exited, code=exited

boxti 2019-12-01 21:59:40 2104 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站