源码

nginx 源码学习笔记(三)——nginx精粹-模块

大兔子大兔子 提交于 2020-01-08 10:28:31
下面开始真正"nginx之旅",屏住呼吸吧! 首先找好入手点,对于nginx的入手点就是ngx_module_t结构,他的声明在src/core/ngx_conf_file.h中(我的版本nginx-1.0.13) #define NGX_MODULE_V1 0, 0, 0, 0, 0, 0, 1 #define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 struct ngx_module_s { ngx_uint_t ctx_index; ngx_uint_t index; ngx_uint_t spare0; ngx_uint_t spare1; ngx_uint_t spare2; ngx_uint_t spare3; ngx_uint_t version; void *ctx; ngx_command_t *commands; ngx_uint_t type; ngx_int_t (*init_master)(ngx_log_t *log); ngx_int_t (*init_module)(ngx_cycle_t *cycle); ngx_int_t (*init_process)(ngx_cycle_t *cycle); ngx_int_t (*init_thread)(ngx_cycle_t *cycle); void

el-upload源码修改跳坑

感情迁移 提交于 2020-01-08 10:16:17
之前给element-ui提了一个问题,结果没有鸟我,没办法,只能修改源码来满足需求了 (备注:element-ui2依然没有修改,为了迎合产品还是要改源码) 本文讨论的组件属性仅限于 list-type='picture-card' ​ 现在的问题是这样的: ​ element-ui中有一个upload组件,可以上传图片或文件。该组件有很丰富的钩子函数与配置,但是没有一个限制上传图片数量(即使是按钮禁用)的方法,于是我就自己封装了一下: <el-upload :disabled='is_max' @s='...' @r='....' ...其余配置></el-upload> export default = { props:['num'], // 限制上传数量 methods:{ on-success:function(r,f,fl){ this.is_max = true; if(this.num && this.num === fl.length){ this.is_max = false; } this.$emit('s',f,fl); }, on-remove:function(f,fl){ this.is_max = false; this.$emit('r',f); }, on-progress:function(){ this.is_max = true; } }

Linux configure 参数解释

故事扮演 提交于 2020-01-08 07:25:30
Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。      与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。      为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考   'configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'--help'选项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍: --cache-file=FILE   'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助. --help   输出帮助信息

el-upload源码跳坑2

半世苍凉 提交于 2020-01-08 06:42:11
产品又加了一个需求,要求删除图片时候弹一个提示框,如果确定就直接发请求从服务器删除图片 ​ 一开始想的比较简单,直接在on-remove的钩子函数上做弹框提示,如果取消就撤销,代码如下: <el-upload :on-remove='remove'></el-upload> remove:function(){ this.$confirm('此操作将永久删除图片, 是否继续?', '提示', { // ...若干处理代码 } } ​ 并不行,在我点下删除按钮的一瞬间,图片就消失了,接着才弹框。 ​ 跑去看源码,才发现里面的逻辑是这样的: <!-- upload-list.vue --> <span v-if="!disabled" class="el-upload-list__item-delete" @click="$emit('remove', file)"></span> <!-- index.vue --> <UploadList ... on-remove={this.handleRemove}</UploadList> handleRemove(file, raw) { if (raw) { file = this.getFile(raw); } this.abort(file); let fileList = this.uploadFiles; //

Service启动流程

爷,独闯天下 提交于 2020-01-08 06:18:00
Service启动流程从整个宏观上来看,它的模型如下 startService启动流程时序图 Activity中使用的startService方法是定义在Context的抽象类中,它的真正实现者是ContextImpl,所以我们首先进入ContextImpl类 (1)ContextImpl.startService() frameworks/base/core/java/android/app/ContextImpl.java @Override public ComponentName startService(Intent service) { warnIfCallingFromSystemProcess(); return startServiceCommon(service, mUser); } private ComponentName startServiceCommon(Intent service, UserHandle user) { try { validateServiceIntent(service); service.prepareToLeaveProcess(); ComponentName cn = ActivityManagerNative.getDefault().startService( mMainThread

Linux configure 参数解释

て烟熏妆下的殇ゞ 提交于 2020-01-08 05:04:24
  Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。   与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。  为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考 'configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'--help'选 项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的 存在是很有益处的.下面对每一个选项进行简略的介绍: --cache-file=FILE   'configure'会在你的系 统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助. --help   输出帮助信息

使用Hudson进行持续集成

ぃ、小莉子 提交于 2020-01-08 04:01:54
持续集成就是快速且高频率地自动构建项目的所有源码,并为项目成员提供丰富的反馈信息。 一次完整的集成往往会包括以下6个步骤:   持续编译:所有正式的源代码都应该提交到源码控制系统中,持续集成服务器按一定频率检查源码控制系统,如有新的代码,就出发一次集成,旧的已编译的字节码应当全部清除,然后服务器编译所有最新的源码   持续数据库集成:在很多项目中,源代码不仅仅值Java代码,还包括了数据库SQL脚本。每次发现新的SQL脚本。就应该清理集成环境的数据库,重新创建表结构,并填入预备的数据   持续测试:单元测试和集成测试都应该在每次集成的时候运行,并且在发生问题的时候能产生具体报告   持续审查:持续集成可以使用Checkstyle和PMD之类的工具来生成个类报告,当审查发现问题时,可以给开发人员反馈警告信息   持续部署   持续反馈:将集成失败报告发送给这次集成相关的代码提交者,项目经理应该受到所有失败报告 持续集成的好处:尽早暴露问题;减少重复操作;简化项目发布;建立团队信心 在创建Hudson持续集成任务之前,用户需要对Hudson系统做一些基本的配置,包括JDK安装位置和Maven安装等在内的重要信息都不必须首先配置正确。 对于一般的Maven项目,可选择的类型有Build a free-style software project和Build a maven2

【原创】够强!一行代码就修复了我提的Dubbo的Bug。

£可爱£侵袭症+ 提交于 2020-01-08 00:01:19
这是 why 技术的第 28 篇原创文章 之前在 《Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?》中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug。 对于解决方案我是这样写的: 特别简单,把获取identityHashCode的方法从System.identityHashCode(invokers)修改为invokers.hashCode()即可。此方案是我提的issue里面的评论,这里System.identityHashCode和 hashCode之间的联系和区别就不进行展开讲述了,不清楚的大家可以自行了解一下。 我说: 这里 System.identityHashCode 和 hashCode 之间的联系和区别就不进行展开讲述了,不清楚的大家可以自行了解一下。 但是有读者在后台问我详细原因,我已经和他聊清楚了。 再加上这个 BUG 已于近期修复了,且只用了一行代码就修复了 ,那我就写一下解决方案,以及背后的原理。 即是对之前文章的一个补充,也是一个独立的知识点。 所以本文主要是回答下面这三个问题: 1.什么是 System.identityHashCode? 2.什么是 hashCode? 3.为什么一行代码就修复了这个 BUG? 注:本文 Dubbo 源码 2.7.4.1 版本。如果阅读过 《Dubbo 一致性哈希负载均衡的源码和 Bug

java中LinkedList源码分析

99封情书 提交于 2020-01-07 23:49:09
ArrayList是动态数组,其实本质就是对数组的操作。 那么LinkedList实现原理和ArrayList是完全不一样的。 现在就来分析一下ArrayList和LinkeList的优劣吧 LinkedList是一个双向链表,每个元素都是一个Node对象, 这个node对象里面有三个成员: E item;指向实际的元素 Node<E> next;指向下一个节点 Node<E> prev;指向前一个结点 利用idea编辑器查看LinkedList的结构,发现只有三个成员变量。 而所有的public方法操作的都是这个三个变量。 下面逐个分析方法。 主要就是调用了linkLast方法。 步骤如下: 第一步:l指向尾节点, 第二步:创建新的节点newNode;因为是在链表的最后添加元素,所以新节点的next元素为null. 第三步:尾节点指向新的节点 第四步:如果l(之前的尾节点)为空,新节点当作第一个节点 第五步:如果l(之前的尾节点)不为空,则之前的尾节点的next变量指向新节点。 链表大小size++; 修改的次数modCount++; List<String> list=new LinkedList<>(); list.add("a"); list.add("b"); 与ArrayList不同,LinkedList内存是按需分配的,不需要提前分配内存空间,因为操作的不是数组。

Scrapy源码 Response对象

孤街醉人 提交于 2020-01-07 23:47:37
Scrapy源码 Response对象 """This module implements the Response class which is used to represent HTTPresponses in Scrapy.See documentation in docs/topics/request-response.rst"""from six.moves.urllib.parse import urljoinfrom scrapy.http.request import Requestfrom scrapy.http.headers import Headersfrom scrapy.link import Linkfrom scrapy.utils.trackref import object_reffrom scrapy.http.common import obsolete_setterfrom scrapy.exceptions import NotSupportedclass Response(object_ref): def __init__(self, url, status=200, headers=None, body=b'', flags=None, request=None): self.headers = Headers(headers or