首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏CodecWang

    Polyfill 和 Shim

    Shim 和 Polyfill 常出现的一个术语是 ShimShim 单词的意思是垫片,相当于在 API 和调用者之间加了一层。 理解了这个例子再来看维基百科 上的定义就容易多了: A shim is a library that transparently intercepts API calls and changes the Shim 通常是一个代码库,它能够"透明地"拦截 API 请求并修改参数,自行处理操作或者重定向。 总结:Shim 可以封装自己的 API,概念比 Polyfill 大一点,两者并不冲突。 有人也从两个单词的"软/硬"含义理解:Polyfill 填充你感受不到它的存在,而 Shim 填充则能明显地感知到。 使用场景 前面的例子是偏向解决 IE 兼容问题。

    1.2K30编辑于 2021-12-07
  • 来自专栏CodecWang

    Polyfill 和 Shim

    Shim​ 和 Polyfill 常出现的一个术语是 ShimShim 单词的意思是垫片,相当于在 API 和调用者之间加了一层。 理解了这个例子再来看维基百科 上的定义就容易多了: A shim is a library that transparently intercepts API calls and changes the Shim 通常是一个代码库,它能够"透明地"拦截 API 请求并修改参数,自行处理操作或者重定向。 总结:Shim 可以封装自己的 API,概念比 Polyfill 大一点,两者并不冲突。 有人也从两个单词的"软/硬"含义理解:Polyfill 填充你感受不到它的存在,而 Shim 填充则能明显地感知到。 使用场景​ 前面的例子是偏向解决 IE 兼容问题。

    48230编辑于 2023-11-17
  • 来自专栏FreeBuf

    详解Windows Shim的攻防利用

    这就要用到本文的主角:ShimShim的本意是垫圈或垫片。理论上说,任何的计算机问题都可以新增一层逻辑来解决。Shim也是这么一个垫在应用程序和windowsAPI之间的逻辑层。 利用Shim的攻击 除了微软自带的Shim数据库以外,用户还可以给任意程序自定义Shim修复方式。这在提高兼容性的同时也引入了一些安全隐患。 因为“InjectDLL”是自定义的Shim,而沙盒上没有设置同样的Shim。 利用shim 缓存进行取证 每次执行应用程序,系统都要根据Shim数据库来检查该应用程序是否需要被Shim。而Shim数据库里有5000+记录,每次都比对会使效率变得很低。 Shim缓存使用了LRU(Leastfrequently used 最近最少使用)淘汰算法,因此最近执行过的程序会出现在Shim缓存里, 下一次运行该程序的时候就不需要比对Shim数据库。

    3.1K70发布于 2018-02-08
  • 来自专栏运维开发故事

    CRI shim:kubelet怎么与runtime交互(一)

    CRI shim是什么? 计算机科学领域的任何问题都可以通过增加一个中间层来解决,我们的 CRI shim就是加了这样一层。 并且,Streaming Server 会在 CRI shim 启动时就一起启动。此外,Stream Server 这一部分具体怎么实现,完全可以由 CRI shim 的维护者自行决定。 这就很麻烦,就意味着我有 100 种这样的 CRI ,我就要写 100 个shim去集成,而且他们的功能全部都是重复的。 所以这就产生了Containerd ShimV2的这样的shim来解决这个问题。我们下回分解。

    94630编辑于 2023-05-01
  • 来自专栏深蓝居

    HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法

    ) pb.Response { return shim.Success(nil) } func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface =nil){ return shim.Error(err.Error()) } return shim.Success([]byte("Saved Student!")) =nil{ return shim.Error("getListResult failed") } return shim.Success(students) } 5.2 富查询 =nil{ return shim.Error(err.Error()) } var result,_= getHistoryListResult(it) return shim.Success = nil { return shim.Error(err.Error()) } return shim.Success(nil) } 事件设置完毕后,需要在客户端也做相应的修改

    69020编辑于 2022-06-16
  • 来自专栏云原生实验室

    容器中的 Shim 到底是个什么鬼?

    当然,除了官方正式支持的 shim 之外,任何人都可以编写自己的 shim,并让 Containerd 调用该 shim。 客户端在创建容器时可以指定使用哪个 shim,如果不指定就使用默认的 shim。 如果你想实现自己的 shim,下面是相关参考资料: (v2) shim RPC API 的详细定义[3] 实现 shim 二进制和RPC API的辅助工具[4] shim 的使用方式[5] 你只需要实现一个接口 shim 需要重点关注的是内存使用,因为每个容器都有一个 shim 进程,随着容器数量的增加,shim 的内存使用会急剧上升。 一旦连接字符串初始化完成,shim 开始监听之后,start 命令就会返回。 containerd 使用 shim start 命令返回的连接字符串,打开一个与 shim API 的连接。

    8.8K71编辑于 2022-02-28
  • 来自专栏运维开发故事

    CRI shim:kubelet怎么与容器运行时交互(二)

    这就很麻烦,就意味着我有 100 种这样的 CRI ,我就要写 100 个shim去集成,而且他们的功能全部都是重复的。 所以这就产生了Containerd ShimV2的这样的shim来解决这个问题。 我们来看一下,最大的区别在于:在这种方式下,你可以为每一个 Pod 指定一个 Shim。 因为在最开始的时候,Containerd 是直接启动了一个 Containerd Shim 来去做响应,但我们新的 API 是这样写的,是 Containerd Shim start 或者 stop。 我的实现方式是我只在 Sandbox 时候,去创建 containerd-shim-v2,而接下来整个后面的 container 层的操作,会全部走到这个 containerd-shim-v2 里面,去重用这个

    1.1K30编辑于 2021-12-28
  • 来自专栏一个会写诗的程序员的博客

    RequireJS极简入门教程RequireJS核心功能:HOW TOmain.js使用 shim

    jsonview/jquery.jsonview', bootstrapDialog: 'plugin/bootstrap-dialog/bootstrap-dialog' }, shim 如果其中一个命名被其它库使用了,我们可以用另一个 define: 定义一个模块 使用 shim shim是将依赖中的全局变量暴露给requirejs,当作这个模块本身的引用。 requirejs.config({ baseUrl: '/public/js', paths: { hello: 'hello' }, shim: { hello: {

    2.1K30发布于 2018-08-20
  • 来自专栏Super 前端

    使用requireJS加载不符合AMD规范的js文件:shim的使用方式和实现原理

    shim属性,专门用来配置不兼容的模块。 require.config({ shim: { 'underscore':{ exports: '_'     },     'backbone': { console.log(myCustomMod.max(1, 2, 3)); }) /* myCustomMod.js */ var myCustomMod = {}; // 很重要,和shim ({ waitSeconds: 0, baseUrl: '/', paths: { myCustomMod: "myCustomMod" }, shim DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test Require Shim</title>

    2.1K51发布于 2019-08-15
  • 来自专栏sealyun

    Docker架构分析

    shim进程 shim直接调用runc的包函数,shim与containerd之前通过rpc通信 真正用户想启动的进程由runc的init进程启动,即runc init [args ...] = nil { //启动了一个shim进程 } return connectShim(socket) // 这里返回了与shim进程通信的客户端} 再去看看shim的代码: shim进程启动干的最主要的一件事就是启动一个 通信模型介绍 再看shim与runc的关系,这个比较简单了,直接进入shim service 实现的Create方法即可 1 sv = shim.New(path) 123456 func (s *Service 其本质是调用了runc create --bundle [bundle] [containerid] 命令,在此不多作介绍了 shim进程与runc进程之间 上文可知,shim进程创建runc子进程。 "containerd-shim" Name or path of shim --pprof-address

    1.9K10发布于 2019-07-26
  • 来自专栏HHTjim'S 部落格

    2025CTF-MISC-GAC

    __globals__.popitem() 剥离尾巴, 此刻 _=('remove_shim', <function _remove_shim at 0x7ff7846daf80>) 需要再回到< class '_distutils_hack.shim'> . __globals__.popitem() 剥尾 返回:_=('insert_shim', <function insert_shim at 0x7ff0a6696f80>) .__class__. __subclasses__().pop() 回到 _distutils_hack.shim .__enter__.__globals__.popitem() 剥尾 返回:shim . __globals__.popitem() 剥尾 返回: _=('add_shim', <function add_shim at 0x7ff0a6696830>) .__class__.

    18610编辑于 2025-08-27
  • 来自专栏Hyperledger实践

    Hyperledger fabric链码数据模型的探讨(1)之转账和交易

    = 3 { return shim.Error("Incorrect number of arguments. = nil { return shim.Error("Failed to get state") } if Avalbytes == nil = nil { return shim.Error("Failed to get state") } if Bvalbytes == nil = nil { return shim.Error(err.Error()) } return shim.Success(nil) } 2 (success)") return shim.Success(nil) } 相比第一个例子转账加强了些些, Marble是资产, 对应有拥有人。

    1.4K30发布于 2020-11-11
  • 来自专栏Netkiller

    Hyperledger fabric Chaincode 开发详解

    = nil { return shim.Error("Failed to delete Student from DB, key is: "+key) } return shim.Success =nil{ return shim.Error("query failed") } return shim.Success(person) } 16.8.1.7. stub.GetHistoryForKey =nil{ return shim.Error(err.Error()) } var result,_= getHistoryListResult(it) return shim.Success = nil { return shim.Error(err.Error()) } return shim.Success(nil) } func (t *SimpleChaincode ) sc.Response { return shim.Success(nil) } func (s *SmartContract) initLedger(stub shim.ChaincodeStubInterface

    5.3K130发布于 2018-03-16
  • 来自专栏Hyperledger实践

    Hyperledger Fabric私有数据

    = 0 { return shim.Error("Incorrect number of arguments. { return shim.Error("color field must be a non-empty string") } if marbleInput.Size <= 0 { return shim.Error = nil { return shim.Error(err.Error()) } // Save index entry to state. = 1 { return shim.Error("Incorrect number of arguments. = 1 { return shim.Error("Incorrect number of arguments.

    76110发布于 2020-11-11
  • 来自专栏汇智网教程

    用node.js开发Fabric链码

    Fabric官方提供了两种开发node.js链码的途径:fabric-shim和fabric-contract-api。 使用fabric-shim开发Fabric链码 fabric-shim是较底层的链码开发包,它封装了与节点通信的grpc协议。 安装方法如下: ~/fabric-shim-chaincode-demo$ npm install fabric-shim fabric-shim要求链码开发者定义一个实现两个预定义方法的类。 例如,下面的代码实现了一个最小化的node.js链码,每次调用链码都会更新acc0的状态(例如:可以使用这个状态代表账户余额): const shim = require('fabric-shim'); 例如: const shim = require('fabric-shim'); class EzChainCode {...} shim.start(new EzChaincode()); 这就是一个完整的

    1.6K30发布于 2019-03-12
  • 来自专栏Netkiller

    Hyperledger Fabric 积分代币上链方案

    shim.Success(nil) } func (s *SmartContract) transferToken(stub shim.ChaincodeStubInterface, args []string )) return shim.Success(nil) } func (s *SmartContract) mintToken(stub shim.ChaincodeStubInterface, args ) return shim.Success(nil) } func (s *SmartContract) setLock(stub shim.ChaincodeStubInterface, args return shim.Success(nil) } func (s *SmartContract) frozenAccount(stub shim.ChaincodeStubInterface, )) return shim.Success(nil) } func (s *SmartContract) balanceToken(stub shim.ChaincodeStubInterface

    7.7K141发布于 2018-03-19
  • 来自专栏Netkiller

    区块链银行应用探索(Hyperledger fabric)

    )) } return shim.Success(nil) } func (s *SmartContract) Query(stub shim.ChaincodeStubInterface) pb.Response ) return shim.Success(accountAsBytes) } func (s *SmartContract) initLedger(stub shim.ChaincodeStubInterface } return shim.Success(result) } func (s *SmartContract) mintToken(stub shim.ChaincodeStubInterface, return shim.Success(nil) } func (s *SmartContract) frozenAccount(stub shim.ChaincodeStubInterface, )) } return shim.Success(nil) } func (s *SmartContract) showAccount(stub shim.ChaincodeStubInterface

    6K240发布于 2018-03-25
  • 来自专栏亨利笔记

    Fabric基础架构原理(4):链码 | 赠书活动

    链码必须依赖 chaincode shim 包和 peer protobuf 包,它们分别用于链码的控制与数据传输,其次定义 KeyValueStore 类型,作为 chaincode shim 的载体 = 2 { return shim.Error("Incorrect arguments. = nil { return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0])) } return shim.Success = nil { return shim.Error(err.Error()) } return shim.Success([]byte(result)) } 为了完成对账本的读写 func main() { if err := shim.Start(new(KeyValueStore)); err !

    78230发布于 2019-04-12
  • 来自专栏YYDS

    智能合约DAPP系统开发代码流程部署方案

    =3{  return shim.Error("Incorrect number of arguments.Expecting 3")  }  A=args[0]  B=args[1]  //获取A、B =nil{  return shim.Error("Failed to get state")  }  if Avalbytes==nil{  return shim.Error("Entity not =nil{  return shim.Error("Failed to get state")  }  if Bvalbytes==nil{  return shim.Error("Entity not =nil{  return shim.Error(err.Error())  }  err=stub.PutState(B,[]byte(strconv.Itoa(Bval)))  if err! =nil{  return shim.Error(err.Error())  }  return shim.Success(nil)  }

    41740编辑于 2023-02-01
  • 来自专栏商业模式策划

    波场链/币安链/马蹄链DAPP智能合约系统开发详细分析及代码部署

    package main import ( "chainmaker/pb/protogo" "chainmaker/shim" ) // AgeContract save and get err := shim.Start(new(AgeContract)) if err ! shim.Error("no contarct method") } // saveAge 保存用户年龄信息 func (ac *AgeContract) saveAge(stub shim.CMStubInterface := shim.Start(new(AgeContract)) if err ! := shim.Start(new(AgeContract)) if err !

    78920编辑于 2022-12-15
领券